aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2023-10-25 16:49:56 +0200
committerJacob Young <jacobly0@users.noreply.github.com>2023-10-28 03:48:18 -0400
commita6a10d9c2b096e1c5cb7bf29273d64e7285b5f94 (patch)
tree539fa70985d2508cedd002ea468b3f77eff874c6 /src/codegen.zig
parenta440cf6d4454d3febfe07b6235745120d104cfa0 (diff)
downloadzig-a6a10d9c2b096e1c5cb7bf29273d64e7285b5f94.tar.gz
zig-a6a10d9c2b096e1c5cb7bf29273d64e7285b5f94.zip
x86_64: do not hardcode memory passed by Elf linker
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig23
1 files changed, 8 insertions, 15 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 051c2b33b3..d60e820dda 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -791,13 +791,11 @@ fn lowerDeclRef(
/// Helper struct to denote that the value is in memory but requires a linker relocation fixup:
/// * got - the value is referenced indirectly via GOT entry index (the linker emits a got-type reloc)
-/// * extern_got - pointer to extern variable referenced via GOT
/// * direct - the value is referenced directly via symbol index index (the linker emits a displacement reloc)
/// * import - the value is referenced indirectly via import entry index (the linker emits an import-type reloc)
pub const LinkerLoad = struct {
type: enum {
got,
- extern_got,
direct,
import,
},
@@ -827,8 +825,10 @@ pub const GenResult = union(enum) {
load_got: u32,
/// Direct by-address reference to memory location.
memory: u64,
- /// Pointer to extern variable via GOT.
- load_extern_got: u32,
+ /// Reference to memory location but deferred until linker allocated the Decl in memory.
+ /// Traditionally, this corresponds to emitting a relocation in a relocatable object file.
+ load_memory: u32,
+ lea_memory: u32,
};
fn mcv(val: MCValue) GenResult {
@@ -903,16 +903,13 @@ fn genDeclRef(
mod.intern_pool.stringToSliceUnwrap(ov.lib_name)
else
null;
- return GenResult.mcv(.{ .load_extern_got = try elf_file.getGlobalSymbol(name, lib_name) });
+ const sym_index = try elf_file.getGlobalSymbol(name, lib_name);
+ return GenResult.mcv(.{ .lea_memory = sym_index });
}
const sym_index = try elf_file.getOrCreateMetadataForDecl(decl_index);
const sym = elf_file.symbol(sym_index);
_ = try sym.getOrCreateZigGotEntry(sym_index, elf_file);
- if (bin_file.options.pic) {
- return GenResult.mcv(.{ .load_got = sym.esym_index });
- } else {
- return GenResult.mcv(.{ .memory = sym.zigGotAddress(elf_file) });
- }
+ return GenResult.mcv(.{ .lea_memory = sym.esym_index });
} else if (bin_file.cast(link.File.MachO)) |macho_file| {
const atom_index = try macho_file.getOrCreateAtomForDecl(decl_index);
const sym_index = macho_file.getAtom(atom_index).getSymbolIndex().?;
@@ -948,11 +945,7 @@ fn genUnnamedConst(
};
if (bin_file.cast(link.File.Elf)) |elf_file| {
const local = elf_file.symbol(local_sym_index);
- if (bin_file.options.pic) {
- return GenResult.mcv(.{ .load_direct = local.esym_index });
- } else {
- return GenResult.mcv(.{ .memory = local.value });
- }
+ return GenResult.mcv(.{ .load_memory = local.esym_index });
} else if (bin_file.cast(link.File.MachO)) |_| {
return GenResult.mcv(.{ .load_direct = local_sym_index });
} else if (bin_file.cast(link.File.Coff)) |_| {