diff options
author | Hans Wennborg <hans@hanshq.net> | 2019-08-26 08:33:44 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2019-08-26 08:33:44 +0000 |
commit | 34438eeb1452c44772ea5d279e7f5ba808d54b0a (patch) | |
tree | 0e4bc6d0dfcf96373b02e5270a630f151e83ff58 | |
parent | 86a75cba21952f51b52b5b00fd09ff3123956589 (diff) |
Merging r366573:
------------------------------------------------------------------------
r366573 | nico | 2019-07-19 15:29:10 +0200 (Fri, 19 Jul 2019) | 6 lines
lld-link: Demangle symbols from archives in diagnostics
Also add test coverage for thin archives (which are the only way I could
come up with to test at least some of the diagnostic changes).
Differential Revision: https://reviews.llvm.org/D64927
------------------------------------------------------------------------
git-svn-id: https://llvm.org/svn/llvm-project/lld/branches/release_90@369881 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | COFF/Driver.cpp | 15 | ||||
-rw-r--r-- | COFF/Driver.h | 2 | ||||
-rw-r--r-- | COFF/InputFiles.cpp | 9 | ||||
-rw-r--r-- | COFF/InputFiles.h | 2 | ||||
-rw-r--r-- | COFF/SymbolTable.cpp | 8 | ||||
-rw-r--r-- | COFF/SymbolTable.h | 2 | ||||
-rw-r--r-- | COFF/Symbols.cpp | 11 | ||||
-rw-r--r-- | COFF/Symbols.h | 1 | ||||
-rw-r--r-- | test/COFF/thin-archive.s | 8 |
9 files changed, 32 insertions, 26 deletions
diff --git a/COFF/Driver.cpp b/COFF/Driver.cpp index 467eef232..66ed16131 100644 --- a/COFF/Driver.cpp +++ b/COFF/Driver.cpp @@ -271,13 +271,12 @@ void LinkerDriver::addArchiveBuffer(MemoryBufferRef mb, StringRef symName, } void LinkerDriver::enqueueArchiveMember(const Archive::Child &c, - StringRef symName, + const Archive::Symbol &sym, StringRef parentName) { - auto reportBufferError = [=](Error &&e, - StringRef childName) { + auto reportBufferError = [=](Error &&e, StringRef childName) { fatal("could not get the buffer for the member defining symbol " + - symName + ": " + parentName + "(" + childName + "): " + + toString(sym) + ": " + parentName + "(" + childName + "): " + toString(std::move(e))); }; @@ -288,7 +287,7 @@ void LinkerDriver::enqueueArchiveMember(const Archive::Child &c, reportBufferError(mbOrErr.takeError(), check(c.getFullName())); MemoryBufferRef mb = mbOrErr.get(); enqueueTask([=]() { - driver->addArchiveBuffer(mb, symName, parentName, offsetInArchive); + driver->addArchiveBuffer(mb, toString(sym), parentName, offsetInArchive); }); return; } @@ -296,15 +295,15 @@ void LinkerDriver::enqueueArchiveMember(const Archive::Child &c, std::string childName = CHECK( c.getFullName(), "could not get the filename for the member defining symbol " + - symName); + toString(sym)); auto future = std::make_shared<std::future<MBErrPair>>( createFutureForFile(childName)); enqueueTask([=]() { auto mbOrErr = future->get(); if (mbOrErr.second) reportBufferError(errorCodeToError(mbOrErr.second), childName); - driver->addArchiveBuffer(takeBuffer(std::move(mbOrErr.first)), symName, - parentName, /* OffsetInArchive */ 0); + driver->addArchiveBuffer(takeBuffer(std::move(mbOrErr.first)), + toString(sym), parentName, /*OffsetInArchive=*/0); }); } diff --git a/COFF/Driver.h b/COFF/Driver.h index 6100c3ca0..01bfb02a5 100644 --- a/COFF/Driver.h +++ b/COFF/Driver.h @@ -72,7 +72,7 @@ public: void parseDirectives(InputFile *file); // Used by ArchiveFile to enqueue members. - void enqueueArchiveMember(const Archive::Child &c, StringRef symName, + void enqueueArchiveMember(const Archive::Child &c, const Archive::Symbol &sym, StringRef parentName); MemoryBufferRef takeBuffer(std::unique_ptr<MemoryBuffer> mb); diff --git a/COFF/InputFiles.cpp b/COFF/InputFiles.cpp index c00d5c5b4..c72fa587a 100644 --- a/COFF/InputFiles.cpp +++ b/COFF/InputFiles.cpp @@ -85,16 +85,15 @@ void ArchiveFile::parse() { } // Returns a buffer pointing to a member file containing a given symbol. -void ArchiveFile::addMember(const Archive::Symbol *sym) { - const Archive::Child &c = - CHECK(sym->getMember(), - "could not get the member for symbol " + sym->getName()); +void ArchiveFile::addMember(const Archive::Symbol &sym) { + const Archive::Child &c = CHECK( + sym.getMember(), "could not get the member for symbol " + toString(sym)); // Return an empty buffer if we have already returned the same buffer. if (!seen.insert(c.getChildOffset()).second) return; - driver->enqueueArchiveMember(c, sym->getName(), getName()); + driver->enqueueArchiveMember(c, sym, getName()); } std::vector<MemoryBufferRef> getArchiveMembers(Archive *file) { diff --git a/COFF/InputFiles.h b/COFF/InputFiles.h index dfad9814a..8d3a021a3 100644 --- a/COFF/InputFiles.h +++ b/COFF/InputFiles.h @@ -96,7 +96,7 @@ public: // Enqueues an archive member load for the given symbol. If we've already // enqueued a load for the same archive member, this function does nothing, // which ensures that we don't load the same member more than once. - void addMember(const Archive::Symbol *sym); + void addMember(const Archive::Symbol &sym); private: std::unique_ptr<Archive> file; diff --git a/COFF/SymbolTable.cpp b/COFF/SymbolTable.cpp index 0aff164ee..07ebf6ea5 100644 --- a/COFF/SymbolTable.cpp +++ b/COFF/SymbolTable.cpp @@ -179,7 +179,7 @@ void SymbolTable::loadMinGWAutomaticImports() { log("Loading lazy " + l->getName() + " from " + l->file->getName() + " for automatic import"); l->pendingArchiveLoad = true; - l->file->addMember(&l->sym); + l->file->addMember(l->sym); } } @@ -363,13 +363,13 @@ Symbol *SymbolTable::addUndefined(StringRef name, InputFile *f, if (auto *l = dyn_cast<Lazy>(s)) { if (!s->pendingArchiveLoad) { s->pendingArchiveLoad = true; - l->file->addMember(&l->sym); + l->file->addMember(l->sym); } } return s; } -void SymbolTable::addLazy(ArchiveFile *f, const Archive::Symbol sym) { +void SymbolTable::addLazy(ArchiveFile *f, const Archive::Symbol &sym) { StringRef name = sym.getName(); Symbol *s; bool wasInserted; @@ -382,7 +382,7 @@ void SymbolTable::addLazy(ArchiveFile *f, const Archive::Symbol sym) { if (!u || u->weakAlias || s->pendingArchiveLoad) return; s->pendingArchiveLoad = true; - f->addMember(&sym); + f->addMember(sym); } void SymbolTable::reportDuplicate(Symbol *existing, InputFile *newFile) { diff --git a/COFF/SymbolTable.h b/COFF/SymbolTable.h index 88f47cbe9..50e7e9ba1 100644 --- a/COFF/SymbolTable.h +++ b/COFF/SymbolTable.h @@ -83,7 +83,7 @@ public: Symbol *addAbsolute(StringRef n, uint64_t va); Symbol *addUndefined(StringRef name, InputFile *f, bool isWeakAlias); - void addLazy(ArchiveFile *f, const Archive::Symbol sym); + void addLazy(ArchiveFile *f, const Archive::Symbol &sym); Symbol *addAbsolute(StringRef n, COFFSymbolRef s); Symbol *addRegular(InputFile *f, StringRef n, const llvm::object::coff_symbol_generic *s = nullptr, diff --git a/COFF/Symbols.cpp b/COFF/Symbols.cpp index 3583d4cb2..c1eb75ff7 100644 --- a/COFF/Symbols.cpp +++ b/COFF/Symbols.cpp @@ -20,18 +20,21 @@ using namespace llvm::object; using namespace lld::coff; +namespace lld { + static_assert(sizeof(SymbolUnion) <= 48, "symbols should be optimized for memory usage"); // Returns a symbol name for an error message. -std::string lld::toString(coff::Symbol &b) { +static std::string demangle(StringRef symName) { if (config->demangle) - if (Optional<std::string> s = lld::demangleMSVC(b.getName())) + if (Optional<std::string> s = demangleMSVC(symName)) return *s; - return b.getName(); + return symName; } +std::string toString(coff::Symbol &b) { return demangle(b.getName()); } +std::string toString(const Archive::Symbol &b) { return demangle(b.getName()); } -namespace lld { namespace coff { StringRef Symbol::getName() { diff --git a/COFF/Symbols.h b/COFF/Symbols.h index 86cd4f585..77ae2f157 100644 --- a/COFF/Symbols.h +++ b/COFF/Symbols.h @@ -430,6 +430,7 @@ void replaceSymbol(Symbol *s, ArgT &&... arg) { } // namespace coff std::string toString(coff::Symbol &b); +std::string toString(const coff::Archive::Symbol &b); } // namespace lld #endif diff --git a/test/COFF/thin-archive.s b/test/COFF/thin-archive.s index f24911de4..6eb896c57 100644 --- a/test/COFF/thin-archive.s +++ b/test/COFF/thin-archive.s @@ -11,14 +11,18 @@ # RUN: FileCheck --allow-empty %s # RUN: lld-link /entry:main %t.main.obj %t_thin.lib /out:%t.exe 2>&1 | \ # RUN: FileCheck --allow-empty %s -# RUN: lld-link /entry:main %t.main.obj /wholearchive:%t_thin.lib /out:%t.exe 2>&1 | \ -# RUN: FileCheck --allow-empty %s # RUN: rm %t.lib.obj # RUN: lld-link /entry:main %t.main.obj %t.lib /out:%t.exe 2>&1 | \ # RUN: FileCheck --allow-empty %s +# RUN: not lld-link /entry:main %t.main.obj %t_thin.lib /out:%t.exe 2>&1 | \ +# RUN: FileCheck --check-prefix=NOOBJ %s +# RUN: not lld-link /entry:main %t.main.obj %t_thin.lib /out:%t.exe \ +# RUN: /demangle:no 2>&1 | FileCheck --check-prefix=NOOBJNODEMANGLE %s # CHECK-NOT: error: could not get the buffer for the member defining +# NOOBJ: error: could not get the buffer for the member defining symbol int __cdecl f(void): {{.*}}.lib({{.*}}.lib.obj): +# NOOBJNODEMANGLE: error: could not get the buffer for the member defining symbol ?f@@YAHXZ: {{.*}}.lib({{.*}}.lib.obj): .text |