Commit 15f0f9240d

joachimschmidt557 <joachim.schmidt557@outlook.com>
2021-12-26 16:40:51
stage2 codegen: Implement generateSymbol for undefined values
1 parent 6b8e33d
Changed files (1)
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,