forked from OSchip/llvm-project
[mac/lld] Make --reproduce work with thin archives
See http://reviews.llvm.org/rL268229 and http://reviews.llvm.org/rL313832 which did the same for the ELF port. Differential Revision: https://reviews.llvm.org/D92456
This commit is contained in:
parent
c4a0405902
commit
ca634393fc
|
@ -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 @@ static std::vector<ArchiveMember> getArchiveMembers(MemoryBufferRef mb) {
|
|||
|
||||
std::vector<ArchiveMember> 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 "
|
||||
|
|
|
@ -610,6 +610,9 @@ void ArchiveFile::fetch(const object::Archive::Symbol &sym) {
|
|||
": 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 "
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue