authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-09-30 21:29:52-04:00
committergravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-09-30 21:29:52-04:00
logb0e89ee499b8110bca6964e996c5862337147e32
tree30b4eff80cddb2ad0df43ff27da72f8fe1017a15
parent5e7406bdd9f942900dceb2f917ed5f64b6f2ba00

stage2 llvm backend: implement codegen for Value.repeated


1 files changed, 18 insertions(+), 1 deletions(-)

src/codegen/llvm.zig+18-1
......@@ -1021,6 +1021,7 @@ pub const DeclGen = struct {
10211021 else => |tag| return self.todo("implement const of pointer type '{}' ({})", .{ tv.ty, tag }),
10221022 },
10231023 .Array => {
1024 const gpa = self.gpa;
10241025 if (tv.val.castTag(.bytes)) |payload| {
10251026 const zero_sentinel = if (tv.ty.sentinel()) |sentinel| blk: {
10261027 if (sentinel.tag() == .zero) break :blk true;
......@@ -1034,7 +1035,6 @@ pub const DeclGen = struct {
10341035 );
10351036 }
10361037 if (tv.val.castTag(.array)) |payload| {
1037 const gpa = self.gpa;
10381038 const elem_ty = tv.ty.elemType();
10391039 const elem_vals = payload.data;
10401040 const sento = tv.ty.sentinel();
......@@ -1050,6 +1050,23 @@ pub const DeclGen = struct {
10501050 @intCast(c_uint, llvm_elems.len),
10511051 );
10521052 }
1053 if (tv.val.castTag(.repeated)) |payload| {
1054 const val = payload.data;
1055 const elem_ty = tv.ty.elemType();
1056 const len = tv.ty.arrayLen();
1057
1058 const llvm_elems = try gpa.alloc(*const llvm.Value, len);
1059 defer gpa.free(llvm_elems);
1060 var i: u64 = 0;
1061 while (i < len) : (i += 1) {
1062 llvm_elems[i] = try self.genTypedValue(.{ .ty = elem_ty, .val = val });
1063 }
1064 const llvm_elem_ty = try self.llvmType(elem_ty);
1065 return llvm_elem_ty.constArray(
1066 llvm_elems.ptr,
1067 @intCast(c_uint, llvm_elems.len),
1068 );
1069 }
10531070 return self.todo("handle more array values", .{});
10541071 },
10551072 .Optional => {