zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 323a3edafe0ac3e3b101db87188fe9ace1d9c388 (tree)
parent 411e5099e5fb8a8e1b39e0bcd0098e7a2c162aec
Author: kcbanner <kcbanner@gmail.com>
Date:   Tue, 23 Jun 2026 00:19:44 -0400

Coff: Rework global keys

The previous way of keying globals on (name, lib_name) did not allow resolving undef externals from imports to globals that were first seen with a lib_name

Diffstat:
Msrc/link/Coff.zig | 212++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 119 insertions(+), 93 deletions(-)

diff --git a/src/link/Coff.zig b/src/link/Coff.zig @@ -64,7 +64,7 @@ object_section_table: std.array_hash_map.Auto(String, Symbol.Index), section_merges: std.array_hash_map.Auto(String, String), section_merge_pending_index: u32, symbols: std.ArrayList(Symbol), -globals: std.array_hash_map.Auto(GlobalName, Symbol.Index), +globals: std.array_hash_map.Auto(String, Global), global_pending_index: u32, navs: std.array_hash_map.Auto(InternPool.Nav.Index, Symbol.Index), uavs: std.array_hash_map.Auto(InternPool.Index, Symbol.Index), @@ -268,12 +268,16 @@ pub const Node = union(enum) { }; } - pub fn globalName(gmi: GlobalMapIndex, coff: *const Coff) GlobalName { + pub fn name(gmi: GlobalMapIndex, coff: *const Coff) String { return coff.globals.keys()[gmi.unwrap().?]; } pub fn symbol(gmi: GlobalMapIndex, coff: *const Coff) Symbol.Index { - return coff.globals.values()[gmi.unwrap().?]; + return coff.globals.values()[gmi.unwrap().?].si; + } + + pub fn libName(gmi: GlobalMapIndex, coff: *const Coff) String.Optional { + return coff.globals.values()[gmi.unwrap().?].lib_name; } }; @@ -335,6 +339,10 @@ pub const Node = union(enum) { const LocalIndex = enum(u32) { _, + + pub fn name(isli: LocalIndex, coff: *const Coff) String { + return coff.input_symbols.items[@intFromEnum(isli)].name; + } }; }; @@ -847,12 +855,15 @@ pub const Section = struct { ) ?*align(2) std.coff.Relocation { if (sri == .none) return null; const table_slice = sn.section(coff).relocation_table_ni.slice(&coff.mf); - return @ptrCast(@alignCast(&table_slice[sri.unwrap().? * std.coff.Relocation.sizeOf()])); + return @ptrCast(@alignCast(&table_slice[@as(u32, sri.unwrap().?) * std.coff.Relocation.sizeOf()])); } }; }; -pub const GlobalName = struct { name: String, lib_name: String.Optional }; +pub const Global = struct { + si: Symbol.Index, + lib_name: String.Optional, +}; pub const WeakExternalStrat = enum(u3) { none, @@ -1332,7 +1343,7 @@ pub const Reloc = extern struct { // so that this function doesn't return an err else => |kind| return coff.base.comp.link_diags.fail( "absolute symbol '{s}' targeted by invalid relocation type: {t}", - .{ target_sym.gmi.globalName(coff).name.toSlice(coff), kind }, + .{ target_sym.gmi.name(coff).toSlice(coff), kind }, ), .ABSOLUTE => {}, .ADDR64 => std.mem.writeInt( @@ -1351,7 +1362,7 @@ pub const Reloc = extern struct { .I386 => switch (reloc.type.I386) { else => |kind| return coff.base.comp.link_diags.fail( "absolute symbol '{s}' targeted by invalid relocation type: {t}", - .{ target_sym.gmi.globalName(coff).name.toSlice(coff), kind }, + .{ target_sym.gmi.name(coff).toSlice(coff), kind }, ), .ABSOLUTE => {}, .DIR16 => std.mem.writeInt( @@ -2767,12 +2778,12 @@ const GlobalOptions = struct { fn getOrPutGlobalSymbol( coff: *Coff, opts: GlobalOptions, -) !std.array_hash_map.Auto(GlobalName, Symbol.Index).GetOrPutResult { +) !std.array_hash_map.Auto(String, Global).GetOrPutResult { const comp = coff.base.comp; const gpa = comp.gpa; try coff.symbols.ensureUnusedCapacity(gpa, 1); - const lib_name = if (opts.lib_name) |lib_name| lib_name: { + const lib_name: String.Optional = if (opts.lib_name) |lib_name| lib_name: { const is_libc = std.zig.target.isLibCLibName(&comp.root_mod.resolved_target.result, lib_name); if (is_libc) { // This is guaranteed by Sema.handleExternLibName @@ -2781,23 +2792,23 @@ fn getOrPutGlobalSymbol( // TODO: The user has requested this symbol come from libc, but this logic allows // it to come from anywhere. We need to know what inputs are libc inputs, // and set a flag to only search them for this symbol. - break :lib_name null; + break :lib_name .none; } - break :lib_name lib_name; - } else null; + break :lib_name (try coff.getOrPutString(lib_name)).toOptional(); + } else .none; - const sym_gop = try coff.globals.getOrPut(gpa, .{ - .name = try coff.getOrPutString(opts.name), - .lib_name = try coff.getOrPutOptionalString(lib_name), - }); + const sym_gop = try coff.globals.getOrPut(gpa, try coff.getOrPutString(opts.name)); if (!sym_gop.found_existing) { const si = coff.addSymbolAssumeCapacity(); const sym = si.get(coff); sym.gmi = .wrap(@intCast(sym_gop.index)); sym.flags.type = opts.type; sym.flags.dll_storage_class = opts.dll_storage_class; - sym_gop.value_ptr.* = si; + sym_gop.value_ptr.* = .{ + .si = si, + .lib_name = lib_name, + }; coff.synth_prog_node.increaseEstimatedTotalItems(1); log.debug("globalSymbol({s}, {?s}) = {d}", .{ opts.name, opts.lib_name, si }); @@ -2807,16 +2818,15 @@ fn getOrPutGlobalSymbol( } fn getDefinedGlobal(coff: *Coff, name: []const u8) Symbol.Index { - if (coff.globals.get(.{ - .name = coff.getString(name).unwrap() orelse return .null, - .lib_name = .none, - })) |si| if (si.get(coff).ni != .none) return si; + if (coff.globals.get( + coff.getString(name).unwrap() orelse return .null, + )) |global| if (global.si.get(coff).ni != .none) return global.si; return .null; } pub fn globalSymbol(coff: *Coff, opts: GlobalOptions) !Symbol.Index { const gop = try coff.getOrPutGlobalSymbol(opts); - return gop.value_ptr.*; + return gop.value_ptr.si; } pub fn pendingSymbolTableEntry(coff: *Coff, si: Symbol.Index) !void { @@ -3121,9 +3131,9 @@ fn flushSymbolTableEntry(coff: *Coff, index: u32, pt: Zcu.PerThread) !void { var buf: [15]u8 = undefined; const symbol_name, const num_aux_symbols: u8, const complex_type: std.coff.ComplexType = if (sym.gmi != .none) blk: { - const gn = sym.gmi.globalName(coff); + const name = sym.gmi.name(coff); break :blk .{ - try coff.getOrPutSymbolName(gn.name.toSlice(coff), gn.name), + try coff.getOrPutSymbolName(name.toSlice(coff), name), @intFromBool(sym.flags.weak_external_strat != .none), if (Symbol.Index.text.get(coff).section_number == sym.section_number) .FUNCTION @@ -3735,7 +3745,7 @@ fn addRelocAssumeCapacity( const header = loc_sn.header(coff); const old_num_relocations = coff.targetLoad(&header.number_of_relocations); const new_num_relocations = old_num_relocations + 1; - const new_size = new_num_relocations * std.coff.Relocation.sizeOf(); + const new_size = @as(u32, new_num_relocations) * std.coff.Relocation.sizeOf(); coff.targetStore(&header.number_of_relocations, new_num_relocations); if (coff.symbolTableSectionAuxEntryPtr(loc_sn.symbol(coff).sti(coff))) |aux_ptr| @@ -4529,17 +4539,16 @@ fn loadObject( .external => { const global_gop = try coff.getOrPutGlobalSymbol(.{ .name = symbol.name.toSlice(coff), - .lib_name = null, }); // TODO: What if the same symbol is incorrectly defined twice in this obj? // Would need to mark this global as pending, or notice it later when .ni != none - if (!global_gop.found_existing or global_gop.value_ptr.get(coff).ni == .none) { - symbol.si = global_gop.value_ptr.*; + if (!global_gop.found_existing or global_gop.value_ptr.si.get(coff).ni == .none) { + symbol.si = global_gop.value_ptr.si; break :comdat .include; } - break :existing global_gop.value_ptr.*; + break :existing global_gop.value_ptr.si; }, }; @@ -4736,7 +4745,7 @@ fn loadObject( }, .weak_external => |alias_index| { const global_gop = try coff.getOrPutGlobalSymbol(.{ .name = symbol.name.toSlice(coff) }); - symbol.si = global_gop.value_ptr.*; + symbol.si = global_gop.value_ptr.si; if (!global_gop.found_existing or symbol.si.get(coff).ni == .none) { const sym = symbol.si.get(coff); const alias = pending_symbols.getPtr(alias_index) orelse @@ -4775,9 +4784,16 @@ fn loadObject( }, .external => |value| { const global_gop = try coff.getOrPutGlobalSymbol(.{ .name = symbol.name.toSlice(coff) }); - symbol.si = global_gop.value_ptr.*; + symbol.si = global_gop.value_ptr.si; if (global_gop.found_existing) - return coff.failMultipleDefinitions(path, member_name, symbol.name, index, global_gop.value_ptr.*, .none); + return coff.failMultipleDefinitions( + path, + member_name, + symbol.name, + index, + global_gop.value_ptr.si, + .none, + ); break :sym value; }, else => unreachable, @@ -4804,11 +4820,18 @@ fn loadObject( .external => { assert(index != section.comdat_psi.unwrap()); const global_gop = try coff.getOrPutGlobalSymbol(.{ .name = symbol.name.toSlice(coff) }); - symbol.si = global_gop.value_ptr.*; + symbol.si = global_gop.value_ptr.si; const sym = symbol.si.get(coff); if (global_gop.found_existing and sym.ni != .none) - return coff.failMultipleDefinitions(path, member_name, symbol.name, index, global_gop.value_ptr.*, .none); + return coff.failMultipleDefinitions( + path, + member_name, + symbol.name, + index, + global_gop.value_ptr.si, + .none, + ); }, .weak_external, .weak_external_aux, @@ -4881,7 +4904,7 @@ fn loadObject( switch (symbol.value) { .external => |size| { const global_gop = try coff.getOrPutGlobalSymbol(.{ .name = symbol.name.toSlice(coff) }); - symbol.si = global_gop.value_ptr.*; + symbol.si = global_gop.value_ptr.si; if (!global_gop.found_existing or symbol.si.get(coff).ni == .none) { const sym = symbol.si.get(coff); sym.setExtra(.{ .size = @max(sym.size(), size) }); @@ -5743,7 +5766,9 @@ fn reportUndefs(coff: *Coff, tid: Zcu.PerThread.Id) !void { num_full_notes + @intFromBool(num_unique_references > max_notes), ); const target_sym = target.get(coff); - try err.addMsg("undefined symbol: {s}", .{target_sym.gmi.globalName(coff).name.toSlice(coff)}); + try err.addMsg("undefined symbol: {s}", .{target_sym.gmi.name(coff).toSlice(coff)}); + + // TODO: If lib_name is set, show the user var prev_loc_si: Symbol.Index = .null; for (undef_indices.items[start_i .. i + 1]) |reference_i| { @@ -5774,9 +5799,9 @@ fn reportUndefs(coff: *Coff, tid: Zcu.PerThread.Id) !void { if (section.comdat_si != .null) { const comdat_sym = section.comdat_si.get(coff); const comdat_name = if (comdat_sym.gmi != .none) - comdat_sym.gmi.globalName(coff).name.toSlice(coff) + comdat_sym.gmi.name(coff).toSlice(coff) else - coff.input_symbols.items[@intFromEnum(comdat_sym.extra.isli)].name.toSlice(coff); + comdat_sym.extra.isli.name(coff).toSlice(coff); err.addNote("referenced by input COMDAT section '{s}={s}' '{f}{f}'", .{ section_name, @@ -5793,14 +5818,14 @@ fn reportUndefs(coff: *Coff, tid: Zcu.PerThread.Id) !void { } } else { err.addNote("referenced by input symbol '{s}' from '{f}{f}'", .{ - loc_sym.gmi.globalName(coff).name.toSlice(coff), + loc_sym.gmi.name(coff).toSlice(coff), other_ioi.path(coff).fmtEscapeString(), fmtMemberNameString(other_ioi.memberName(coff)), }); } }, .import_thunk => |gmi| err.addNote("referenced by import thunk for '{s}'", .{ - gmi.globalName(coff).name.toSlice(coff), + gmi.name(coff).toSlice(coff), }), inline .nav, .uav, @@ -5959,7 +5984,7 @@ fn resolve(coff: *Coff, tid: Zcu.PerThread.Id) !bool { if (coff.exports_complete and coff.global_pending_index < coff.globals.count()) { const gmi: Node.GlobalMapIndex = .wrap(coff.global_pending_index); const sub_prog_node = coff.synth_prog_node.start( - gmi.globalName(coff).name.toSlice(coff), + gmi.name(coff).toSlice(coff), 0, ); defer sub_prog_node.end(); @@ -6138,7 +6163,7 @@ fn idleProgNode( coff.getNode(isi.symbol(coff).node(coff).parent(&coff.mf)).object_section.name(coff).toSlice(coff), }) catch &name; }, - .import_thunk => |gmi| gmi.globalName(coff).name.toSlice(coff), + .import_thunk => |gmi| gmi.name(coff).toSlice(coff), .nav => |nmi| { const ip = &coff.base.comp.zcu.?.intern_pool; break :name ip.getNav(nmi.navIndex(coff)).fqn.toSlice(ip); @@ -6216,7 +6241,6 @@ fn flushUav( } fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !void { - const gn = gmi.globalName(coff); const si = gmi.symbol(coff); const sym = si.get(coff); const alias_sym = alias_si.get(coff); @@ -6224,11 +6248,11 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v assert(sym.loc_relocs == .none); log.debug("aliasGlobal({s}, {?s}) {d}->{d} ({?s})", .{ - gn.name.toSlice(coff), - gn.lib_name.toSlice(coff), + gmi.name(coff).toSlice(coff), + gmi.libName(coff).toSlice(coff), si, alias_si, - if (alias_sym.gmi != .none) alias_sym.gmi.globalName(coff).name.toSlice(coff) else null, + if (alias_sym.gmi != .none) alias_sym.gmi.name(coff).toSlice(coff) else null, }); var ri = sym.target_relocs; @@ -6250,7 +6274,7 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v alias_sym.target_relocs = sym.target_relocs; sym.target_relocs = .none; sym.gmi = alias_sym.gmi; - coff.globals.values()[gmi.unwrap().?] = alias_si; + coff.globals.values()[gmi.unwrap().?].si = alias_si; // Only apply the new relocs try alias_si.applyTargetRelocs(coff, prev_target_relocs); } @@ -6258,12 +6282,18 @@ fn aliasGlobal(coff: *Coff, gmi: Node.GlobalMapIndex, alias_si: Symbol.Index) !v fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { const comp = coff.base.comp; const gpa = comp.gpa; - const gn = gmi.globalName(coff); + const name = gmi.name(coff); const si = gmi.symbol(coff); log.debug( "flushGlobal({s}, {?s}) = n{d} {d}@{d}", - .{ gn.name.toSlice(coff), gn.lib_name.toSlice(coff), si.get(coff).ni, si, si.get(coff).section_number }, + .{ + name.toSlice(coff), + gmi.libName(coff).toSlice(coff), + si.get(coff).ni, + si, + si.get(coff).section_number, + }, ); if (!coff.isImage()) { @@ -6271,7 +6301,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { if (coff.isArchive() and si.get(coff).ni != .none) try coff.ensureMemberSymbol( coff.getNode(Node.known.zcu_member).archive_member, - gn.name, + name, ); return true; @@ -6292,18 +6322,18 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { const import: Import = import: { const sym = si.get(coff); - const global_name = gn.name.toSlice(coff); - const imp_match = std.mem.startsWith(u8, global_name, imp_prefix); + const name_slice = name.toSlice(coff); + const imp_match = std.mem.startsWith(u8, name_slice, imp_prefix); // Globals may have the __imp_ prefix already if they are undef externals from another input. assert(sym.flags.dll_storage_class != .dllexport); const search_name, const is_imp = if (imp_match or sym.flags.dll_storage_class != .dllimport) - .{ gn.name, imp_match } + .{ name, imp_match } else name: { - try coff.ensureUnusedStringCapacity(imp_prefix.len + global_name.len); - const name = try std.fmt.allocPrint(gpa, imp_prefix ++ "{s}", .{global_name}); - defer gpa.free(name); - break :name .{ coff.getOrPutStringAssumeCapacity(name), true }; + try coff.ensureUnusedStringCapacity(imp_prefix.len + name_slice.len); + const imp_name = try std.fmt.allocPrint(gpa, imp_prefix ++ "{s}", .{name_slice}); + defer gpa.free(imp_name); + break :name .{ coff.getOrPutStringAssumeCapacity(imp_name), true }; }; const opt_alt_search_name = coff.alternate_names.get(search_name); @@ -6317,7 +6347,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { .anti_dependency => return comp.link_diags.fail( // TODO: Figure out what the purpose of this is "TODO support anti_dependency weak external: {s}", - .{gn.name.toSlice(coff)}, + .{name.toSlice(coff)}, ), }, else => true, @@ -6336,7 +6366,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { const member = &coff.input_archive_members.items[@intFromEnum(archive_sym.iami)]; member: switch (member.content) { .object => if (!member.flags.is_loaded) { - if (gn.lib_name.unwrap()) |lib_name| + if (gmi.libName(coff).unwrap()) |lib_name| if (!std.ascii.eqlIgnoreCase( lib_name.toSlice(coff), member.iai.path(coff).stem(), @@ -6349,32 +6379,32 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { return false; }, .import => |import| { - if (gn.lib_name.unwrap()) |lib_name| + if (gmi.libName(coff).unwrap()) |lib_name| if (!std.ascii.eqlIgnoreCase( import.lib_name.toSlice(coff), lib_name.toSlice(coff), )) break :member; - const name: String.Optional = name: switch (import.name_type) { + const imp_name: String.Optional = name: switch (import.name_type) { .NAME, .NAME_NOPREFIX, .NAME_UNDECORATE, => |tag| { const symbol_name: []const u8 = import.symbol_name.toSlice(coff); - const end_match = std.mem.endsWith(u8, global_name, symbol_name); - const len_delta = global_name.len -% symbol_name.len; + const end_match = std.mem.endsWith(u8, name_slice, symbol_name); + const len_delta = name_slice.len -% symbol_name.len; if (!end_match or (!imp_match and len_delta != 0) or (imp_match and len_delta != imp_prefix.len)) return comp.link_diags.fail( "global '{s}' has mismatched symbol name in import header: '{s}'", .{ - gn.name.toSlice(coff), + name.toSlice(coff), import.symbol_name.toSlice(coff), }, ); - const name = if (tag == .NAME) import.symbol_name else undecorated: { + const imp_name = if (tag == .NAME) import.symbol_name else undecorated: { var imp_name = std.mem.trimStart(u8, symbol_name, "?@_"); if (tag == .NAME_UNDECORATE) imp_name = std.mem.sliceTo(imp_name, '@'); @@ -6383,7 +6413,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { break :undecorated coff.getOrPutStringAssumeCapacity(imp_name); }; - break :name name.toOptional(); + break :name imp_name.toOptional(); }, .ORDINAL => break :name .none, else => |t| return comp.link_diags.fail("TODO handle name_type {t}", .{t}), @@ -6391,7 +6421,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { break :import .{ .lib_name = import.lib_name, - .name = name, + .name = imp_name, .ordinal_hint = import.import_ordinal_hint, .kind = if (import.type == .CODE and !is_imp) .thunk else .iat_ptr, }; @@ -6414,7 +6444,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { const alias_gop = try coff.getOrPutGlobalSymbol(.{ .name = sym.value.weak_alias_name.toSlice(coff), }); - try coff.aliasGlobal(gmi, alias_gop.value_ptr.*); + try coff.aliasGlobal(gmi, alias_gop.value_ptr.si); return true; }, else => {}, @@ -6422,8 +6452,8 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { // If there was an object that had the alternate name, we've attempted to load it if (opt_alt_search_name) |alt_search_name| { - if (coff.globals.get(.{ .name = alt_search_name, .lib_name = .none })) |alias_si| { - try coff.aliasGlobal(gmi, alias_si); + if (coff.globals.get(alt_search_name)) |alias_global| { + try coff.aliasGlobal(gmi, alias_global.si); return true; } } @@ -6432,9 +6462,9 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { // This is necessary for certain ntdll symbols, such as LdrRegisterDllNotification, // which are not in the implib. if (sym.flags.type != .unknown) { - if (gn.lib_name.unwrap()) |lib_name| break :import .{ + if (gmi.libName(coff).unwrap()) |lib_name| break :import .{ .lib_name = lib_name, - .name = gn.name.toOptional(), + .name = name.toOptional(), .ordinal_hint = 0, .kind = if (sym.flags.type == .code) .thunk else .iat_ptr, }; @@ -6525,7 +6555,7 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { log.debug( "flushGlobalImport({s}, {?s}, {d}, {s})", - .{ gn.name.toSlice(coff), import.name.toSlice(coff), import.ordinal_hint, lib_name }, + .{ name.toSlice(coff), import.name.toSlice(coff), import.ordinal_hint, lib_name }, ); const iat_symbol_gop = try coff.import_table.iat_symbol_indices.getOrPut(gpa, .{ @@ -6544,11 +6574,11 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { const import_address_table_ni = gop.value_ptr.import_address_table_si.node(coff); try import_address_table_ni.resize(&coff.mf, gpa, new_symbol_table_size); - const opt_name = import.name.toSlice(coff); - const opt_import_hint_name_index = if (opt_name) |name| blk: { + const opt_imp_name = import.name.toSlice(coff); + const opt_import_hint_name_index = if (opt_imp_name) |imp_name| blk: { const import_hint_name_index = gop.value_ptr.hint_name_len; gop.value_ptr.hint_name_len = @intCast( - import_hint_name_align.forward(import_hint_name_index + 2 + name.len + 1), + import_hint_name_align.forward(import_hint_name_index + 2 + imp_name.len + 1), ); try gop.value_ptr.import_hint_name_table_ni.resize(&coff.mf, gpa, gop.value_ptr.hint_name_len); break :blk import_hint_name_index; @@ -6558,8 +6588,8 @@ fn flushGlobal(coff: *Coff, gmi: Node.GlobalMapIndex) !bool { const import_hint_name_slice = gop.value_ptr.import_hint_name_table_ni.slice(&coff.mf); const ordinal_hint: *u16 = @ptrCast(@alignCast(import_hint_name_slice[import_hint_name_index..][0..2])); ordinal_hint.* = std.mem.nativeTo(u16, import.ordinal_hint, target_endian); - @memcpy(import_hint_name_slice[import_hint_name_index + 2 ..][0..opt_name.?.len], opt_name.?); - @memset(import_hint_name_slice[import_hint_name_index + 2 + opt_name.?.len ..], 0); + @memcpy(import_hint_name_slice[import_hint_name_index + 2 ..][0..opt_imp_name.?.len], opt_imp_name.?); + @memset(import_hint_name_slice[import_hint_name_index + 2 + opt_imp_name.?.len ..], 0); break :blk coff.computeNodeRva(gop.value_ptr.import_hint_name_table_ni) + import_hint_name_index; } else 0; @@ -6687,7 +6717,7 @@ fn flushSpecialSymbol(coff: *Coff, pending: SpecialSymbol) !SpecialSymbol { if (entry_si != .null) { log.debug( "entry({s}, {d})", - .{ entry_si.get(coff).gmi.globalName(coff).name.toSlice(coff), entry_si }, + .{ entry_si.get(coff).gmi.name(coff).toSlice(coff), entry_si }, ); try coff.symbols.ensureUnusedCapacity(gpa, 1); @@ -7379,10 +7409,7 @@ fn updateExportsInner( const name = @"export".opts.name.toSlice(ip); // TODO: add an errMsg if this conflicts with an existing symbol - const export_si = try coff.globalSymbol(.{ - .name = name, - .lib_name = null, - }); + const export_si = try coff.globalSymbol(.{ .name = name }); const export_sym = export_si.get(coff); export_sym.ni = exported_ni; export_sym.rva = exported_sym.rva; @@ -7605,6 +7632,8 @@ fn printSymbol( } else { try w.writeAll("| "); try coff.printNodeName(w, tid, node); + if (sym.flags.extra_tag == .isli) + try w.print(" | {s}", .{sym.extra.isli.name(coff).toSlice(coff)}); try w.writeByte('\n'); } } @@ -7617,9 +7646,8 @@ fn fmtGlobalName(coff: *Coff, gmi: Node.GlobalMapIndex) std.fmt.Alt(FmtGlobalNam fn globalNameEscape(data: FmtGlobalName, w: *std.Io.Writer) std.Io.Writer.Error!void { if (data.gmi == .none) return; - const gn = data.gmi.globalName(data.coff); - try w.writeAll(gn.name.toSlice(data.coff)); - if (gn.lib_name.unwrap()) |lib_name| + try w.writeAll(data.gmi.name(data.coff).toSlice(data.coff)); + if (data.gmi.libName(data.coff).unwrap()) |lib_name| try w.print("({s})", .{lib_name.toSlice(data.coff)}); } @@ -7645,7 +7673,7 @@ fn printNodeName( if (is.comdat_si != .null) { const comdat_sym = is.comdat_si.get(coff); const comdat_name = if (comdat_sym.gmi != .none) - comdat_sym.gmi.globalName(coff).name.toSlice(coff) + comdat_sym.gmi.name(coff).toSlice(coff) else coff.input_symbols.items[@intFromEnum(comdat_sym.extra.isli)].name.toSlice(coff); @@ -7664,10 +7692,9 @@ fn printNodeName( }), .import_thunk, => |gmi| { - const gn = gmi.globalName(coff); try w.writeByte('('); - if (gn.lib_name.toSlice(coff)) |lib_name| try w.print("{s}.dll, ", .{lib_name}); - try w.print("{s})", .{gn.name.toSlice(coff)}); + if (gmi.libName(coff).toSlice(coff)) |lib_name| try w.print("{s}.dll, ", .{lib_name}); + try w.print("{s})", .{gmi.name(coff).toSlice(coff)}); }, .nav => |nmi| { const zcu = coff.base.comp.zcu.?; @@ -7695,10 +7722,9 @@ fn printNodeName( .builtin => |si| { const sym = si.get(coff); if (sym.gmi != .none) { - const gn = sym.gmi.globalName(coff); try w.writeByte('('); - if (gn.lib_name.toSlice(coff)) |lib_name| try w.print("{s}.dll, ", .{lib_name}); - try w.print("{s})", .{gn.name.toSlice(coff)}); + if (sym.gmi.libName(coff).toSlice(coff)) |lib_name| try w.print("{s}.dll, ", .{lib_name}); + try w.print("{s})", .{sym.gmi.name(coff).toSlice(coff)}); } }, }