aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorjoachimschmidt557 <joachim.schmidt557@outlook.com>2021-12-26 16:40:51 +0100
committerjoachimschmidt557 <joachim.schmidt557@outlook.com>2021-12-26 16:40:51 +0100
commit15f0f9240d1183e5c6c60006b5ff4e02d3d98ce7 (patch)
tree4ddd16f7e7690f18b4fef2d35a6067bf54d3d8db /src/codegen.zig
parent6b8e33d14c92229b1632c481906d7d698c584000 (diff)
downloadzig-15f0f9240d1183e5c6c60006b5ff4e02d3d98ce7.tar.gz
zig-15f0f9240d1183e5c6c60006b5ff4e02d3d98ce7.zip
stage2 codegen: Implement generateSymbol for undefined values
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig39
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,