diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2025-06-07 13:08:22 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-07 13:08:22 -0400 |
| commit | 8b875b17ade95c4e0098c7c3b20134f03745aac3 (patch) | |
| tree | 02ee642b33451b453994f484a2204ddca42e4857 /src/codegen.zig | |
| parent | 173bc4274446a14aca2eea128b70b35b0ba18ebe (diff) | |
| parent | 5a52da1b7a8c467087da8f3a20ab902ec8c1e25d (diff) | |
| download | zig-8b875b17ade95c4e0098c7c3b20134f03745aac3.tar.gz zig-8b875b17ade95c4e0098c7c3b20134f03745aac3.zip | |
Merge pull request #24072 from jacobly0/x86_64-default
Compilation: enable the x86_64 backend by default for debug builds
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 81 |
1 files changed, 57 insertions, 24 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 1f794bbeea..a2de3e2d01 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -921,41 +921,74 @@ fn genNavRef( const nav = ip.getNav(nav_index); assert(!nav.isThreadlocal(ip)); - const is_extern, const lib_name = if (nav.getExtern(ip)) |e| - .{ true, e.lib_name } + const lib_name, const linkage, const visibility = if (nav.getExtern(ip)) |e| + .{ e.lib_name, e.linkage, e.visibility } else - .{ false, .none }; + .{ .none, .internal, .default }; const name = nav.name; if (lf.cast(.elf)) |elf_file| { const zo = elf_file.zigObjectPtr().?; - if (is_extern) { - const sym_index = try elf_file.getGlobalSymbol(name.toSlice(ip), lib_name.toSlice(ip)); - zo.symbol(sym_index).flags.is_extern_ptr = true; - return .{ .mcv = .{ .lea_symbol = sym_index } }; + switch (linkage) { + .internal => { + const sym_index = try zo.getOrCreateMetadataForNav(zcu, nav_index); + return .{ .mcv = .{ .lea_symbol = sym_index } }; + }, + .strong, .weak => { + const sym_index = try elf_file.getGlobalSymbol(name.toSlice(ip), lib_name.toSlice(ip)); + switch (linkage) { + .internal => unreachable, + .strong => {}, + .weak => zo.symbol(sym_index).flags.weak = true, + .link_once => unreachable, + } + switch (visibility) { + .default => zo.symbol(sym_index).flags.is_extern_ptr = true, + .hidden, .protected => {}, + } + return .{ .mcv = .{ .lea_symbol = sym_index } }; + }, + .link_once => unreachable, } - const sym_index = try zo.getOrCreateMetadataForNav(zcu, nav_index); - return .{ .mcv = .{ .lea_symbol = sym_index } }; } else if (lf.cast(.macho)) |macho_file| { const zo = macho_file.getZigObject().?; - if (is_extern) { - const sym_index = try macho_file.getGlobalSymbol(name.toSlice(ip), lib_name.toSlice(ip)); - zo.symbols.items[sym_index].flags.is_extern_ptr = true; - return .{ .mcv = .{ .lea_symbol = sym_index } }; + switch (linkage) { + .internal => { + const sym_index = try zo.getOrCreateMetadataForNav(macho_file, nav_index); + const sym = zo.symbols.items[sym_index]; + return .{ .mcv = .{ .lea_symbol = sym.nlist_idx } }; + }, + .strong, .weak => { + const sym_index = try macho_file.getGlobalSymbol(name.toSlice(ip), lib_name.toSlice(ip)); + switch (linkage) { + .internal => unreachable, + .strong => {}, + .weak => zo.symbols.items[sym_index].flags.weak = true, + .link_once => unreachable, + } + switch (visibility) { + .default => zo.symbols.items[sym_index].flags.is_extern_ptr = true, + .hidden, .protected => {}, + } + return .{ .mcv = .{ .lea_symbol = sym_index } }; + }, + .link_once => unreachable, } - const sym_index = try zo.getOrCreateMetadataForNav(macho_file, nav_index); - const sym = zo.symbols.items[sym_index]; - return .{ .mcv = .{ .lea_symbol = sym.nlist_idx } }; } else if (lf.cast(.coff)) |coff_file| { - if (is_extern) { - // TODO audit this - const global_index = try coff_file.getGlobalSymbol(name.toSlice(ip), lib_name.toSlice(ip)); - try coff_file.need_got_table.put(gpa, global_index, {}); // needs GOT - return .{ .mcv = .{ .load_got = link.File.Coff.global_symbol_bit | global_index } }; + // TODO audit this + switch (linkage) { + .internal => { + const atom_index = try coff_file.getOrCreateAtomForNav(nav_index); + const sym_index = coff_file.getAtom(atom_index).getSymbolIndex().?; + return .{ .mcv = .{ .load_got = sym_index } }; + }, + .strong, .weak => { + const global_index = try coff_file.getGlobalSymbol(name.toSlice(ip), lib_name.toSlice(ip)); + try coff_file.need_got_table.put(gpa, global_index, {}); // needs GOT + return .{ .mcv = .{ .load_got = link.File.Coff.global_symbol_bit | global_index } }; + }, + .link_once => unreachable, } - const atom_index = try coff_file.getOrCreateAtomForNav(nav_index); - const sym_index = coff_file.getAtom(atom_index).getSymbolIndex().?; - return .{ .mcv = .{ .load_got = sym_index } }; } else if (lf.cast(.plan9)) |p9| { const atom_index = try p9.seeNav(pt, nav_index); const atom = p9.getAtom(atom_index); |
