aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorLuuk de Gram <luuk@degram.dev>2022-12-06 20:08:18 +0100
committerLuuk de Gram <luuk@degram.dev>2022-12-12 17:41:59 +0100
commitdb06eed7a3e741a319182b2e4edc889b83787962 (patch)
tree2b72697f08b4ba9bdc4e2abece813b2f7b0566e8 /src/codegen.zig
parent63b69e2c55ae0b41915897f15636f5f6dc4689a5 (diff)
downloadzig-db06eed7a3e741a319182b2e4edc889b83787962.tar.gz
zig-db06eed7a3e741a319182b2e4edc889b83787962.zip
codegen: implement generating vector values
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 985fa8d6c5..bc50f36041 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -808,6 +808,54 @@ pub fn generateSymbol(
}
return Result{ .appended = {} };
},
+ .Vector => switch (typed_value.val.tag()) {
+ .bytes => {
+ const bytes = typed_value.val.castTag(.bytes).?.data;
+ const len = @intCast(usize, typed_value.ty.arrayLen());
+ try code.ensureUnusedCapacity(len);
+ code.appendSliceAssumeCapacity(bytes[0..len]);
+ return Result{ .appended = {} };
+ },
+ .aggregate => {
+ const elem_vals = typed_value.val.castTag(.aggregate).?.data;
+ const elem_ty = typed_value.ty.elemType();
+ const len = @intCast(usize, typed_value.ty.arrayLen());
+ for (elem_vals[0..len]) |elem_val| {
+ switch (try generateSymbol(bin_file, src_loc, .{
+ .ty = elem_ty,
+ .val = elem_val,
+ }, code, debug_output, reloc_info)) {
+ .appended => {},
+ .externally_managed => |slice| {
+ code.appendSliceAssumeCapacity(slice);
+ },
+ .fail => |em| return Result{ .fail = em },
+ }
+ }
+ return Result{ .appended = {} };
+ },
+ .repeated => {
+ const array = typed_value.val.castTag(.repeated).?.data;
+ const elem_ty = typed_value.ty.childType();
+ const len = typed_value.ty.arrayLen();
+
+ var index: u64 = 0;
+ while (index < len) : (index += 1) {
+ switch (try generateSymbol(bin_file, src_loc, .{
+ .ty = elem_ty,
+ .val = array,
+ }, code, debug_output, reloc_info)) {
+ .appended => {},
+ .externally_managed => |slice| {
+ code.appendSliceAssumeCapacity(slice);
+ },
+ .fail => |em| return Result{ .fail = em },
+ }
+ }
+ return Result{ .appended = {} };
+ },
+ else => unreachable,
+ },
else => |t| {
return Result{
.fail = try ErrorMsg.create(