diff options
| author | George Rimar <grimar@accesssoftek.com> | 2016-04-13 18:07:57 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2016-04-13 18:07:57 +0000 |
| commit | 2a78fceb2cbedd30ae9493235219be43715d6959 (patch) | |
| tree | c9c3d6b60dc82fd9002b51c784a548ee45266693 | |
| parent | 4ac12425ba3904ba5796b183f635af5c6a25f741 (diff) | |
| download | bcm5719-llvm-2a78fceb2cbedd30ae9493235219be43715d6959.tar.gz bcm5719-llvm-2a78fceb2cbedd30ae9493235219be43715d6959.zip | |
[ELF] - Change -t implementation to print which archive members are used.
Previously each archive file was reported no matter were it's member used or not,
like:
lib/libLLVMSupport.a
Now lld prints line for each used internal file, like:
lib/libLLVMSupport.a(lib/Support/CMakeFiles/LLVMSupport.dir/StringSaver.cpp.o)
lib/libLLVMSupport.a(lib/Support/CMakeFiles/LLVMSupport.dir/Host.cpp.o)
lib/libLLVMSupport.a(lib/Support/CMakeFiles/LLVMSupport.dir/ConvertUTF.c.o)
That should be consistent with what gold do.
This fixes PR27243.
Differential revision: http://reviews.llvm.org/D19011
llvm-svn: 266220
| -rw-r--r-- | lld/ELF/Driver.cpp | 2 | ||||
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 39 | ||||
| -rw-r--r-- | lld/test/ELF/Inputs/trace-ar1.s | 2 | ||||
| -rw-r--r-- | lld/test/ELF/Inputs/trace-ar2.s | 2 | ||||
| -rw-r--r-- | lld/test/ELF/trace-ar.s | 21 |
5 files changed, 47 insertions, 19 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index b5dcc871772..95b1c93aca8 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -98,7 +98,7 @@ LinkerDriver::getArchiveMembers(MemoryBufferRef MB) { // Newly created memory buffers are owned by this driver. void LinkerDriver::addFile(StringRef Path) { using namespace llvm::sys::fs; - if (Config->Verbose || Config->Trace) + if (Config->Verbose) llvm::outs() << Path << "\n"; auto MBOrErr = MemoryBuffer::getFile(Path); if (!MBOrErr) { diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp index 1b2c86fa334..951a29453d4 100644 --- a/lld/ELF/SymbolTable.cpp +++ b/lld/ELF/SymbolTable.cpp @@ -45,6 +45,15 @@ template <class ELFT> static bool isCompatible(InputFile *FileP) { return false; } +// Returns "(internal)", "foo.a(bar.o)" or "baz.o". +static std::string getFilename(InputFile *F) { + if (!F) + return "(internal)"; + if (!F->ArchiveName.empty()) + return (F->ArchiveName + "(" + F->getName() + ")").str(); + return F->getName(); +} + // Add symbols in File to the symbol table. template <class ELFT> void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) { @@ -61,6 +70,18 @@ void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) { return; } + // Lazy object file + if (auto *F = dyn_cast<LazyObjectFile>(FileP)) { + LazyObjectFiles.emplace_back(cast<LazyObjectFile>(File.release())); + F->parse(); + for (Lazy &Sym : F->getLazySymbols()) + addLazy(&Sym); + return; + } + + if (Config->Trace) + llvm::outs() << getFilename(FileP) << "\n"; + // .so file if (auto *F = dyn_cast<SharedFile<ELFT>>(FileP)) { // DSOs are uniquified not by filename but by soname. @@ -85,15 +106,6 @@ void SymbolTable<ELFT>::addFile(std::unique_ptr<InputFile> File) { return; } - // Lazy object file - if (auto *F = dyn_cast<LazyObjectFile>(FileP)) { - LazyObjectFiles.emplace_back(cast<LazyObjectFile>(File.release())); - F->parse(); - for (Lazy &Sym : F->getLazySymbols()) - addLazy(&Sym); - return; - } - // Regular object file auto *F = cast<ObjectFile<ELFT>>(FileP); ObjectFiles.emplace_back(cast<ObjectFile<ELFT>>(File.release())); @@ -206,15 +218,6 @@ template <class ELFT> InputFile *SymbolTable<ELFT>::findFile(SymbolBody *B) { return nullptr; } -// Returns "(internal)", "foo.a(bar.o)" or "baz.o". -static std::string getFilename(InputFile *F) { - if (!F) - return "(internal)"; - if (!F->ArchiveName.empty()) - return (F->ArchiveName + "(" + F->getName() + ")").str(); - return F->getName(); -} - // Construct a string in the form of "Sym in File1 and File2". // Used to construct an error message. template <class ELFT> diff --git a/lld/test/ELF/Inputs/trace-ar1.s b/lld/test/ELF/Inputs/trace-ar1.s new file mode 100644 index 00000000000..0292bae6b4d --- /dev/null +++ b/lld/test/ELF/Inputs/trace-ar1.s @@ -0,0 +1,2 @@ +.globl _used +_used: diff --git a/lld/test/ELF/Inputs/trace-ar2.s b/lld/test/ELF/Inputs/trace-ar2.s new file mode 100644 index 00000000000..d56f304c82f --- /dev/null +++ b/lld/test/ELF/Inputs/trace-ar2.s @@ -0,0 +1,2 @@ +.globl _notused +_notused: diff --git a/lld/test/ELF/trace-ar.s b/lld/test/ELF/trace-ar.s new file mode 100644 index 00000000000..1d178dc9dd3 --- /dev/null +++ b/lld/test/ELF/trace-ar.s @@ -0,0 +1,21 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.foo.o +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/trace-ar1.s -o %t.obj1.o +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/trace-ar2.s -o %t.obj2.o +# RUN: llvm-ar rcs %t.boo.a %t.obj1.o %t.obj2.o + +## Check how -t works with achieves +# RUN: ld.lld %t.foo.o %t.boo.a -o %t.out -t 2>&1 | FileCheck %s +# CHECK: {{.*}}.foo.o +# CHECK-NEXT: {{.*}}.boo.a({{.*}}.obj1.o) +# CHECK-NOT: {{.*}}.boo.a({{.*}}.obj2.o) + +## Test output with --start-lib +# RUN: ld.lld %t.foo.o --start-lib %t.obj1.o %t.obj2.o -o %t.out -t 2>&1 | FileCheck --check-prefix=STARTLIB %s +# STARTLIB: {{.*}}.foo.o +# STARTLIB-NEXT: {{.*}}.obj1.o +# STARTLIB-NOT: {{.*}}.obj2.o + +.globl _start, _used +_start: + call _used |

