aboutsummaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2018-03-29 13:55:23 +0000
committerDimitry Andric <dim@FreeBSD.org>2018-03-29 13:55:23 +0000
commit222ab3169e6a2cf19c05a7dc19f643d431169eb5 (patch)
tree263bab9be134938656cfc40bdf428c8525c22dba /contrib
parent39bb4f84d4e389bae5e242500e5ce1705496fa7b (diff)
downloadsrc-222ab3169e6a2cf19c05a7dc19f643d431169eb5.tar.gz
src-222ab3169e6a2cf19c05a7dc19f643d431169eb5.zip
Pull in r328738 from upstream lld trunk (by Rafael Espindola):
Strip @VER suffices from the LTO output. This fixes pr36623. The problem is that we have to parse versions out of names before LTO so that LTO can use that information. When we get the LTO produced .o files, we replace the previous symbols with the LTO produced ones, but they still have @ in their names. We could just trim the name directly, but calling parseSymbolVersion to do it is simpler. This is a follow-up to r331366, since we discovered that lld could append version strings to symbols twice, when using Link Time Optimization. MFC after: 3 months X-MFC-With: r327952
Notes
Notes: svn path=/head/; revision=331731
Diffstat (limited to 'contrib')
-rw-r--r--contrib/llvm/tools/lld/ELF/InputFiles.cpp4
-rw-r--r--contrib/llvm/tools/lld/ELF/InputFiles.h1
-rw-r--r--contrib/llvm/tools/lld/ELF/SymbolTable.cpp5
3 files changed, 9 insertions, 1 deletions
diff --git a/contrib/llvm/tools/lld/ELF/InputFiles.cpp b/contrib/llvm/tools/lld/ELF/InputFiles.cpp
index ccf4b3d7673f..52c65dd8ee70 100644
--- a/contrib/llvm/tools/lld/ELF/InputFiles.cpp
+++ b/contrib/llvm/tools/lld/ELF/InputFiles.cpp
@@ -281,6 +281,10 @@ template <class ELFT> ArrayRef<Symbol *> ObjFile<ELFT>::getLocalSymbols() {
return makeArrayRef(this->Symbols).slice(1, this->FirstNonLocal - 1);
}
+template <class ELFT> ArrayRef<Symbol *> ObjFile<ELFT>::getGlobalSymbols() {
+ return makeArrayRef(this->Symbols).slice(this->FirstNonLocal);
+}
+
template <class ELFT>
void ObjFile<ELFT>::parse(DenseSet<CachedHashStringRef> &ComdatGroups) {
// Read section and symbol tables.
diff --git a/contrib/llvm/tools/lld/ELF/InputFiles.h b/contrib/llvm/tools/lld/ELF/InputFiles.h
index dda1de81570c..70109f002e98 100644
--- a/contrib/llvm/tools/lld/ELF/InputFiles.h
+++ b/contrib/llvm/tools/lld/ELF/InputFiles.h
@@ -167,6 +167,7 @@ public:
static bool classof(const InputFile *F) { return F->kind() == Base::ObjKind; }
ArrayRef<Symbol *> getLocalSymbols();
+ ArrayRef<Symbol *> getGlobalSymbols();
ObjFile(MemoryBufferRef M, StringRef ArchiveName);
void parse(llvm::DenseSet<llvm::CachedHashStringRef> &ComdatGroups);
diff --git a/contrib/llvm/tools/lld/ELF/SymbolTable.cpp b/contrib/llvm/tools/lld/ELF/SymbolTable.cpp
index c3a00bea4aaa..c41e2b2de748 100644
--- a/contrib/llvm/tools/lld/ELF/SymbolTable.cpp
+++ b/contrib/llvm/tools/lld/ELF/SymbolTable.cpp
@@ -130,7 +130,10 @@ template <class ELFT> void SymbolTable::addCombinedLTOObject() {
for (InputFile *File : LTO->compile()) {
DenseSet<CachedHashStringRef> DummyGroups;
- cast<ObjFile<ELFT>>(File)->parse(DummyGroups);
+ auto *Obj = cast<ObjFile<ELFT>>(File);
+ Obj->parse(DummyGroups);
+ for (Symbol *Sym : Obj->getGlobalSymbols())
+ Sym->parseSymbolVersion();
ObjectFiles.push_back(File);
}
}