aboutsummaryrefslogtreecommitdiff
path: root/src/link/Coff.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-03-01 22:03:18 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-03-01 22:03:18 +0100
commite8eb9778cccd2f2d23027d9e0d73d7053bf92efe (patch)
treea658c7381f29593222e059ad541d006afd9e310c /src/link/Coff.zig
parent543bee0adf2d3b036654fa0983c16ff7023f504c (diff)
downloadzig-e8eb9778cccd2f2d23027d9e0d73d7053bf92efe.tar.gz
zig-e8eb9778cccd2f2d23027d9e0d73d7053bf92efe.zip
codegen: lower field_ptr to memory across linking backends
This requires generating an addend for the target relocation as the field pointer might point at a field inner to the container.
Diffstat (limited to 'src/link/Coff.zig')
-rw-r--r--src/link/Coff.zig11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/link/Coff.zig b/src/link/Coff.zig
index 3ee34682e9..3293cf2dfc 100644
--- a/src/link/Coff.zig
+++ b/src/link/Coff.zig
@@ -724,10 +724,12 @@ pub fn updateDecl(self: *Coff, module: *Module, decl: *Module.Decl) !void {
var code_buffer = std.ArrayList(u8).init(self.base.allocator);
defer code_buffer.deinit();
- const res = try codegen.generateSymbol(&self.base, 0, decl.srcLoc(), .{
+ const res = try codegen.generateSymbol(&self.base, decl.srcLoc(), .{
.ty = decl.ty,
.val = decl.val,
- }, &code_buffer, .none);
+ }, &code_buffer, .none, .{
+ .parent_atom_index = 0,
+ });
const code = switch (res) {
.externally_managed => |x| x,
.appended => code_buffer.items,
@@ -1463,9 +1465,8 @@ fn findLib(self: *Coff, arena: Allocator, name: []const u8) !?[]const u8 {
return null;
}
-pub fn getDeclVAddr(self: *Coff, decl: *const Module.Decl, parent_atom_index: u32, offset: u64) !u64 {
- _ = parent_atom_index;
- _ = offset;
+pub fn getDeclVAddr(self: *Coff, decl: *const Module.Decl, reloc_info: link.File.RelocInfo) !u64 {
+ _ = reloc_info;
assert(self.llvm_object == null);
return self.text_section_virtual_address + decl.link.coff.text_offset;
}