authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2026-06-05 01:55:34-04:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2026-06-23 00:22:41-04:00
log84142ad56bb22105f23a357201973a91a90e21b9
tree2578de012171be445a7609912aca581fc902db35
parent0bfa6e41e9654d35d79ce4b617180a86eb5a2c3d

Coff: support build-obj

- Fix MappedFile.nodeResize causing USER_MAPPED_FILE when resizing the root node when the requested size is smaller than the previous resize + growth factor.

1 files changed, 15 insertions(+), 11 deletions(-)

src/link/Coff.zig+15-11
......@@ -149,7 +149,6 @@ pub const Node = union(enum) {
149149 header,
150150 /// Images and archives only.
151151 signature,
152
153152 /// Archives only.
154153 archive_member_header: Member.Index,
155154 archive_member: Member.Index,
......@@ -159,6 +158,7 @@ pub const Node = union(enum) {
159158 optional_header,
160159 /// Image only
161160 data_directories,
161
162162 section_table,
163163 // Archives and objects only
164164 symbol_table,
......@@ -1201,6 +1201,15 @@ fn isArchive(coff: *const Coff) bool {
12011201 };
12021202}
12031203
1204fn isObj(coff: *const Coff) bool {
1205 return coff.base.comp.config.output_mode == .Obj;
1206}
1207
1208fn zcuSectionParent(coff: *Coff) MappedFile.Node.Index {
1209 assert(coff.base.comp.zcu != null);
1210 return if (coff.isArchive()) Node.known.zcu_member else Node.known.file;
1211}
1212
12041213fn initHeaders(
12051214 coff: *Coff,
12061215 machine: std.coff.IMAGE.FILE.MACHINE,
......@@ -1261,7 +1270,7 @@ fn initHeaders(
12611270 const archive_signature = "!<arch>\n";
12621271
12631272 const signature_ni = Node.known.signature;
1264 assert(signature_ni == try coff.mf.addLastChildNode(gpa, if (is_image) header_ni else Node.known.file, .{
1273 assert(signature_ni == try coff.mf.addLastChildNode(gpa, if (is_image or !is_archive) header_ni else Node.known.file, .{
12651274 .size = if (is_image)
12661275 msdos_stub.len + pe_signature.len
12671276 else if (is_archive)
......@@ -2448,12 +2457,7 @@ fn addSection(coff: *Coff, name: []const u8, flags: std.coff.SectionHeader.Flags
24482457 @sizeOf(std.coff.SectionHeader) * section_table_len,
24492458 );
24502459
2451 const parent_ni = if (coff.isArchive())
2452 Node.known.zcu_member
2453 else
2454 Node.known.file;
2455
2456 const ni = try coff.mf.addLastChildNode(gpa, parent_ni, .{
2460 const ni = try coff.mf.addLastChildNode(gpa, coff.zcuSectionParent(), .{
24572461 .alignment = coff.mf.flags.block_size,
24582462 .moved = true,
24592463 .bubbles_moved = false,
......@@ -2652,7 +2656,7 @@ pub fn addReloc(
26522656 const new_size = new_num_relocations * std.coff.Relocation.sizeOf();
26532657 if (section.relocation_table_ni == .none) {
26542658 try coff.nodes.ensureUnusedCapacity(gpa, 1);
2655 section.relocation_table_ni = try coff.mf.addLastChildNode(gpa, Node.known.zcu_member, .{
2659 section.relocation_table_ni = try coff.mf.addLastChildNode(gpa, coff.zcuSectionParent(), .{
26562660 .size = new_size,
26572661 .alignment = .@"2",
26582662 .moved = true,
......@@ -3308,7 +3312,7 @@ fn flushGlobal(coff: *Coff, pt: Zcu.PerThread, gmi: Node.GlobalMapIndex) !void {
33083312 const si = gmi.symbol(coff);
33093313 try coff.pendingSymbolTableEntry(si);
33103314
3311 if (si.get(coff).ni != .none)
3315 if (coff.isArchive() and si.get(coff).ni != .none)
33123316 try coff.ensureMemberSymbol(
33133317 gn.name,
33143318 coff.getNode(Node.known.zcu_member).archive_member,
......@@ -3542,7 +3546,7 @@ fn flushMoved(coff: *Coff, ni: MappedFile.Node.Index) !void {
35423546 .data_directories,
35433547 .section_table,
35443548 .placeholder,
3545 => if (coff.isImage()) unreachable,
3549 => assert(!coff.isImage()),
35463550 .symbol_table => {
35473551 coff.targetStore(
35483552 &coff.headerPtr().pointer_to_symbol_table,