aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-09-30 21:41:36 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-10-03 12:12:51 -0700
commit0483b4a5126c0d07b1e9ad298729e8d34b5d2272 (patch)
treee1db1a4302556a4f7c25695ee81b90d8882ea2aa /src/codegen.zig
parentc4b0b7a30bf96590f9849f64a3d86fe2ebbc6a26 (diff)
downloadzig-0483b4a5126c0d07b1e9ad298729e8d34b5d2272.tar.gz
zig-0483b4a5126c0d07b1e9ad298729e8d34b5d2272.zip
link: stub out getAnonDeclVAddr
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig53
1 files changed, 40 insertions, 13 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index ecbc05b1cc..f2eff7806a 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -643,19 +643,9 @@ fn lowerParentPtr(
const ptr = mod.intern_pool.indexToKey(parent_ptr).ptr;
assert(ptr.len == .none);
return switch (ptr.addr) {
- .decl, .mut_decl => try lowerDeclRef(
- bin_file,
- src_loc,
- switch (ptr.addr) {
- .decl => |decl| decl,
- .mut_decl => |mut_decl| mut_decl.decl,
- else => unreachable,
- },
- code,
- debug_output,
- reloc_info,
- ),
- .anon_decl => @panic("TODO"),
+ .decl => |decl| try lowerDeclRef(bin_file, src_loc, decl, code, debug_output, reloc_info),
+ .mut_decl => |md| try lowerDeclRef(bin_file, src_loc, md.decl, code, debug_output, reloc_info),
+ .anon_decl => |ad| try lowerAnonDeclRef(bin_file, src_loc, ad, code, debug_output, reloc_info),
.int => |int| try generateSymbol(bin_file, src_loc, .{
.ty = Type.usize,
.val = int.toValue(),
@@ -741,6 +731,43 @@ const RelocInfo = struct {
}
};
+fn lowerAnonDeclRef(
+ bin_file: *link.File,
+ src_loc: Module.SrcLoc,
+ decl_val: InternPool.Index,
+ code: *std.ArrayList(u8),
+ debug_output: DebugInfoOutput,
+ reloc_info: RelocInfo,
+) CodeGenError!Result {
+ _ = src_loc;
+ _ = debug_output;
+ const target = bin_file.options.target;
+ const mod = bin_file.options.module.?;
+
+ const ptr_width_bytes = @divExact(target.ptrBitWidth(), 8);
+ const decl_ty = mod.intern_pool.typeOf(decl_val).toType();
+ const is_fn_body = decl_ty.zigTypeTag(mod) == .Fn;
+ if (!is_fn_body and !decl_ty.hasRuntimeBits(mod)) {
+ try code.appendNTimes(0xaa, ptr_width_bytes);
+ return Result.ok;
+ }
+
+ const vaddr = try bin_file.getAnonDeclVAddr(decl_val, .{
+ .parent_atom_index = reloc_info.parent_atom_index,
+ .offset = code.items.len,
+ .addend = reloc_info.addend orelse 0,
+ });
+ const endian = target.cpu.arch.endian();
+ switch (ptr_width_bytes) {
+ 2 => mem.writeInt(u16, try code.addManyAsArray(2), @intCast(vaddr), endian),
+ 4 => mem.writeInt(u32, try code.addManyAsArray(4), @intCast(vaddr), endian),
+ 8 => mem.writeInt(u64, try code.addManyAsArray(8), vaddr, endian),
+ else => unreachable,
+ }
+
+ return Result.ok;
+}
+
fn lowerDeclRef(
bin_file: *link.File,
src_loc: Module.SrcLoc,