diff options
| author | Luuk de Gram <luuk@degram.dev> | 2022-12-06 20:08:18 +0100 |
|---|---|---|
| committer | Luuk de Gram <luuk@degram.dev> | 2022-12-12 17:41:59 +0100 |
| commit | db06eed7a3e741a319182b2e4edc889b83787962 (patch) | |
| tree | 2b72697f08b4ba9bdc4e2abece813b2f7b0566e8 /src/codegen.zig | |
| parent | 63b69e2c55ae0b41915897f15636f5f6dc4689a5 (diff) | |
| download | zig-db06eed7a3e741a319182b2e4edc889b83787962.tar.gz zig-db06eed7a3e741a319182b2e4edc889b83787962.zip | |
codegen: implement generating vector values
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 48 |
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( |
