stage2 codegen: Implement generateSymbol for undefined values

This commit is contained in:
joachimschmidt557 2021-12-26 16:40:51 +01:00
parent 6b8e33d14c
commit 15f0f9240d
No known key found for this signature in database
GPG Key ID: E0B575BE2884ACC5

View File

@ -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,