From 15f0f9240d1183e5c6c60006b5ff4e02d3d98ce7 Mon Sep 17 00:00:00 2001 From: joachimschmidt557 Date: Sun, 26 Dec 2021 16:40:51 +0100 Subject: stage2 codegen: Implement generateSymbol for undefined values --- src/codegen.zig | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/codegen.zig') 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, -- cgit v1.2.3