authorgravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-12-06 20:08:18+01:00
committergravatar for luuk@degram.devLuuk de Gram <luuk@degram.dev> 2022-12-12 17:41:59+01:00
logdb06eed7a3e741a319182b2e4edc889b83787962
tree2b72697f08b4ba9bdc4e2abece813b2f7b0566e8
parent63b69e2c55ae0b41915897f15636f5f6dc4689a5
signaturelock-open Commit is signed but in an unrecognized format.

codegen: implement generating vector values


1 files changed, 48 insertions(+), 0 deletions(-)

src/codegen.zig+48
...@@ -808,6 +808,54 @@ pub fn generateSymbol(...@@ -808,6 +808,54 @@ pub fn generateSymbol(
808 }808 }
809 return Result{ .appended = {} };809 return Result{ .appended = {} };
810 },810 },
811 .Vector => switch (typed_value.val.tag()) {
812 .bytes => {
813 const bytes = typed_value.val.castTag(.bytes).?.data;
814 const len = @intCast(usize, typed_value.ty.arrayLen());
815 try code.ensureUnusedCapacity(len);
816 code.appendSliceAssumeCapacity(bytes[0..len]);
817 return Result{ .appended = {} };
818 },
819 .aggregate => {
820 const elem_vals = typed_value.val.castTag(.aggregate).?.data;
821 const elem_ty = typed_value.ty.elemType();
822 const len = @intCast(usize, typed_value.ty.arrayLen());
823 for (elem_vals[0..len]) |elem_val| {
824 switch (try generateSymbol(bin_file, src_loc, .{
825 .ty = elem_ty,
826 .val = elem_val,
827 }, code, debug_output, reloc_info)) {
828 .appended => {},
829 .externally_managed => |slice| {
830 code.appendSliceAssumeCapacity(slice);
831 },
832 .fail => |em| return Result{ .fail = em },
833 }
834 }
835 return Result{ .appended = {} };
836 },
837 .repeated => {
838 const array = typed_value.val.castTag(.repeated).?.data;
839 const elem_ty = typed_value.ty.childType();
840 const len = typed_value.ty.arrayLen();
841
842 var index: u64 = 0;
843 while (index < len) : (index += 1) {
844 switch (try generateSymbol(bin_file, src_loc, .{
845 .ty = elem_ty,
846 .val = array,
847 }, code, debug_output, reloc_info)) {
848 .appended => {},
849 .externally_managed => |slice| {
850 code.appendSliceAssumeCapacity(slice);
851 },
852 .fail => |em| return Result{ .fail = em },
853 }
854 }
855 return Result{ .appended = {} };
856 },
857 else => unreachable,
858 },
811 else => |t| {859 else => |t| {
812 return Result{860 return Result{
813 .fail = try ErrorMsg.create(861 .fail = try ErrorMsg.create(