diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -24,6 +24,7 @@ #include "lld/Common/ErrorHandler.h" #include "lld/Common/LLVM.h" #include "lld/Common/Memory.h" +#include "lld/Common/Reproduce.h" #include "lld/Common/Version.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/StringExtras.h" @@ -230,11 +231,17 @@ std::vector v; Error err = Error::success(); + + // Thin archives refer to .o files, so --reproduces needs the .o files too. + bool addToTar = archive->isThin() && tar; + for (const Archive::Child &c : archive->children(err)) { MemoryBufferRef mbref = CHECK(c.getMemoryBufferRef(), mb.getBufferIdentifier() + ": could not get the buffer for a child of the archive"); + if (addToTar) + tar->append(relativeToRoot(check(c.getFullName())), mbref.getBuffer()); uint32_t modTime = toTimeT( CHECK(c.getLastModified(), mb.getBufferIdentifier() + ": could not get the modification " diff --git a/lld/MachO/InputFiles.cpp b/lld/MachO/InputFiles.cpp --- a/lld/MachO/InputFiles.cpp +++ b/lld/MachO/InputFiles.cpp @@ -610,6 +610,9 @@ ": could not get the buffer for the member defining symbol " + toMachOString(sym)); + if (tar && c.getParent()->isThin()) + tar->append(relativeToRoot(CHECK(c.getFullName(), this)), mb.getBuffer()); + uint32_t modTime = toTimeT( CHECK(c.getLastModified(), toString(this) + ": could not get the modification time " diff --git a/lld/test/MachO/reproduce-thin-archives.s b/lld/test/MachO/reproduce-thin-archives.s new file mode 100644 --- /dev/null +++ b/lld/test/MachO/reproduce-thin-archives.s @@ -0,0 +1,20 @@ +# REQUIRES: x86 + +# RUN: rm -rf %t.dir +# RUN: mkdir -p %t.dir +# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos %s -o %t.dir/foo.o +# RUN: cd %t.dir +# RUN: llvm-ar rcsT foo.a foo.o + +# RUN: %lld foo.a -o /dev/null --reproduce repro.tar +# RUN: tar tf repro.tar | FileCheck -DPATH='repro/%:t.dir' %s + +# RUN: %lld -all_load foo.a -o /dev/null --reproduce repro2.tar +# RUN: tar tf repro2.tar | FileCheck -DPATH='repro2/%:t.dir' %s + +# CHECK-DAG: [[PATH]]/foo.a +# CHECK-DAG: [[PATH]]/foo.o + +.globl _main +_main: + nop