diff options
| author | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2021-12-26 16:40:51 +0100 |
|---|---|---|
| committer | joachimschmidt557 <joachim.schmidt557@outlook.com> | 2021-12-26 16:40:51 +0100 |
| commit | 15f0f9240d1183e5c6c60006b5ff4e02d3d98ce7 (patch) | |
| tree | 4ddd16f7e7690f18b4fef2d35a6067bf54d3d8db /src/codegen.zig | |
| parent | 6b8e33d14c92229b1632c481906d7d698c584000 (diff) | |
| download | zig-15f0f9240d1183e5c6c60006b5ff4e02d3d98ce7.tar.gz zig-15f0f9240d1183e5c6c60006b5ff4e02d3d98ce7.zip | |
stage2 codegen: Implement generateSymbol for undefined values
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 6dc00b4a71..d734194699 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -150,6 +150,13 @@ pub fn generateSymbol( const tracy = trace(@src()); defer tracy.end(); + if (typed_value.val.isUndefDeep()) { + const target = bin_file.options.target; + const abi_size = try math.cast(usize, typed_value.ty.abiSize(target)); + try code.appendNTimes(0xaa, abi_size); + return Result{ .appended = {} }; + } + switch (typed_value.ty.zigTypeTag()) { .Fn => { return Result{ @@ -193,6 +200,38 @@ pub fn generateSymbol( }, .Pointer => switch (typed_value.ty.ptrSize()) { .Slice => { + // TODO populate .debug_info for the slice + + // generate ptr + var buf: Type.SlicePtrFieldTypeBuffer = undefined; + const slice_ptr_field_type = typed_value.ty.slicePtrFieldType(&buf); + switch (try generateSymbol(bin_file, src_loc, .{ + .ty = slice_ptr_field_type, + .val = typed_value.val.slicePtr(), + }, code, debug_output)) { + .appended => {}, + .externally_managed => |slice| { + code.appendSliceAssumeCapacity(slice); + }, + .fail => |em| return Result{ .fail = em }, + } + + // generate length + var int_buffer: Value.Payload.U64 = .{ + .base = .{ .tag = .int_u64 }, + .data = typed_value.val.sliceLen(), + }; + switch (try generateSymbol(bin_file, src_loc, .{ + .ty = Type.initTag(.usize), + .val = Value.initPayload(&int_buffer.base), + }, code, debug_output)) { + .appended => {}, + .externally_managed => |slice| { + code.appendSliceAssumeCapacity(slice); + }, + .fail => |em| return Result{ .fail = em }, + } + return Result{ .fail = try ErrorMsg.create( bin_file.allocator, |
