[lld/COFF] Support thin archives in /reproduce: files (#121512)

This already worked without /wholearchive; now it works with it too.
(Only for thin archives containing relative file names, matching the ELF
and Mach-O ports.)
This commit is contained in:
Nico Weber 2025-01-03 08:20:06 -05:00 committed by GitHub
parent 119fc720a1
commit 6cd171dc33
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 31 additions and 0 deletions

View File

@ -149,11 +149,19 @@ std::vector<MemoryBufferRef>
lld::coff::getArchiveMembers(COFFLinkerContext &ctx, Archive *file) {
std::vector<MemoryBufferRef> v;
Error err = Error::success();
// Thin archives refer to .o files, so --reproduces needs the .o files too.
bool addToTar = file->isThin() && ctx.driver.tar;
for (const Archive::Child &c : file->children(err)) {
MemoryBufferRef mbref =
CHECK(c.getMemoryBufferRef(),
file->getFileName() +
": could not get the buffer for a child of the archive");
if (addToTar) {
ctx.driver.tar->append(relativeToRoot(check(c.getFullName())),
mbref.getBuffer());
}
v.push_back(mbref);
}
if (err)

View File

@ -0,0 +1,23 @@
# REQUIRES: x86
# RUN: rm -rf %t.dir; split-file %s %t.dir
# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-windows %t.dir/foo.s -o %t.dir/foo.obj
# RUN: cd %t.dir
# RUN: llvm-ar rcsT foo.lib foo.obj
# RUN: lld-link foo.lib /out:/dev/null /reproduce:repro.tar \
# RUN: /subsystem:console /machine:x64
# RUN: tar tf repro.tar | FileCheck -DPATH='repro/%:t.dir' %s
# RUN: lld-link /wholearchive foo.lib /out:/dev/null /reproduce:repro2.tar \
# RUN: /subsystem:console /machine:x64
# RUN: tar tf repro2.tar | FileCheck -DPATH='repro2/%:t.dir' %s
# CHECK-DAG: [[PATH]]/foo.lib
# CHECK-DAG: [[PATH]]/foo.obj
#--- foo.s
.globl mainCRTStartup
mainCRTStartup:
nop