[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