summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Driver.cpp2
-rw-r--r--lld/ELF/SymbolTable.cpp39
-rw-r--r--lld/test/ELF/Inputs/trace-ar1.s2
-rw-r--r--lld/test/ELF/Inputs/trace-ar2.s2
-rw-r--r--lld/test/ELF/trace-ar.s21
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
OpenPOWER on IntegriCloud