commit f2a778ca523ebe5b84f0d5463be24ca43262eea3 (tree)
parent a9b0999d5b8922580560fcb0f65f5860df78c8be
Author: kcbanner <kcbanner@gmail.com>
Date: Thu, 11 Jun 2026 00:21:52 -0400
Coff: fixes for 32 bit targets
Diffstat:
3 files changed, 22 insertions(+), 23 deletions(-)
diff --git a/lib/std/coff.zig b/lib/std/coff.zig
@@ -2043,7 +2043,7 @@ pub const ArchiveMemberHeader = extern struct {
if (opt_longnames) |longnames| {
if (offset >= longnames.len) return error.BadName;
- break :name std.mem.sliceTo(longnames[offset..], 0);
+ break :name std.mem.sliceTo(longnames[@intCast(offset)..], 0);
} else return error.NoLongNames;
} else if (trim[trim.len - 1] == '/')
trim[0 .. trim.len - 1]
diff --git a/src/link/Coff.zig b/src/link/Coff.zig
@@ -27,7 +27,7 @@ nodes: std.MultiArrayList(Node),
members: std.ArrayList(Member),
pending_members: std.AutoArrayHashMapUnmanaged(Member.Index, void),
lib_string_table: std.ArrayList(String),
-lib_string_len: u64,
+lib_string_len: u32,
long_names_table: LongNamesTable,
import_table: ImportTable,
export_table: ExportTable,
@@ -528,7 +528,7 @@ pub const Member = struct {
try Node.known.longnames_member.resize(&coff.mf, gpa, new_size);
const name_table_slice = Node.known.longnames_member.slice(&coff.mf);
- const name_slice = name_table_slice[old_size..][0 .. name.len + 1];
+ const name_slice = name_table_slice[@intCast(old_size)..][0 .. name.len + 1];
@memcpy(name_slice[0..name.len], name);
name_slice[name.len] = 0;
@@ -608,7 +608,7 @@ pub const LongNamesTable = struct {
assert(adapter.coff.isArchive());
const longnames_slice = Node.known.longnames_member.slice(&adapter.coff.mf);
const rhs = adapter.coff.long_names_table.entries.values()[rhs_index];
- return std.mem.eql(u8, longnames_slice[rhs.offset..][0..rhs.len], lhs_key);
+ return std.mem.eql(u8, longnames_slice[@intCast(rhs.offset)..][0..@intCast(rhs.len)], lhs_key);
}
pub fn hash(_: Adapter, key: []const u8) u32 {
@@ -2721,8 +2721,8 @@ fn getOrPutSymbolName(coff: *Coff, name: []const u8, opt_string: ?String) !Symbo
try coff.symbol_table.strings_ni.resize(&coff.mf, gpa, string_index + name.len + 1);
const slice = coff.symbol_table.strings_ni.slice(&coff.mf);
- @memcpy(slice[string_index..][0..name.len], name);
- slice[string_index + name.len] = 0;
+ @memcpy(slice[@intCast(string_index)..][0..name.len], name);
+ slice[@intCast(string_index + name.len)] = 0;
}
break :name .{ .long = string_gop.value_ptr.* };
@@ -2941,7 +2941,7 @@ pub fn getVAddr(coff: *Coff, reloc_info: link.File.RelocInfo, target_si: Symbol.
}
/// Caller guarantees there is capacity for one member and two nodes
-fn addMemberAssumeCapacity(coff: *Coff, kind: std.coff.ArchiveMemberHeader.Kind, size: usize) !Member.Index {
+fn addMemberAssumeCapacity(coff: *Coff, kind: std.coff.ArchiveMemberHeader.Kind, size: u64) !Member.Index {
const comp = coff.base.comp;
const gpa = comp.gpa;
@@ -2987,7 +2987,7 @@ fn addMemberAssumeCapacity(coff: *Coff, kind: std.coff.ArchiveMemberHeader.Kind,
const old_size = Node.known.second_linker_member.location(&coff.mf).resolve(&coff.mf)[1];
const old_header_size = new_num_members * @sizeOf(u32);
- const trailing_size = old_size - old_header_size;
+ const trailing_size: usize = @intCast(old_size - old_header_size);
try Node.known.second_linker_member.resize(&coff.mf, gpa, old_size + @sizeOf(u32));
const slice = Node.known.second_linker_member.slice(&coff.mf);
@@ -3053,12 +3053,12 @@ fn ensureMemberSymbol(coff: *Coff, mi: Member.Index, name: String) !void {
// can't guarantee that they will be tightly packed after resizing
const name_slice = name.toSlice(coff);
- const new_string_table_size = coff.lib_string_len + name_slice.len + 1;
+ const new_string_table_size: u32 = @intCast(coff.lib_string_len + name_slice.len + 1);
defer coff.lib_string_len = new_string_table_size;
{
- const old_header_size = @sizeOf(u32) + @intFromEnum(mfli) * @sizeOf(u32);
- const new_header_size = old_header_size + @sizeOf(u32);
+ const old_header_size: usize = @intCast(@sizeOf(u32) + @intFromEnum(mfli) * @sizeOf(u32));
+ const new_header_size: usize = @intCast(old_header_size + @sizeOf(u32));
try Node.known.first_linker_member.resize(&coff.mf, gpa, new_header_size + new_string_table_size);
const slice = Node.known.first_linker_member.slice(&coff.mf);
@@ -3231,7 +3231,7 @@ fn flushSymbolTableEntry(coff: *Coff, index: u32, pt: Zcu.PerThread) !void {
.unused = @splat(0),
};
if (coff.targetEndian() != native_endian)
- std.mem.byteSwapAllFields(std.coff.SectionDefinition, .@"2", aux_ptr);
+ std.mem.byteSwapAllFieldsAligned(std.coff.WeakExternalDefinition, .@"2", aux_ptr);
break :aux_init;
} else switch (coff.getNode(sym.ni)) {
@@ -3249,7 +3249,7 @@ fn flushSymbolTableEntry(coff: *Coff, index: u32, pt: Zcu.PerThread) !void {
.unused = @splat(0),
};
if (coff.targetEndian() != native_endian)
- std.mem.byteSwapAllFields(std.coff.SectionDefinition, .@"2", aux_ptr);
+ std.mem.byteSwapAllFieldsAligned(std.coff.SectionDefinition, .@"2", aux_ptr);
break :aux_init;
},
@@ -4269,7 +4269,7 @@ fn loadObject(
var weak_external: std.coff.WeakExternalDefinition = undefined;
@memcpy(std.mem.asBytes(&weak_external)[0..symbol_size], aux_symbols[0..symbol_size]);
if (target_endian != native_endian)
- std.mem.byteSwapAllFields(std.coff.SectionDefinition, &weak_external);
+ std.mem.byteSwapAllFields(std.coff.WeakExternalDefinition, &weak_external);
if (weak_external.tag_index >= header.number_of_symbols)
return diags.failParse(
@@ -5131,7 +5131,7 @@ fn loadArchive(coff: *Coff, path: std.Build.Cache.Path, fr: *Io.File.Reader) Loa
symbol_member_indices.addOneAssumeCapacity().* = (try r.takeInt(u16, target_endian)) - 1;
pos = fr.logicalPos();
- try coff.ensureManyUnusedStringCapacity(num_symbols, member_end - pos);
+ try coff.ensureManyUnusedStringCapacity(num_symbols, @intCast(member_end - pos));
try coff.input_archive_members.ensureUnusedCapacity(gpa, num_members);
try coff.input_archive_symbols.ensureUnusedCapacity(gpa, num_symbols);
try coff.input_archive_symbol_indices.ensureUnusedCapacity(gpa, num_symbols);
@@ -5202,7 +5202,7 @@ fn loadArchive(coff: *Coff, path: std.Build.Cache.Path, fr: *Io.File.Reader) Loa
.longnames => {
// This member is optional
if (std.mem.eql(u8, res.name, "//"))
- opt_longnames = try r.readAlloc(gpa, res.size);
+ opt_longnames = try r.readAlloc(gpa, @intCast(res.size));
opt_expected_kind = null;
break;
@@ -5753,9 +5753,8 @@ fn reportUndefs(coff: *Coff, tid: Zcu.PerThread.Id) !void {
// TODO: Make this a helper for anything that needs to report "referenced by" notes
switch (coff.getNode(loc_sym.ni)) {
.data_directories => {
- const dir_align = std.mem.Alignment.of(std.coff.ImageDataDirectory);
const dir: std.coff.IMAGE.DIRECTORY_ENTRY =
- @enumFromInt(dir_align.backward(reloc.offset) / @sizeOf(std.coff.IMAGE.DIRECTORY_ENTRY));
+ @enumFromInt(reloc.offset / @sizeOf(std.coff.ImageDataDirectory));
err.addNote("referenced by data directory entry: {t}", .{dir});
},
.optional_header => err.addNote("referenced by optional header field", .{}),
@@ -6566,7 +6565,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool {
const Entry = std.coff.ImportLookupTableEntry(ct_magic);
const import_lookup_table: []Entry = @ptrCast(@alignCast(import_lookup_slice));
const import_address_table: []Entry = @ptrCast(@alignCast(import_address_slice));
- const import_hint_name_rvas: [2]Entry = .{
+ var import_hint_name_rvas: [2]Entry = .{
.{
.payload = if (import.name == .none)
.{ .ordinal = .{ .ordinal = import.ordinal_hint } }
@@ -6577,7 +6576,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool {
@bitCast(@as(@typeInfo(Entry).@"struct".backing_integer.?, 0)),
};
if (native_endian != target_endian)
- for (import_hint_name_rvas) |*v| std.mem.byteSwapAllFields(Entry, v);
+ for (&import_hint_name_rvas) |*v| std.mem.byteSwapAllFields(Entry, v);
import_lookup_table[import_symbol_index..][0..2].* = import_hint_name_rvas;
import_address_table[import_symbol_index..][0..2].* = import_hint_name_rvas;
@@ -7182,7 +7181,7 @@ fn flushMember(coff: *Coff, mi: Member.Index) !void {
.strings = coff.lib_string_table.items,
});
- var offset: u64 = 0;
+ var offset: usize = 0;
var string_table = coff.secondLinkerMemberStringsSlice();
for (coff.lib_string_table.items) |string| {
const str = string.toSlice(coff);
@@ -7419,7 +7418,7 @@ fn updateExportsInner(
if (export_count > std.math.maxInt(@FieldType(std.coff.ExportDirectoryTable, "number_of_entries")))
return coff.base.comp.link_diags.fail("exceeded maximum number of exports", .{});
- const name_index: u64 = coff.export_table.name_table_ni.location(&coff.mf).resolve(&coff.mf)[1];
+ const name_index: u32 = @intCast(coff.export_table.name_table_ni.location(&coff.mf).resolve(&coff.mf)[1]);
const new_name_table_size = name_index + name.len + 1;
if (new_name_table_size > std.math.maxInt(@FieldType(ExportTable.Entry, "name_index")))
return coff.base.comp.link_diags.fail("exports name table limit reached", .{});
diff --git a/src/link/MappedFile.zig b/src/link/MappedFile.zig
@@ -1064,7 +1064,7 @@ fn realignNode(
};
if (try_backward) {
- const backward_offset = new_alignment.backward(old_offset);
+ const backward_offset = new_alignment.backward(@intCast(old_offset));
const prev_end = if (node.prev == .none) 0 else prev: {
const prev_offset, const prev_size = node.prev.location(mf).resolve(mf);
break :prev prev_offset + prev_size;