diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-15 10:05:41 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2024-08-15 10:05:41 +0200 |
| commit | 8a0cb7002e6b8f7b50fdf7ee40311ce93fbef009 (patch) | |
| tree | a3a0aa5bdd1c02cb4b8193000f1c3b1b9c6f1ae5 /src | |
| parent | 2e8351cc9e30c28a9415821ed99d664b76eb2062 (diff) | |
| download | zig-8a0cb7002e6b8f7b50fdf7ee40311ce93fbef009.tar.gz zig-8a0cb7002e6b8f7b50fdf7ee40311ce93fbef009.zip | |
elf: introduce Symbol.flags.is_extern_ptr for refs potentially needing GOT
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/x86_64/Emit.zig | 4 | ||||
| -rw-r--r-- | src/codegen.zig | 3 | ||||
| -rw-r--r-- | src/link/Elf/Symbol.zig | 12 | ||||
| -rw-r--r-- | src/link/Elf/ZigObject.zig | 3 |
4 files changed, 11 insertions, 11 deletions
diff --git a/src/arch/x86_64/Emit.zig b/src/arch/x86_64/Emit.zig index b7d0a29c2d..fd1389eb3b 100644 --- a/src/arch/x86_64/Emit.zig +++ b/src/arch/x86_64/Emit.zig @@ -114,7 +114,7 @@ pub fn emitMir(emit: *Emit) Error!void { const atom = zo.symbol(data.atom_index).atom(elf_file).?; const sym = zo.symbol(data.sym_index); if (emit.lower.pic) { - const r_type: u32 = if (sym.flags.needs_got) + const r_type: u32 = if (sym.flags.is_extern_ptr) @intFromEnum(std.elf.R_X86_64.GOTPCREL) else @intFromEnum(std.elf.R_X86_64.PC32); @@ -124,7 +124,7 @@ pub fn emitMir(emit: *Emit) Error!void { .r_addend = -4, }); } else { - const r_type: u32 = if (sym.flags.needs_got) + const r_type: u32 = if (sym.flags.is_extern_ptr) @intFromEnum(std.elf.R_X86_64.GOT32) else if (sym.flags.is_tls) @intFromEnum(std.elf.R_X86_64.TPOFF32) diff --git a/src/codegen.zig b/src/codegen.zig index 679ee03c27..3df7ce37ab 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -898,9 +898,8 @@ fn genNavRef( if (lf.cast(.elf)) |elf_file| { const zo = elf_file.zigObjectPtr().?; if (is_extern) { - // TODO audit this const sym_index = try elf_file.getGlobalSymbol(name.toSlice(ip), lib_name.toSlice(ip)); - zo.symbol(sym_index).flags.needs_got = true; + zo.symbol(sym_index).flags.is_extern_ptr = true; return GenResult.mcv(.{ .load_symbol = sym_index }); } const sym_index = try zo.getOrCreateMetadataForNav(elf_file, nav_index); diff --git a/src/link/Elf/Symbol.zig b/src/link/Elf/Symbol.zig index 4beb6a0918..4f6c2b8c7e 100644 --- a/src/link/Elf/Symbol.zig +++ b/src/link/Elf/Symbol.zig @@ -447,16 +447,18 @@ pub const Flags = packed struct { needs_tlsdesc: bool = false, has_tlsdesc: bool = false, - /// Whether the symbol is a TLS variable. - /// TODO this is really not needed if only we operated on esyms between - /// codegen and ZigObject. - is_tls: bool = false, - /// Whether the symbol is a merge subsection. merge_subsection: bool = false, + /// ZigObject specific flags /// Whether the symbol has a trampoline. has_trampoline: bool = false, + + /// Whether the symbol is a TLS variable. + is_tls: bool = false, + + /// Whether the symbol is an extern pointer (as opposed to function). + is_extern_ptr: bool = false, }; pub const Extra = struct { diff --git a/src/link/Elf/ZigObject.zig b/src/link/Elf/ZigObject.zig index 4c05c0b985..b72946c0f9 100644 --- a/src/link/Elf/ZigObject.zig +++ b/src/link/Elf/ZigObject.zig @@ -1141,13 +1141,12 @@ pub fn updateNav( .variable => |variable| Value.fromInterned(variable.init), .@"extern" => |@"extern"| { if (ip.isFunctionType(@"extern".ty)) return; - // Extern variable gets a .got entry only. const sym_index = try self.getGlobalSymbol( elf_file, nav.name.toSlice(ip), @"extern".lib_name.toSlice(ip), ); - self.symbol(sym_index).flags.needs_got = true; + self.symbol(sym_index).flags.is_extern_ptr = true; return; }, else => nav_val, |
