aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-03-03 00:03:54 +0100
committerAndrew Kelley <andrew@ziglang.org>2022-03-02 20:04:34 -0500
commit3ec74a1cd8b868b7cebfd584dec3f20a9aa2bda6 (patch)
treec8406c16704cd4a47247618395257180cf7f3a0d /src/codegen.zig
parent1c8a86f063b65e95c2e23ceaa40843069adfdc23 (diff)
downloadzig-3ec74a1cd8b868b7cebfd584dec3f20a9aa2bda6.tar.gz
zig-3ec74a1cd8b868b7cebfd584dec3f20a9aa2bda6.zip
codegen: handle elem_ptr when lowering to memory
* x64: handle storing from-to non-stack memory
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index f0cf8da3b3..265c205f2f 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -392,6 +392,30 @@ pub fn generateSymbol(
},
}
},
+ .elem_ptr => {
+ const elem_ptr = typed_value.val.castTag(.elem_ptr).?.data;
+ const elem_size = typed_value.ty.childType().abiSize(target);
+ const addend = @intCast(u32, elem_ptr.index * elem_size);
+ const array_ptr = elem_ptr.array_ptr;
+
+ switch (array_ptr.tag()) {
+ .decl_ref => {
+ const decl = array_ptr.castTag(.decl_ref).?.data;
+ return lowerDeclRef(bin_file, src_loc, typed_value, decl, code, debug_output, .{
+ .parent_atom_index = reloc_info.parent_atom_index,
+ .addend = (reloc_info.addend orelse 0) + addend,
+ });
+ },
+ else => return Result{
+ .fail = try ErrorMsg.create(
+ bin_file.allocator,
+ src_loc,
+ "TODO implement generateSymbol for pointer type value: '{s}'",
+ .{@tagName(typed_value.val.tag())},
+ ),
+ },
+ }
+ },
else => return Result{
.fail = try ErrorMsg.create(
bin_file.allocator,