[lld] r306587 - Define Symbol::copyBody function.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 28 12:28:50 PDT 2017
Author: ruiu
Date: Wed Jun 28 12:28:49 2017
New Revision: 306587
URL: http://llvm.org/viewvc/llvm-project?rev=306587&view=rev
Log:
Define Symbol::copyBody function.
This patch adds a utility function to Symbol. This function should
be useful in https://reviews.llvm.org/D33680 too.
Modified:
lld/trunk/ELF/SymbolTable.cpp
lld/trunk/ELF/Symbols.cpp
lld/trunk/ELF/Symbols.h
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=306587&r1=306586&r2=306587&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Wed Jun 28 12:28:49 2017
@@ -195,14 +195,8 @@ template <class ELFT> void SymbolTable<E
for (auto &KV : Config->RenamedSymbols) {
Symbol *Dst = KV.first;
Symbol *Src = KV.second.Target;
+ Dst->copyBody(Src);
Dst->Binding = KV.second.OriginalBinding;
-
- // We rename symbols by replacing the old symbol's SymbolBody with
- // the new symbol's SymbolBody. The only attribute we want to keep
- // is the symbol name, so that two symbols don't have the same name.
- StringRef S = Dst->body()->getName();
- memcpy(Dst->Body.buffer, Src->Body.buffer, sizeof(Symbol::Body));
- Dst->body()->setName(S);
}
}
Modified: lld/trunk/ELF/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=306587&r1=306586&r2=306587&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.cpp (original)
+++ lld/trunk/ELF/Symbols.cpp Wed Jun 28 12:28:49 2017
@@ -348,6 +348,20 @@ bool Symbol::includeInDynsym() const {
(body()->isUndefined() && Config->Shared);
}
+// copyBody overwrites all attributes except symbol name with Other's
+// so that this symbol becomes an alias to Other. This is useful for
+// handling some options such as --wrap.
+//
+// The reason why we want to keep the symbol name is because, if we
+// copy symbol names, we'll end up having symbol tables in resulting
+// executables or DSOs containing two identical symbols, which is just
+// inconvenient.
+void Symbol::copyBody(Symbol *Other) {
+ StringRef S = body()->getName();
+ memcpy(this->Body.buffer, Other->Body.buffer, sizeof(Symbol::Body));
+ body()->setName(S);
+}
+
// Print out a log message for --trace-symbol.
void elf::printTraceSymbol(Symbol *Sym) {
SymbolBody *B = Sym->body();
Modified: lld/trunk/ELF/Symbols.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=306587&r1=306586&r2=306587&view=diff
==============================================================================
--- lld/trunk/ELF/Symbols.h (original)
+++ lld/trunk/ELF/Symbols.h Wed Jun 28 12:28:49 2017
@@ -379,6 +379,8 @@ struct Symbol {
SymbolBody *body() { return reinterpret_cast<SymbolBody *>(Body.buffer); }
const SymbolBody *body() const { return const_cast<Symbol *>(this)->body(); }
+
+ void copyBody(Symbol *Other);
};
void printTraceSymbol(Symbol *Sym);
More information about the llvm-commits
mailing list