aboutsummaryrefslogtreecommitdiff
path: root/src/link/MachO/InternalObject.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/link/MachO/InternalObject.zig')
-rw-r--r--src/link/MachO/InternalObject.zig33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/link/MachO/InternalObject.zig b/src/link/MachO/InternalObject.zig
index 004997145e..926e4a4a9f 100644
--- a/src/link/MachO/InternalObject.zig
+++ b/src/link/MachO/InternalObject.zig
@@ -53,7 +53,7 @@ pub fn init(self: *InternalObject, allocator: Allocator) !void {
pub fn initSymbols(self: *InternalObject, macho_file: *MachO) !void {
const newSymbolAssumeCapacity = struct {
- fn newSymbolAssumeCapacity(obj: *InternalObject, name: u32, args: struct {
+ fn newSymbolAssumeCapacity(obj: *InternalObject, name: MachO.String, args: struct {
type: u8 = macho.N_UNDF | macho.N_EXT,
desc: u16 = 0,
}) Symbol.Index {
@@ -69,7 +69,7 @@ pub fn initSymbols(self: *InternalObject, macho_file: *MachO) !void {
const nlist_idx: u32 = @intCast(obj.symtab.items.len);
const nlist = obj.symtab.addOneAssumeCapacity();
nlist.* = .{
- .n_strx = name,
+ .n_strx = name.pos,
.n_type = args.type,
.n_sect = 0,
.n_desc = args.desc,
@@ -197,16 +197,16 @@ pub fn resolveBoundarySymbols(self: *InternalObject, macho_file: *MachO) !void {
try self.globals.ensureUnusedCapacity(gpa, nsyms);
for (boundary_symbols.keys(), boundary_symbols.values()) |name, ref| {
- const name_off = try self.addString(gpa, name);
+ const name_str = try self.addString(gpa, name);
const sym_index = self.addSymbolAssumeCapacity();
self.boundary_symbols.appendAssumeCapacity(sym_index);
const sym = &self.symbols.items[sym_index];
- sym.name = name_off;
+ sym.name = name_str;
sym.visibility = .local;
const nlist_idx: u32 = @intCast(self.symtab.items.len);
const nlist = self.symtab.addOneAssumeCapacity();
nlist.* = .{
- .n_strx = name_off,
+ .n_strx = name_str.pos,
.n_type = macho.N_SECT,
.n_sect = 0,
.n_desc = 0,
@@ -273,7 +273,7 @@ fn addObjcMethnameSection(self: *InternalObject, methname: []const u8, macho_fil
const nlist_idx: u32 = @intCast(self.symtab.items.len);
const nlist = try self.symtab.addOne(gpa);
nlist.* = .{
- .n_strx = name_str,
+ .n_strx = name_str.pos,
.n_type = macho.N_SECT,
.n_sect = @intCast(n_sect + 1),
.n_desc = 0,
@@ -373,15 +373,15 @@ pub fn resolveObjcMsgSendSymbols(self: *InternalObject, macho_file: *MachO) !voi
const name = MachO.eatPrefix(sym_name, "_objc_msgSend$").?;
const selrefs_index = try self.addObjcMsgsendSections(name, macho_file);
- const name_off = try self.addString(gpa, sym_name);
+ const name_str = try self.addString(gpa, sym_name);
const sym_index = try self.addSymbol(gpa);
const sym = &self.symbols.items[sym_index];
- sym.name = name_off;
+ sym.name = name_str;
sym.visibility = .hidden;
const nlist_idx: u32 = @intCast(self.symtab.items.len);
const nlist = try self.symtab.addOne(gpa);
nlist.* = .{
- .n_strx = name_off,
+ .n_strx = name_str.pos,
.n_type = macho.N_SECT | macho.N_EXT | macho.N_PEXT,
.n_sect = 0,
.n_desc = 0,
@@ -624,17 +624,18 @@ fn getSectionData(self: *const InternalObject, index: u32) error{Overflow}![]con
@panic("ref to non-existent section");
}
-pub fn addString(self: *InternalObject, allocator: Allocator, name: []const u8) !u32 {
+pub fn addString(self: *InternalObject, allocator: Allocator, string: []const u8) !MachO.String {
const off: u32 = @intCast(self.strtab.items.len);
- try self.strtab.ensureUnusedCapacity(allocator, name.len + 1);
- self.strtab.appendSliceAssumeCapacity(name);
+ try self.strtab.ensureUnusedCapacity(allocator, string.len + 1);
+ self.strtab.appendSliceAssumeCapacity(string);
self.strtab.appendAssumeCapacity(0);
- return off;
+ return .{ .pos = off, .len = @intCast(string.len + 1) };
}
-pub fn getString(self: InternalObject, off: u32) [:0]const u8 {
- assert(off < self.strtab.items.len);
- return mem.sliceTo(@as([*:0]const u8, @ptrCast(self.strtab.items.ptr + off)), 0);
+pub fn getString(self: InternalObject, string: MachO.String) [:0]const u8 {
+ assert(string.pos < self.strtab.items.len and string.pos + string.len <= self.strtab.items.len);
+ if (string.len == 0) return "";
+ return self.strtab.items[string.pos..][0 .. string.len - 1 :0];
}
pub fn asFile(self: *InternalObject) File {