diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-09-09 23:30:31 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-09-09 23:30:31 +0200 |
| commit | d8f210354577eda1b438d692b28bb3a582913b5a (patch) | |
| tree | 5855f0bc25efb2ba6617b8a6cad46f19d0958f82 /src/link | |
| parent | bac065c7cfb6f3aa0fe1cdf1334adb5a46d9a2af (diff) | |
| download | zig-d8f210354577eda1b438d692b28bb3a582913b5a.tar.gz zig-d8f210354577eda1b438d692b28bb3a582913b5a.zip | |
macho+coff: return index into global table from getGlobalSymbol
Diffstat (limited to 'src/link')
| -rw-r--r-- | src/link/Coff.zig | 13 | ||||
| -rw-r--r-- | src/link/MachO.zig | 13 |
2 files changed, 20 insertions, 6 deletions
diff --git a/src/link/Coff.zig b/src/link/Coff.zig index 4f57154b90..ea36c8bc91 100644 --- a/src/link/Coff.zig +++ b/src/link/Coff.zig @@ -1544,9 +1544,10 @@ pub fn getDeclVAddr( pub fn getGlobalSymbol(self: *Coff, name: []const u8) !u32 { const gop = try self.getOrPutGlobalPtr(name); + const global_index = self.getGlobalIndex(name).?; if (gop.found_existing) { - return gop.value_ptr.sym_index; + return global_index; } const sym_index = try self.allocateSymbol(); @@ -1559,9 +1560,9 @@ pub fn getGlobalSymbol(self: *Coff, name: []const u8) !u32 { try self.setSymbolName(sym, sym_name); sym.storage_class = .EXTERNAL; - try self.unresolved.putNoClobber(gpa, self.getGlobalIndex(name).?, true); + try self.unresolved.putNoClobber(gpa, global_index, true); - return sym_index; + return global_index; } pub fn updateDeclLineNumber(self: *Coff, module: *Module, decl: *Module.Decl) !void { @@ -2077,6 +2078,12 @@ pub fn getGlobalIndex(self: *const Coff, name: []const u8) ?u32 { return self.resolver.get(name); } +/// Returns global entry at `index`. +pub fn getGlobalByIndex(self: *const Coff, index: u32) SymbolWithLoc { + assert(index < self.globals.items.len); + return self.globals.items[index]; +} + const GetOrPutGlobalPtrResult = struct { found_existing: bool, value_ptr: *SymbolWithLoc, diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 12d8326f35..e5c55fdb8a 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -4890,9 +4890,10 @@ pub fn getGlobalSymbol(self: *MachO, name: []const u8) !u32 { const sym_name = try std.fmt.allocPrint(gpa, "_{s}", .{name}); defer gpa.free(sym_name); const gop = try self.getOrPutGlobalPtr(sym_name); + const global_index = self.getGlobalIndex(sym_name).?; if (gop.found_existing) { - return gop.value_ptr.sym_index; + return global_index; } const sym_index = try self.allocateSymbol(); @@ -4902,9 +4903,9 @@ pub fn getGlobalSymbol(self: *MachO, name: []const u8) !u32 { const sym = self.getSymbolPtr(sym_loc); sym.n_strx = try self.strtab.insert(gpa, sym_name); - try self.unresolved.putNoClobber(gpa, self.getGlobalIndex(sym_name).?, true); + try self.unresolved.putNoClobber(gpa, global_index, true); - return sym_index; + return global_index; } fn getSegmentAllocBase(self: MachO, indices: []const ?u8) struct { vmaddr: u64, fileoff: u64 } { @@ -5830,6 +5831,12 @@ pub fn getGlobalIndex(self: *const MachO, name: []const u8) ?u32 { return self.resolver.get(name); } +/// Returns global entry at `index`. +pub fn getGlobalByIndex(self: *const MachO, index: u32) SymbolWithLoc { + assert(index < self.globals.items.len); + return self.globals.items[index]; +} + const GetOrPutGlobalPtrResult = struct { found_existing: bool, value_ptr: *SymbolWithLoc, |
