Commit e9328e7da8

Jakub Konka <kubkon@jakubkonka.com>
2024-07-16 15:38:35
macho: fix 32bit compilation issues
1 parent 3338813
src/link/MachO/Atom.zig
@@ -983,7 +983,7 @@ pub fn writeRelocs(self: Atom, macho_file: *MachO, code: []u8, buffer: []macho.r
     var i: usize = 0;
     for (relocs) |rel| {
         defer i += 1;
-        const rel_offset = rel.offset - self.off;
+        const rel_offset = math.cast(usize, rel.offset - self.off) orelse return error.Overflow;
         const r_address: i32 = math.cast(i32, self.value + rel_offset) orelse return error.Overflow;
         assert(r_address >= 0);
         const r_symbolnum = r_symbolnum: {
src/link/MachO/InternalObject.zig
@@ -415,8 +415,9 @@ pub fn resolveLiterals(self: *InternalObject, lp: *MachO.LiteralPool, macho_file
         const rel = relocs[0];
         assert(rel.tag == .@"extern");
         const target = rel.getTargetSymbol(atom.*, macho_file).getAtom(macho_file).?;
-        try buffer.ensureUnusedCapacity(target.size);
-        buffer.resize(target.size) catch unreachable;
+        const target_size = std.math.cast(usize, target.size) orelse return error.Overflow;
+        try buffer.ensureUnusedCapacity(target_size);
+        buffer.resize(target_size) catch unreachable;
         @memcpy(buffer.items, try self.getSectionData(target.n_sect));
         const res = try lp.insert(gpa, header.type(), buffer.items);
         buffer.clearRetainingCapacity();
@@ -572,8 +573,9 @@ pub fn writeAtoms(self: *InternalObject, macho_file: *MachO) !void {
         if (!atom.flags.alive) continue;
         const sect = atom.getInputSection(macho_file);
         if (sect.isZerofill()) continue;
-        const off = atom.value;
-        const buffer = macho_file.sections.items(.out)[atom.out_n_sect].items[off..][0..atom.size];
+        const off = std.math.cast(usize, atom.value) orelse return error.Overflow;
+        const size = std.math.cast(usize, atom.size) orelse return error.Overflow;
+        const buffer = macho_file.sections.items(.out)[atom.out_n_sect].items[off..][0..size];
         @memcpy(buffer, try self.getSectionData(atom.n_sect));
         try atom.resolveRelocs(macho_file, buffer);
     }
src/link/MachO/Object.zig
@@ -1015,7 +1015,8 @@ fn initEhFrameRecords(self: *Object, allocator: Allocator, sect_id: u8, file: Fi
     const sect = slice.items(.header)[sect_id];
     const relocs = slice.items(.relocs)[sect_id];
 
-    try self.eh_frame_data.resize(allocator, sect.size);
+    const size = math.cast(usize, sect.size) orelse return error.Overflow;
+    try self.eh_frame_data.resize(allocator, size);
     const amt = try file.preadAll(self.eh_frame_data.items, sect.offset + self.offset);
     if (amt != self.eh_frame_data.items.len) return error.InputOutput;
 
@@ -1116,7 +1117,8 @@ fn initUnwindRecords(self: *Object, allocator: Allocator, sect_id: u8, file: Fil
     };
 
     const header = self.sections.items(.header)[sect_id];
-    const data = try allocator.alloc(u8, header.size);
+    const size = math.cast(usize, header.size) orelse return error.Overflow;
+    const data = try allocator.alloc(u8, size);
     defer allocator.free(data);
     const amt = try file.preadAll(data, header.offset + self.offset);
     if (amt != data.len) return error.InputOutput;
@@ -1346,7 +1348,8 @@ fn parseDebugInfo(self: *Object, macho_file: *MachO) !void {
     const file = macho_file.getFileHandle(self.file_handle);
     const debug_info = blk: {
         const sect = slice.items(.header)[debug_info_index.?];
-        const data = try gpa.alloc(u8, sect.size);
+        const size = math.cast(usize, sect.size) orelse return error.Overflow;
+        const data = try gpa.alloc(u8, size);
         const amt = try file.preadAll(data, sect.offset + self.offset);
         if (amt != data.len) return error.InputOutput;
         break :blk data;
@@ -1354,7 +1357,8 @@ fn parseDebugInfo(self: *Object, macho_file: *MachO) !void {
     defer gpa.free(debug_info);
     const debug_abbrev = blk: {
         const sect = slice.items(.header)[debug_abbrev_index.?];
-        const data = try gpa.alloc(u8, sect.size);
+        const size = math.cast(usize, sect.size) orelse return error.Overflow;
+        const data = try gpa.alloc(u8, size);
         const amt = try file.preadAll(data, sect.offset + self.offset);
         if (amt != data.len) return error.InputOutput;
         break :blk data;
@@ -1362,7 +1366,8 @@ fn parseDebugInfo(self: *Object, macho_file: *MachO) !void {
     defer gpa.free(debug_abbrev);
     const debug_str = if (debug_str_index) |sid| blk: {
         const sect = slice.items(.header)[sid];
-        const data = try gpa.alloc(u8, sect.size);
+        const size = math.cast(usize, sect.size) orelse return error.Overflow;
+        const data = try gpa.alloc(u8, size);
         const amt = try file.preadAll(data, sect.offset + self.offset);
         if (amt != data.len) return error.InputOutput;
         break :blk data;
@@ -1864,7 +1869,8 @@ pub fn writeAtoms(self: *Object, macho_file: *MachO) !void {
 
     for (headers, 0..) |header, n_sect| {
         if (header.isZerofill()) continue;
-        const data = try gpa.alloc(u8, header.size);
+        const size = math.cast(usize, header.size) orelse return error.Overflow;
+        const data = try gpa.alloc(u8, size);
         const amt = try file.preadAll(data, header.offset + self.offset);
         if (amt != data.len) return error.InputOutput;
         sections_data[n_sect] = data;
@@ -1874,11 +1880,13 @@ pub fn writeAtoms(self: *Object, macho_file: *MachO) !void {
         if (!atom.flags.alive) continue;
         const sect = atom.getInputSection(macho_file);
         if (sect.isZerofill()) continue;
-        const off = atom.value;
+        const value = math.cast(usize, atom.value) orelse return error.Overflow;
+        const off = math.cast(usize, atom.off) orelse return error.Overflow;
+        const size = math.cast(usize, atom.size) orelse return error.Overflow;
         const buffer = macho_file.sections.items(.out)[atom.out_n_sect].items;
         const data = sections_data[atom.n_sect];
-        @memcpy(buffer[off..][0..atom.size], data[atom.off..][0..atom.size]);
-        try atom.resolveRelocs(macho_file, buffer[off..][0..atom.size]);
+        @memcpy(buffer[value..][0..size], data[off..][0..size]);
+        try atom.resolveRelocs(macho_file, buffer[value..][0..size]);
     }
 }
 
@@ -1900,7 +1908,8 @@ pub fn writeAtomsRelocatable(self: *Object, macho_file: *MachO) !void {
 
     for (headers, 0..) |header, n_sect| {
         if (header.isZerofill()) continue;
-        const data = try gpa.alloc(u8, header.size);
+        const size = math.cast(usize, header.size) orelse return error.Overflow;
+        const data = try gpa.alloc(u8, size);
         const amt = try file.preadAll(data, header.offset + self.offset);
         if (amt != data.len) return error.InputOutput;
         sections_data[n_sect] = data;
@@ -1910,13 +1919,15 @@ pub fn writeAtomsRelocatable(self: *Object, macho_file: *MachO) !void {
         if (!atom.flags.alive) continue;
         const sect = atom.getInputSection(macho_file);
         if (sect.isZerofill()) continue;
-        const off = atom.value;
+        const value = math.cast(usize, atom.value) orelse return error.Overflow;
+        const off = math.cast(usize, atom.off) orelse return error.Overflow;
+        const size = math.cast(usize, atom.size) orelse return error.Overflow;
         const buffer = macho_file.sections.items(.out)[atom.out_n_sect].items;
         const data = sections_data[atom.n_sect];
-        @memcpy(buffer[off..][0..atom.size], data[atom.off..][0..atom.size]);
+        @memcpy(buffer[value..][0..size], data[off..][0..size]);
         const relocs = macho_file.sections.items(.relocs)[atom.out_n_sect].items;
         const extra = atom.getExtra(macho_file);
-        try atom.writeRelocs(macho_file, buffer[off..][0..atom.size], relocs[extra.rel_out_index..][0..extra.rel_out_count]);
+        try atom.writeRelocs(macho_file, buffer[value..][0..size], relocs[extra.rel_out_index..][0..extra.rel_out_count]);
     }
 }
 
@@ -2812,7 +2823,8 @@ const x86_64 = struct {
         }
         const relocs = @as([*]align(1) const macho.relocation_info, @ptrCast(relocs_buffer.ptr))[0..sect.nreloc];
 
-        const code = try gpa.alloc(u8, sect.size);
+        const sect_size = math.cast(usize, sect.size) orelse return error.Overflow;
+        const code = try gpa.alloc(u8, sect_size);
         defer gpa.free(code);
         {
             const amt = try handle.preadAll(code, sect.offset + self.offset);
@@ -2984,7 +2996,8 @@ const aarch64 = struct {
         }
         const relocs = @as([*]align(1) const macho.relocation_info, @ptrCast(relocs_buffer.ptr))[0..sect.nreloc];
 
-        const code = try gpa.alloc(u8, sect.size);
+        const sect_size = math.cast(usize, sect.size) orelse return error.Overflow;
+        const code = try gpa.alloc(u8, sect_size);
         defer gpa.free(code);
         {
             const amt = try handle.preadAll(code, sect.offset + self.offset);
src/link/MachO/relocatable.zig
@@ -626,7 +626,8 @@ fn writeSections(macho_file: *MachO) !void {
     for (slice.items(.header), slice.items(.out), slice.items(.relocs), 0..) |header, *out, *relocs, n_sect| {
         if (header.isZerofill()) continue;
         if (!macho_file.isZigSection(@intCast(n_sect))) { // TODO this is wrong; what about debug sections?
-            try out.resize(gpa, header.size);
+            const size = math.cast(usize, header.size) orelse return error.Overflow;
+            try out.resize(gpa, size);
             const padding_byte: u8 = if (header.isCode() and cpu_arch == .x86_64) 0xcc else 0;
             @memset(out.items, padding_byte);
         }
src/link/MachO/ZigObject.zig
@@ -529,12 +529,13 @@ pub fn writeAtomsRelocatable(self: *ZigObject, macho_file: *MachO) !void {
         if (sect.isZerofill()) continue;
         if (macho_file.isZigSection(atom.out_n_sect)) continue;
         if (atom.getRelocs(macho_file).len == 0) continue;
-        const off = atom.value;
+        const off = std.math.cast(usize, atom.value) orelse return error.Overflow;
+        const size = std.math.cast(usize, atom.size) orelse return error.Overflow;
         const buffer = macho_file.sections.items(.out)[atom.out_n_sect].items;
-        try self.getAtomData(macho_file, atom.*, buffer[off..][0..atom.size]);
+        try self.getAtomData(macho_file, atom.*, buffer[off..][0..size]);
         const relocs = macho_file.sections.items(.relocs)[atom.out_n_sect].items;
         const extra = atom.getExtra(macho_file);
-        try atom.writeRelocs(macho_file, buffer[off..][0..atom.size], relocs[extra.rel_out_index..][0..extra.rel_out_count]);
+        try atom.writeRelocs(macho_file, buffer[off..][0..size], relocs[extra.rel_out_index..][0..extra.rel_out_count]);
     }
 }
 
@@ -551,10 +552,11 @@ pub fn writeAtoms(self: *ZigObject, macho_file: *MachO) !void {
         const sect = atom.getInputSection(macho_file);
         if (sect.isZerofill()) continue;
         if (macho_file.isZigSection(atom.out_n_sect)) continue;
-        const off = atom.value;
+        const off = std.math.cast(usize, atom.value) orelse return error.Overflow;
+        const size = std.math.cast(usize, atom.size) orelse return error.Overflow;
         const buffer = macho_file.sections.items(.out)[atom.out_n_sect].items;
-        try self.getAtomData(macho_file, atom.*, buffer[off..][0..atom.size]);
-        try atom.resolveRelocs(macho_file, buffer[off..][0..atom.size]);
+        try self.getAtomData(macho_file, atom.*, buffer[off..][0..size]);
+        try atom.resolveRelocs(macho_file, buffer[off..][0..size]);
     }
 }
 
src/link/MachO.zig
@@ -2343,7 +2343,8 @@ fn resizeSections(self: *MachO) !void {
         if (header.isZerofill()) continue;
         if (self.isZigSection(@intCast(n_sect))) continue; // TODO this is horrible
         const cpu_arch = self.getTarget().cpu.arch;
-        try out.resize(self.base.comp.gpa, header.size);
+        const size = math.cast(usize, header.size) orelse return error.Overflow;
+        try out.resize(self.base.comp.gpa, size);
         const padding_byte: u8 = if (header.isCode() and cpu_arch == .x86_64) 0xcc else 0;
         @memset(out.items, padding_byte);
     }
@@ -2368,7 +2369,7 @@ fn writeSectionsAndUpdateLinkeditSizes(self: *MachO) !void {
     }
     for (self.thunks.items) |thunk| {
         const out = self.sections.items(.out)[thunk.out_n_sect].items;
-        const off = thunk.value;
+        const off = math.cast(usize, thunk.value) orelse return error.Overflow;
         const size = thunk.size();
         var stream = std.io.fixedBufferStream(out[off..][0..size]);
         try thunk.write(self, stream.writer());