<div dir="auto"><div><br><div class="gmail_extra"><br><div class="gmail_quote">On Oct 31, 2017 09:10, "Rui Ueyama via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ruiu<br>
Date: Tue Oct 31 09:10:24 2017<br>
New Revision: 317007<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=317007&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=317007&view=rev</a><br>
Log:<br>
[COFF] Merge Symbol and SymbolBody.<br>
<br>
Modified:<br>
    lld/trunk/COFF/Config.h<br>
    lld/trunk/COFF/Driver.cpp<br>
    lld/trunk/COFF/InputFiles.cpp<br>
    lld/trunk/COFF/InputFiles.h<br>
    lld/trunk/COFF/LTO.cpp<br>
    lld/trunk/COFF/PDB.cpp<br>
    lld/trunk/COFF/SymbolTable.cpp<br>
    lld/trunk/COFF/SymbolTable.h<br>
    lld/trunk/COFF/Symbols.h<br>
    lld/trunk/COFF/Writer.cpp<br>
<br>
Modified: lld/trunk/COFF/Config.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Config.h?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/Config.<wbr>h?rev=317007&r1=317006&r2=<wbr>317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/Config.h (original)<br>
+++ lld/trunk/COFF/Config.h Tue Oct 31 09:10:24 2017<br>
@@ -27,7 +27,6 @@ using llvm::StringRef;<br>
 class DefinedAbsolute;<br>
 class DefinedRelative;<br>
 class StringChunk;<br>
-struct Symbol;<br>
 class SymbolBody;<br>
<br>
 // Short aliases.<br>
@@ -111,8 +110,8 @@ struct Configuration {<br>
   bool SaveTemps = false;<br>
<br>
   // Used for SafeSEH.<br>
-  Symbol *SEHTable = nullptr;<br>
-  Symbol *SEHCount = nullptr;<br>
+  SymbolBody *SEHTable = nullptr;<br>
+  SymbolBody *SEHCount = nullptr;<br>
<br>
   // Used for /opt:lldlto=N<br>
   unsigned LTOOptLevel = 2;<br>
<br>
Modified: lld/trunk/COFF/Driver.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Driver.cpp?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/Driver.<wbr>cpp?rev=317007&r1=317006&r2=<wbr>317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/Driver.cpp (original)<br>
+++ lld/trunk/COFF/Driver.cpp Tue Oct 31 09:10:24 2017<br>
@@ -378,7 +378,7 @@ StringRef LinkerDriver::findDefaultEntry<br>
   };<br>
   for (auto E : Entries) {<br>
     StringRef Entry = Symtab->findMangle(mangle(E[0]<wbr>));<br>
-    if (!Entry.empty() && !isa<Undefined>(Symtab->find(<wbr>Entry)->body()))<br>
+    if (!Entry.empty() && !isa<Undefined>(Symtab->find(<wbr>Entry)))<br>
       return mangle(E[1]);<br>
   }<br>
   return "";<br>
@@ -1181,10 +1181,10 @@ void LinkerDriver::link(ArrayRef<<wbr>const c<br>
     for (auto Pair : Config->AlternateNames) {<br>
       StringRef From = Pair.first;<br>
       StringRef To = Pair.second;<br>
-      Symbol *Sym = Symtab->find(From);<br>
+      SymbolBody *Sym = Symtab->find(From);<br>
       if (!Sym)<br>
         continue;<br>
-      if (auto *U = dyn_cast<Undefined>(Sym->body(<wbr>)))<br>
+      if (auto *U = dyn_cast<Undefined>(Sym))<br>
         if (!U->WeakAlias)<br>
           U->WeakAlias = Symtab->addUndefined(To);<br>
     }<br>
@@ -1237,8 +1237,8 @@ void LinkerDriver::link(ArrayRef<<wbr>const c<br>
                       Args.hasArg(OPT_export_all_<wbr>symbols))) {<br>
     AutoExporter Exporter;<br>
<br>
-    Symtab->forEachSymbol([=](<wbr>Symbol *S) {<br>
-      auto *Def = dyn_cast<Defined>(S->body());<br>
+    Symtab->forEachSymbol([=](<wbr>SymbolBody *S) {<br>
+      auto *Def = dyn_cast<Defined>(S);<br>
       if (!Exporter.shouldExport(Def))<br>
         return;<br>
       Export E;<br>
@@ -1265,13 +1265,13 @@ void LinkerDriver::link(ArrayRef<<wbr>const c<br>
     StringRef Name = Pair.first;<br>
     uint32_t Alignment = Pair.second;<br>
<br>
-    Symbol *Sym = Symtab->find(Name);<br>
+    SymbolBody *Sym = Symtab->find(Name);<br>
     if (!Sym) {<br>
       warn("/aligncomm symbol " + Name + " not found");<br>
       continue;<br>
     }<br>
<br>
-    auto *DC = dyn_cast<DefinedCommon>(Sym-><wbr>body());<br>
+    auto *DC = dyn_cast<DefinedCommon>(Sym);<br>
     if (!DC) {<br>
       warn("/aligncomm symbol " + Name + " of wrong kind");<br>
       continue;<br>
<br>
Modified: lld/trunk/COFF/InputFiles.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.cpp?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/<wbr>InputFiles.cpp?rev=317007&r1=<wbr>317006&r2=317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/InputFiles.cpp (original)<br>
+++ lld/trunk/COFF/InputFiles.cpp Tue Oct 31 09:10:24 2017<br>
@@ -54,7 +54,7 @@ static void checkAndSetWeakAlias(SymbolT<br>
                                  SymbolBody *Source, SymbolBody *Target) {<br>
   if (auto *U = dyn_cast<Undefined>(Source)) {<br>
     if (U->WeakAlias && U->WeakAlias != Target)<br>
-      Symtab->reportDuplicate(<wbr>Source->symbol(), F);<br>
+      Symtab->reportDuplicate(<wbr>Source, F);<br>
     U->WeakAlias = Target;<br>
   }<br>
 }<br>
@@ -215,7 +215,7 @@ void ObjFile::initializeSymbols() {<br>
 SymbolBody *ObjFile::createUndefined(<wbr>COFFSymbolRef Sym) {<br>
   StringRef Name;<br>
   COFFObj->getSymbolName(Sym, Name);<br>
-  return Symtab->addUndefined(Name, this, Sym.isWeakExternal())->body();<br>
+  return Symtab->addUndefined(Name, this, Sym.isWeakExternal());<br>
 }<br>
<br>
 SymbolBody *ObjFile::createDefined(<wbr>COFFSymbolRef Sym, const void *AuxP,<br>
@@ -225,9 +225,9 @@ SymbolBody *ObjFile::createDefined(COFFS<br>
     auto *C = make<CommonChunk>(Sym);<br>
     Chunks.push_back(C);<br>
     COFFObj->getSymbolName(Sym, Name);<br>
-    Symbol *S =<br>
+    SymbolBody *S =<br>
         Symtab->addCommon(this, Name, Sym.getValue(), Sym.getGeneric(), C);<br>
-    return S->body();<br>
+    return S;<br>
   }<br>
   if (Sym.isAbsolute()) {<br>
     COFFObj->getSymbolName(Sym, Name);<br>
@@ -241,7 +241,7 @@ SymbolBody *ObjFile::createDefined(COFFS<br>
       return nullptr;<br>
     }<br>
     if (Sym.isExternal())<br>
-      return Symtab->addAbsolute(Name, Sym)->body();<br>
+      return Symtab->addAbsolute(Name, Sym);<br>
     else<br>
       return make<DefinedAbsolute>(Name, Sym);<br>
   }<br>
@@ -280,9 +280,9 @@ SymbolBody *ObjFile::createDefined(COFFS<br>
   DefinedRegular *B;<br>
   if (Sym.isExternal()) {<br>
     COFFObj->getSymbolName(Sym, Name);<br>
-    Symbol *S =<br>
+    SymbolBody *S =<br>
         Symtab->addRegular(this, Name, SC->isCOMDAT(), Sym.getGeneric(), SC);<br>
-    B = cast<DefinedRegular>(S->body()<wbr>);<br>
+    B = cast<DefinedRegular>(S);<br>
   } else<br>
     B = make<DefinedRegular>(this, /*Name*/ "", SC->isCOMDAT(),<br>
                              /*IsExternal*/ false, Sym.getGeneric(), SC);<br>
@@ -368,7 +368,7 @@ void BitcodeFile::parse() {<br>
       MB.getBuffer(), Saver.save(ParentName + MB.getBufferIdentifier()))));<br>
   for (const lto::InputFile::Symbol &ObjSym : Obj->symbols()) {<br>
     StringRef SymName = Saver.save(ObjSym.getName());<br>
-    Symbol *Sym;<br>
+    SymbolBody *Sym;<br>
     if (ObjSym.isUndefined()) {<br>
       Sym = Symtab->addUndefined(SymName, this, false);<br>
     } else if (ObjSym.isCommon()) {<br>
@@ -378,12 +378,12 @@ void BitcodeFile::parse() {<br>
       Sym = Symtab->addUndefined(SymName, this, true);<br>
       std::string Fallback = ObjSym.<wbr>getCOFFWeakExternalFallback();<br>
       SymbolBody *Alias = Symtab->addUndefined(Saver.<wbr>save(Fallback));<br>
-      checkAndSetWeakAlias(Symtab, this, Sym->body(), Alias);<br>
+      checkAndSetWeakAlias(Symtab, this, Sym, Alias);<br>
     } else {<br>
       bool IsCOMDAT = ObjSym.getComdatIndex() != -1;<br>
       Sym = Symtab->addRegular(this, SymName, IsCOMDAT);<br>
     }<br>
-    SymbolBodies.push_back(Sym-><wbr>body());<br>
+    SymbolBodies.push_back(Sym);<br>
   }<br>
   Directives = Obj->getCOFFLinkerOpts();<br>
 }<br>
<br>
Modified: lld/trunk/COFF/InputFiles.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/InputFiles.h?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/<wbr>InputFiles.h?rev=317007&r1=<wbr>317006&r2=317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/InputFiles.h (original)<br>
+++ lld/trunk/COFF/InputFiles.h Tue Oct 31 09:10:24 2017<br>
@@ -47,7 +47,6 @@ class DefinedImportData;<br>
 class DefinedImportThunk;<br>
 class Lazy;<br>
 class SectionChunk;<br>
-struct Symbol;<br>
 class SymbolBody;<br>
 class Undefined;<br>
<br>
<br>
Modified: lld/trunk/COFF/LTO.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/LTO.cpp?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/LTO.<wbr>cpp?rev=317007&r1=317006&r2=<wbr>317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/LTO.cpp (original)<br>
+++ lld/trunk/COFF/LTO.cpp Tue Oct 31 09:10:24 2017<br>
@@ -88,9 +88,7 @@ BitcodeCompiler::<wbr>BitcodeCompiler() : LTO<br>
<br>
 BitcodeCompiler::~<wbr>BitcodeCompiler() = default;<br>
<br>
-static void undefine(Symbol *S) {<br>
-  replaceBody<Undefined>(S, S->body()->getName());<br>
-}<br>
+static void undefine(SymbolBody *S) { replaceBody<Undefined>(S, S->getName()); }<br>
<br>
 void BitcodeCompiler::add(<wbr>BitcodeFile &F) {<br>
   lto::InputFile &Obj = *F.Obj;<br>
@@ -100,8 +98,7 @@ void BitcodeCompiler::add(<wbr>BitcodeFile &F<br>
<br>
   // Provide a resolution to the LTO API for each symbol.<br>
   for (const lto::InputFile::Symbol &ObjSym : Obj.symbols()) {<br>
-    SymbolBody *B = SymBodies[SymNum];<br>
-    Symbol *Sym = B->symbol();<br>
+    SymbolBody *Sym = SymBodies[SymNum];<br>
     lto::SymbolResolution &R = Resols[SymNum];<br>
     ++SymNum;<br>
<br>
@@ -110,7 +107,7 @@ void BitcodeCompiler::add(<wbr>BitcodeFile &F<br>
     // flags an undefined in IR with a definition in ASM as prevailing.<br>
     // Once IRObjectFile is fixed to report only one symbol this hack can<br>
     // be removed.<br>
-    R.Prevailing = !ObjSym.isUndefined() && B->getFile() == &F;<br>
+    R.Prevailing = !ObjSym.isUndefined() && Sym->getFile() == &F;<br>
     R.VisibleToRegularObj = Sym->IsUsedInRegularObj;<br>
     if (R.Prevailing)<br>
       undefine(Sym);<br>
<br>
Modified: lld/trunk/COFF/PDB.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/PDB.cpp?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/PDB.<wbr>cpp?rev=317007&r1=317006&r2=<wbr>317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/PDB.cpp (original)<br>
+++ lld/trunk/COFF/PDB.cpp Tue Oct 31 09:10:24 2017<br>
@@ -727,9 +727,9 @@ void PDBLinker::addObjectsToPDB() {<br>
   // Compute the public and global symbols.<br>
   auto &GsiBuilder = Builder.getGsiBuilder();<br>
   std::vector<PublicSym32> Publics;<br>
-  Symtab->forEachSymbol([&<wbr>Publics](Symbol *S) {<br>
+  Symtab->forEachSymbol([&<wbr>Publics](SymbolBody *S) {<br>
     // Only emit defined, live symbols that have a chunk.<br>
-    auto *Def = dyn_cast<Defined>(S->body());<br>
+    auto *Def = dyn_cast<Defined>(S);<br>
     if (Def && Def->isLive() && Def->getChunk())<br>
       Publics.push_back(<wbr>createPublic(Def));<br>
   });<br>
<br>
Modified: lld/trunk/COFF/SymbolTable.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.cpp?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/<wbr>SymbolTable.cpp?rev=317007&r1=<wbr>317006&r2=317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/SymbolTable.cpp (original)<br>
+++ lld/trunk/COFF/SymbolTable.cpp Tue Oct 31 09:10:24 2017<br>
@@ -33,17 +33,17 @@ enum SymbolPreference {<br>
 /// Checks if an existing symbol S should be kept or replaced by a new symbol.<br>
 /// Returns SP_EXISTING when S should be kept, SP_NEW when the new symbol<br>
 /// should be kept, and SP_CONFLICT if no valid resolution exists.<br>
-static SymbolPreference compareDefined(Symbol *S, bool WasInserted,<br>
+static SymbolPreference compareDefined(SymbolBody *S, bool WasInserted,<br>
                                        bool NewIsCOMDAT) {<br>
   // If the symbol wasn't previously known, the new symbol wins by default.<br>
-  if (WasInserted || !isa<Defined>(S->body()))<br>
+  if (WasInserted || !isa<Defined>(S))<br>
     return SP_NEW;<br>
<br>
   // If the existing symbol is a DefinedRegular, both it and the new symbol<br>
   // must be comdats. In that case, we have no reason to prefer one symbol<br>
   // over the other, and we keep the existing one. If one of the symbols<br>
   // is not a comdat, we report a conflict.<br>
-  if (auto *R = dyn_cast<DefinedRegular>(S-><wbr>body())) {<br>
+  if (auto *R = dyn_cast<DefinedRegular>(S)) {<br>
     if (NewIsCOMDAT && R->isCOMDAT())<br>
       return SP_EXISTING;<br>
     else<br>
@@ -95,8 +95,8 @@ void SymbolTable::<wbr>reportRemainingUndefin<br>
   SmallPtrSet<SymbolBody *, 8> Undefs;<br>
<br>
   for (auto &I : Symtab) {<br>
-    Symbol *Sym = I.second;<br>
-    auto *Undef = dyn_cast<Undefined>(Sym->body(<wbr>));<br>
+    SymbolBody *Sym = I.second;<br>
+    auto *Undef = dyn_cast<Undefined>(Sym);<br>
     if (!Undef)<br>
       continue;<br>
     if (!Sym->IsUsedInRegularObj)<br>
@@ -106,32 +106,18 @@ void SymbolTable::<wbr>reportRemainingUndefin<br>
<br>
     // A weak alias may have been resolved, so check for that.<br>
     if (Defined *D = Undef->getWeakAlias()) {<br>
-      // We resolve weak aliases by replacing the alias's SymbolBody with the<br>
-      // target's SymbolBody. This causes all SymbolBody pointers referring to<br>
-      // the old symbol to instead refer to the new symbol. However, we can't<br>
-      // just blindly copy sizeof(Symbol::Body) bytes from D to Sym->Body<br>
-      // because D may be an internal symbol, and internal symbols are stored as<br>
-      // "unparented" SymbolBodies. For that reason we need to check which type<br>
-      // of symbol we are dealing with and copy the correct number of bytes.<br>
-      if (isa<DefinedRegular>(D))<br>
-        memcpy(Sym->Body.buffer, D, sizeof(DefinedRegular));<br>
-      else if (isa<DefinedAbsolute>(D))<br>
-        memcpy(Sym->Body.buffer, D, sizeof(DefinedAbsolute));<br>
-      else<br>
-        // No other internal symbols are possible.<br>
-        Sym->Body = D->symbol()->Body;<br>
+      memcpy(Sym, D, sizeof(SymbolUnion));<br></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">I guess it's still possible that we're copying a local symbol that could have been allocated at the end of a page.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
       continue;<br>
     }<br>
<br>
     // If we can resolve a symbol by removing __imp_ prefix, do that.<br>
     // This odd rule is for compatibility with MSVC linker.<br>
     if (Name.startswith("__imp_")) {<br>
-      Symbol *Imp = find(Name.substr(strlen("__<wbr>imp_")));<br>
-      if (Imp && isa<Defined>(Imp->body())) {<br>
-        auto *D = cast<Defined>(Imp->body());<br>
+      SymbolBody *Imp = find(Name.substr(strlen("__<wbr>imp_")));<br>
+      if (Imp && isa<Defined>(Imp)) {<br>
+        auto *D = cast<Defined>(Imp);<br>
         replaceBody<<wbr>DefinedLocalImport>(Sym, Name, D);<br>
-        LocalImportChunks.push_back(<br>
-            cast<DefinedLocalImport>(Sym-><wbr>body())->getChunk());<br>
+        LocalImportChunks.push_back(<wbr>cast<DefinedLocalImport>(Sym)-<wbr>>getChunk());<br>
         continue;<br>
       }<br>
     }<br>
@@ -140,7 +126,7 @@ void SymbolTable::<wbr>reportRemainingUndefin<br>
     // They are replaced with dummy defined symbols.<br>
     if (Config->Force)<br>
       replaceBody<DefinedAbsolute>(<wbr>Sym, Name, 0);<br>
-    Undefs.insert(Sym->body());<br>
+    Undefs.insert(Sym);<br>
   }<br>
<br>
   if (Undefs.empty())<br>
@@ -156,28 +142,28 @@ void SymbolTable::<wbr>reportRemainingUndefin<br>
         errorOrWarn(toString(File) + ": undefined symbol: " + Sym->getName());<br>
 }<br>
<br>
-std::pair<Symbol *, bool> SymbolTable::insert(StringRef Name) {<br>
-  Symbol *&Sym = Symtab[CachedHashStringRef(<wbr>Name)];<br>
+std::pair<SymbolBody *, bool> SymbolTable::insert(StringRef Name) {<br>
+  SymbolBody *&Sym = Symtab[CachedHashStringRef(<wbr>Name)];<br>
   if (Sym)<br>
     return {Sym, false};<br>
-  Sym = make<Symbol>();<br>
+  Sym = (SymbolBody *)make<SymbolUnion>();<br>
   Sym->IsUsedInRegularObj = false;<br>
   Sym->PendingArchiveLoad = false;<br>
   return {Sym, true};<br>
 }<br>
<br>
-Symbol *SymbolTable::addUndefined(<wbr>StringRef Name, InputFile *F,<br>
-                                  bool IsWeakAlias) {<br>
-  Symbol *S;<br>
+SymbolBody *SymbolTable::addUndefined(<wbr>StringRef Name, InputFile *F,<br>
+                                      bool IsWeakAlias) {<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(Name);<br>
   if (!F || !isa<BitcodeFile>(F))<br>
     S->IsUsedInRegularObj = true;<br>
-  if (WasInserted || (isa<Lazy>(S->body()) && IsWeakAlias)) {<br>
+  if (WasInserted || (isa<Lazy>(S) && IsWeakAlias)) {<br>
     replaceBody<Undefined>(S, Name);<br>
     return S;<br>
   }<br>
-  if (auto *L = dyn_cast<Lazy>(S->body())) {<br>
+  if (auto *L = dyn_cast<Lazy>(S)) {<br>
     if (!S->PendingArchiveLoad) {<br>
       S->PendingArchiveLoad = true;<br>
       L->File->addMember(&L->Sym);<br>
@@ -188,66 +174,66 @@ Symbol *SymbolTable::addUndefined(<wbr>String<br>
<br>
 void SymbolTable::addLazy(<wbr>ArchiveFile *F, const Archive::Symbol Sym) {<br>
   StringRef Name = Sym.getName();<br>
-  Symbol *S;<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(Name);<br>
   if (WasInserted) {<br>
     replaceBody<Lazy>(S, F, Sym);<br>
     return;<br>
   }<br>
-  auto *U = dyn_cast<Undefined>(S->body())<wbr>;<br>
+  auto *U = dyn_cast<Undefined>(S);<br>
   if (!U || U->WeakAlias || S->PendingArchiveLoad)<br>
     return;<br>
   S->PendingArchiveLoad = true;<br>
   F->addMember(&Sym);<br>
 }<br>
<br>
-void SymbolTable::reportDuplicate(<wbr>Symbol *Existing, InputFile *NewFile) {<br>
-  error("duplicate symbol: " + toString(*Existing->body()) + " in " +<br>
-        toString(Existing->body()-><wbr>getFile()) + " and in " +<br>
+void SymbolTable::reportDuplicate(<wbr>SymbolBody *Existing, InputFile *NewFile) {<br>
+  error("duplicate symbol: " + toString(*Existing) + " in " +<br>
+        toString(Existing->getFile()) + " and in " +<br>
         (NewFile ? toString(NewFile) : "(internal)"));<br>
 }<br>
<br>
-Symbol *SymbolTable::addAbsolute(<wbr>StringRef N, COFFSymbolRef Sym) {<br>
-  Symbol *S;<br>
+SymbolBody *SymbolTable::addAbsolute(<wbr>StringRef N, COFFSymbolRef Sym) {<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(N);<br>
   S->IsUsedInRegularObj = true;<br>
-  if (WasInserted || isa<Undefined>(S->body()) || isa<Lazy>(S->body()))<br>
+  if (WasInserted || isa<Undefined>(S) || isa<Lazy>(S))<br>
     replaceBody<DefinedAbsolute>(<wbr>S, N, Sym);<br>
-  else if (!isa<DefinedCOFF>(S->body()))<br>
+  else if (!isa<DefinedCOFF>(S))<br>
     reportDuplicate(S, nullptr);<br>
   return S;<br>
 }<br>
<br>
-Symbol *SymbolTable::addAbsolute(<wbr>StringRef N, uint64_t VA) {<br>
-  Symbol *S;<br>
+SymbolBody *SymbolTable::addAbsolute(<wbr>StringRef N, uint64_t VA) {<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(N);<br>
   S->IsUsedInRegularObj = true;<br>
-  if (WasInserted || isa<Undefined>(S->body()) || isa<Lazy>(S->body()))<br>
+  if (WasInserted || isa<Undefined>(S) || isa<Lazy>(S))<br>
     replaceBody<DefinedAbsolute>(<wbr>S, N, VA);<br>
-  else if (!isa<DefinedCOFF>(S->body()))<br>
+  else if (!isa<DefinedCOFF>(S))<br>
     reportDuplicate(S, nullptr);<br>
   return S;<br>
 }<br>
<br>
-Symbol *SymbolTable::addSynthetic(<wbr>StringRef N, Chunk *C) {<br>
-  Symbol *S;<br>
+SymbolBody *SymbolTable::addSynthetic(<wbr>StringRef N, Chunk *C) {<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(N);<br>
   S->IsUsedInRegularObj = true;<br>
-  if (WasInserted || isa<Undefined>(S->body()) || isa<Lazy>(S->body()))<br>
+  if (WasInserted || isa<Undefined>(S) || isa<Lazy>(S))<br>
     replaceBody<DefinedSynthetic>(<wbr>S, N, C);<br>
-  else if (!isa<DefinedCOFF>(S->body()))<br>
+  else if (!isa<DefinedCOFF>(S))<br>
     reportDuplicate(S, nullptr);<br>
   return S;<br>
 }<br>
<br>
-Symbol *SymbolTable::addRegular(<wbr>InputFile *F, StringRef N, bool IsCOMDAT,<br>
-                                const coff_symbol_generic *Sym,<br>
-                                SectionChunk *C) {<br>
-  Symbol *S;<br>
+SymbolBody *SymbolTable::addRegular(<wbr>InputFile *F, StringRef N, bool IsCOMDAT,<br>
+                                    const coff_symbol_generic *Sym,<br>
+                                    SectionChunk *C) {<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(N);<br>
   if (!isa<BitcodeFile>(F))<br>
@@ -267,29 +253,30 @@ Symbol *SymbolTable::addRegular(<wbr>InputFil<br>
   return S;<br>
 }<br>
<br>
-Symbol *SymbolTable::addCommon(<wbr>InputFile *F, StringRef N, uint64_t Size,<br>
-                               const coff_symbol_generic *Sym, CommonChunk *C) {<br>
-  Symbol *S;<br>
+SymbolBody *SymbolTable::addCommon(<wbr>InputFile *F, StringRef N, uint64_t Size,<br>
+                                   const coff_symbol_generic *Sym,<br>
+                                   CommonChunk *C) {<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(N);<br>
   if (!isa<BitcodeFile>(F))<br>
     S->IsUsedInRegularObj = true;<br>
-  if (WasInserted || !isa<DefinedCOFF>(S->body()))<br>
+  if (WasInserted || !isa<DefinedCOFF>(S))<br>
     replaceBody<DefinedCommon>(S, F, N, Size, Sym, C);<br>
-  else if (auto *DC = dyn_cast<DefinedCommon>(S-><wbr>body()))<br>
+  else if (auto *DC = dyn_cast<DefinedCommon>(S))<br>
     if (Size > DC->getSize())<br>
       replaceBody<DefinedCommon>(S, F, N, Size, Sym, C);<br>
   return S;<br>
 }<br>
<br>
 DefinedImportData *SymbolTable::addImportData(<wbr>StringRef N, ImportFile *F) {<br>
-  Symbol *S;<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(N);<br>
   S->IsUsedInRegularObj = true;<br>
-  if (WasInserted || isa<Undefined>(S->body()) || isa<Lazy>(S->body())) {<br>
+  if (WasInserted || isa<Undefined>(S) || isa<Lazy>(S)) {<br>
     replaceBody<DefinedImportData><wbr>(S, N, F);<br>
-    return cast<DefinedImportData>(S-><wbr>body());<br>
+    return cast<DefinedImportData>(S);<br>
   }<br>
<br>
   reportDuplicate(S, F);<br>
@@ -299,13 +286,13 @@ DefinedImportData *SymbolTable::addImpor<br>
 DefinedImportThunk *SymbolTable::addImportThunk(<wbr>StringRef Name,<br>
                                                DefinedImportData *ID,<br>
                                                uint16_t Machine) {<br>
-  Symbol *S;<br>
+  SymbolBody *S;<br>
   bool WasInserted;<br>
   std::tie(S, WasInserted) = insert(Name);<br>
   S->IsUsedInRegularObj = true;<br>
-  if (WasInserted || isa<Undefined>(S->body()) || isa<Lazy>(S->body())) {<br>
+  if (WasInserted || isa<Undefined>(S) || isa<Lazy>(S)) {<br>
     replaceBody<<wbr>DefinedImportThunk>(S, Name, ID, Machine);<br>
-    return cast<DefinedImportThunk>(S-><wbr>body());<br>
+    return cast<DefinedImportThunk>(S);<br>
   }<br>
<br>
   reportDuplicate(S, ID->File);<br>
@@ -321,14 +308,14 @@ std::vector<Chunk *> SymbolTable::getChu<br>
   return Res;<br>
 }<br>
<br>
-Symbol *SymbolTable::find(StringRef Name) {<br>
+SymbolBody *SymbolTable::find(StringRef Name) {<br>
   auto It = Symtab.find(<wbr>CachedHashStringRef(Name));<br>
   if (It == Symtab.end())<br>
     return nullptr;<br>
   return It->second;<br>
 }<br>
<br>
-Symbol *SymbolTable::findUnderscore(<wbr>StringRef Name) {<br>
+SymbolBody *SymbolTable::findUnderscore(<wbr>StringRef Name) {<br>
   if (Config->Machine == I386)<br>
     return find(("_" + Name).str());<br>
   return find(Name);<br>
@@ -344,8 +331,8 @@ StringRef SymbolTable::findByPrefix(Stri<br>
 }<br>
<br>
 StringRef SymbolTable::findMangle(<wbr>StringRef Name) {<br>
-  if (Symbol *Sym = find(Name))<br>
-    if (!isa<Undefined>(Sym->body()))<br>
+  if (SymbolBody *Sym = find(Name))<br>
+    if (!isa<Undefined>(Sym))<br>
       return Name;<br>
   if (Config->Machine != I386)<br>
     return findByPrefix(("?" + Name + "@@Y").str());<br>
@@ -379,7 +366,7 @@ void SymbolTable::mangleMaybe(<wbr>SymbolBody<br>
 }<br>
<br>
 SymbolBody *SymbolTable::addUndefined(<wbr>StringRef Name) {<br>
-  return addUndefined(Name, nullptr, false)->body();<br>
+  return addUndefined(Name, nullptr, false);<br>
 }<br>
<br>
 std::vector<StringRef> SymbolTable::<wbr>compileBitcodeFiles() {<br>
<br>
Modified: lld/trunk/COFF/SymbolTable.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/SymbolTable.h?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/<wbr>SymbolTable.h?rev=317007&r1=<wbr>317006&r2=317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/SymbolTable.h (original)<br>
+++ lld/trunk/COFF/SymbolTable.h Tue Oct 31 09:10:24 2017<br>
@@ -32,7 +32,6 @@ class DefinedRelative;<br>
 class Lazy;<br>
 class SectionChunk;<br>
 class SymbolBody;<br>
-struct Symbol;<br>
<br>
 // SymbolTable is a bucket of all known symbols, including defined,<br>
 // undefined, or lazy symbols (the last one is symbols in archive<br>
@@ -59,8 +58,8 @@ public:<br>
   std::vector<Chunk *> getChunks();<br>
<br>
   // Returns a symbol for a given name. Returns a nullptr if not found.<br>
-  Symbol *find(StringRef Name);<br>
-  Symbol *findUnderscore(StringRef Name);<br>
+  SymbolBody *find(StringRef Name);<br>
+  SymbolBody *findUnderscore(StringRef Name);<br>
<br>
   // Occasionally we have to resolve an undefined symbol to its<br>
   // mangled symbol. This function tries to find a mangled name<br>
@@ -78,23 +77,23 @@ public:<br>
   // Creates an Undefined symbol for a given name.<br>
   SymbolBody *addUndefined(StringRef Name);<br>
<br>
-  Symbol *addSynthetic(StringRef N, Chunk *C);<br>
-  Symbol *addAbsolute(StringRef N, uint64_t VA);<br>
+  SymbolBody *addSynthetic(StringRef N, Chunk *C);<br>
+  SymbolBody *addAbsolute(StringRef N, uint64_t VA);<br>
<br>
-  Symbol *addUndefined(StringRef Name, InputFile *F, bool IsWeakAlias);<br>
+  SymbolBody *addUndefined(StringRef Name, InputFile *F, bool IsWeakAlias);<br>
   void addLazy(ArchiveFile *F, const Archive::Symbol Sym);<br>
-  Symbol *addAbsolute(StringRef N, COFFSymbolRef S);<br>
-  Symbol *addRegular(InputFile *F, StringRef N, bool IsCOMDAT,<br>
-                     const llvm::object::coff_symbol_<wbr>generic *S = nullptr,<br>
-                     SectionChunk *C = nullptr);<br>
-  Symbol *addCommon(InputFile *F, StringRef N, uint64_t Size,<br>
-                    const llvm::object::coff_symbol_<wbr>generic *S = nullptr,<br>
-                    CommonChunk *C = nullptr);<br>
+  SymbolBody *addAbsolute(StringRef N, COFFSymbolRef S);<br>
+  SymbolBody *addRegular(InputFile *F, StringRef N, bool IsCOMDAT,<br>
+                         const llvm::object::coff_symbol_<wbr>generic *S = nullptr,<br>
+                         SectionChunk *C = nullptr);<br>
+  SymbolBody *addCommon(InputFile *F, StringRef N, uint64_t Size,<br>
+                        const llvm::object::coff_symbol_<wbr>generic *S = nullptr,<br>
+                        CommonChunk *C = nullptr);<br>
   DefinedImportData *addImportData(StringRef N, ImportFile *F);<br>
   DefinedImportThunk *addImportThunk(StringRef Name, DefinedImportData *S,<br>
                                      uint16_t Machine);<br>
<br>
-  void reportDuplicate(Symbol *Existing, InputFile *NewFile);<br>
+  void reportDuplicate(SymbolBody *Existing, InputFile *NewFile);<br>
<br>
   // A list of chunks which to be added to .rdata.<br>
   std::vector<Chunk *> LocalImportChunks;<br>
@@ -106,10 +105,10 @@ public:<br>
   }<br>
<br>
 private:<br>
-  std::pair<Symbol *, bool> insert(StringRef Name);<br>
+  std::pair<SymbolBody *, bool> insert(StringRef Name);<br>
   StringRef findByPrefix(StringRef Prefix);<br>
<br>
-  llvm::DenseMap<llvm::<wbr>CachedHashStringRef, Symbol *> Symtab;<br>
+  llvm::DenseMap<llvm::<wbr>CachedHashStringRef, SymbolBody *> Symtab;<br>
   std::unique_ptr<<wbr>BitcodeCompiler> LTO;<br>
 };<br>
<br>
<br>
Modified: lld/trunk/COFF/Symbols.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Symbols.h?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/<wbr>Symbols.h?rev=317007&r1=<wbr>317006&r2=317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/Symbols.h (original)<br>
+++ lld/trunk/COFF/Symbols.h Tue Oct 31 09:10:24 2017<br>
@@ -32,7 +32,6 @@ using llvm::object::coff_symbol_<wbr>generic;<br>
 class ArchiveFile;<br>
 class InputFile;<br>
 class ObjFile;<br>
-struct Symbol;<br>
 class SymbolTable;<br>
<br>
 // The base class for real symbol classes.<br>
@@ -74,11 +73,6 @@ public:<br>
   // after calling markLive.<br>
   bool isLive() const;<br>
<br>
-  Symbol *symbol();<br>
-  const Symbol *symbol() const {<br>
-    return const_cast<SymbolBody *>(this)->symbol();<br>
-  }<br>
-<br>
 protected:<br>
   friend SymbolTable;<br>
   explicit SymbolBody(Kind K, StringRef N = "")<br>
@@ -96,6 +90,14 @@ public:<br>
   // symbols from being written to the symbol table more than once.<br>
   unsigned WrittenToSymtab : 1;<br>
<br>
+  // True if this symbol was referenced by a regular (non-bitcode) object.<br>
+  unsigned IsUsedInRegularObj : 1;<br>
+<br>
+  // True if we've seen both a lazy and an undefined symbol with this symbol<br>
+  // name, which means that we have enqueued an archive member load and should<br>
+  // not load any more archive members to resolve the same symbol.<br>
+  unsigned PendingArchiveLoad : 1;<br>
+<br>
 protected:<br>
   StringRef Name;<br>
 };<br>
@@ -397,47 +399,30 @@ inline Chunk *Defined::getChunk() {<br>
   llvm_unreachable("unknown symbol kind");<br>
 }<br>
<br>
-// A real symbol object, SymbolBody, is usually stored within a Symbol. There's<br>
-// always one Symbol for each symbol name. The resolver updates the SymbolBody<br>
-// stored in the Body field of this object as it resolves symbols. Symbol also<br>
-// holds computed properties of symbol names.<br>
-struct Symbol {<br>
-  // True if this symbol was referenced by a regular (non-bitcode) object.<br>
-  unsigned IsUsedInRegularObj : 1;<br>
-<br>
-  // True if we've seen both a lazy and an undefined symbol with this symbol<br>
-  // name, which means that we have enqueued an archive member load and should<br>
-  // not load any more archive members to resolve the same symbol.<br>
-  unsigned PendingArchiveLoad : 1;<br>
-<br>
-  // This field is used to store the Symbol's SymbolBody. This instantiation of<br>
-  // AlignedCharArrayUnion gives us a struct with a char array field that is<br>
-  // large and aligned enough to store any derived class of SymbolBody.<br>
-  llvm::AlignedCharArrayUnion<<br>
-      DefinedRegular, DefinedCommon, DefinedAbsolute, DefinedSynthetic, Lazy,<br>
-      Undefined, DefinedImportData, DefinedImportThunk, DefinedLocalImport><br>
-      Body;<br>
-<br>
-  SymbolBody *body() {<br>
-    return reinterpret_cast<SymbolBody *>(Body.buffer);<br>
-  }<br>
-  const SymbolBody *body() const { return const_cast<Symbol *>(this)->body(); }<br>
+// A buffer class that is large enough to hold any SymbolBody-derived<br>
+// object. We allocate memory using this class and instantiate a symbol<br>
+// using the placement new.<br>
+union SymbolUnion {<br>
+  alignas(DefinedCOFF) char A[sizeof(DefinedCOFF)];<br></blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">Nit: don't need DefinedCOFF.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  alignas(DefinedRegular) char B[sizeof(DefinedRegular)];<br>
+  alignas(DefinedCommon) char C[sizeof(DefinedCommon)];<br>
+  alignas(DefinedAbsolute) char D[sizeof(DefinedAbsolute)];<br>
+  alignas(DefinedSynthetic) char E[sizeof(DefinedSynthetic)];<br>
+  alignas(Lazy) char F[sizeof(Lazy)];<br>
+  alignas(Undefined) char G[sizeof(Undefined)];<br>
+  alignas(DefinedImportData) char H[sizeof(DefinedImportData)];<br>
+  alignas(DefinedImportThunk) char I[sizeof(DefinedImportThunk)];<br>
+  alignas(DefinedLocalImport) char J[sizeof(DefinedLocalImport)];<br>
 };<br>
<br>
 template <typename T, typename... ArgT><br>
-void replaceBody(Symbol *S, ArgT &&... Arg) {<br>
-  static_assert(sizeof(T) <= sizeof(S->Body), "Body too small");<br>
-  static_assert(alignof(T) <= alignof(decltype(S->Body)),<br>
-                "Body not aligned enough");<br>
+void replaceBody(SymbolBody *S, ArgT &&... Arg) {<br>
+  static_assert(sizeof(T) <= sizeof(SymbolUnion), "Symbol too small");<br>
+  static_assert(alignof(T) <= alignof(SymbolUnion),<br>
+                "SymbolUnion not aligned enough");<br>
   assert(static_cast<SymbolBody *>(static_cast<T *>(nullptr)) == nullptr &&<br>
          "Not a SymbolBody");<br>
-  new (S->Body.buffer) T(std::forward<ArgT>(Arg)...);<br>
-}<br>
-<br>
-inline Symbol *SymbolBody::symbol() {<br>
-  assert(isExternal());<br>
-  return reinterpret_cast<Symbol *>(reinterpret_cast<char *>(this) -<br>
-                                    offsetof(Symbol, Body));<br>
+  new (S) T(std::forward<ArgT>(Arg)...);<br>
 }<br>
 } // namespace coff<br>
<br>
<br>
Modified: lld/trunk/COFF/Writer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Writer.cpp?rev=317007&r1=317006&r2=317007&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/lld/trunk/COFF/Writer.<wbr>cpp?rev=317007&r1=317006&r2=<wbr>317007&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- lld/trunk/COFF/Writer.cpp (original)<br>
+++ lld/trunk/COFF/Writer.cpp Tue Oct 31 09:10:24 2017<br>
@@ -731,8 +731,8 @@ template <typename PEHeaderTy> void Writ<br>
     Dir[BASE_RELOCATION_TABLE].<wbr>RelativeVirtualAddress = Sec->getRVA();<br>
     Dir[BASE_RELOCATION_TABLE].<wbr>Size = Sec->getVirtualSize();<br>
   }<br>
-  if (Symbol *Sym = Symtab->findUnderscore("_tls_<wbr>used")) {<br>
-    if (Defined *B = dyn_cast<Defined>(Sym->body())<wbr>) {<br>
+  if (SymbolBody *Sym = Symtab->findUnderscore("_tls_<wbr>used")) {<br>
+    if (Defined *B = dyn_cast<Defined>(Sym)) {<br>
       Dir[TLS_TABLE].<wbr>RelativeVirtualAddress = B->getRVA();<br>
       Dir[TLS_TABLE].Size = Config->is64()<br>
                                 ? sizeof(object::coff_tls_<wbr>directory64)<br>
@@ -743,8 +743,8 @@ template <typename PEHeaderTy> void Writ<br>
     Dir[DEBUG_DIRECTORY].<wbr>RelativeVirtualAddress = DebugDirectory->getRVA();<br>
     Dir[DEBUG_DIRECTORY].Size = DebugDirectory->getSize();<br>
   }<br>
-  if (Symbol *Sym = Symtab->findUnderscore("_load_<wbr>config_used")) {<br>
-    if (auto *B = dyn_cast<DefinedRegular>(Sym-><wbr>body())) {<br>
+  if (SymbolBody *Sym = Symtab->findUnderscore("_load_<wbr>config_used")) {<br>
+    if (auto *B = dyn_cast<DefinedRegular>(Sym)) {<br>
       SectionChunk *SC = B->getChunk();<br>
       assert(B->getRVA() >= SC->getRVA());<br>
       uint64_t OffsetInChunk = B->getRVA() - SC->getRVA();<br>
@@ -804,10 +804,10 @@ void Writer::fixSafeSEHSymbols() {<br>
   // Replace the absolute table symbol with a synthetic symbol pointing to the<br>
   // SEHTable chunk so that we can emit base relocations for it and resolve<br>
   // section relative relocations.<br>
-  Symbol *T = Symtab->find("___safe_se_<wbr>handler_table");<br>
-  Symbol *C = Symtab->find("___safe_se_<wbr>handler_count");<br>
-  replaceBody<DefinedSynthetic>(<wbr>T, T->body()->getName(), SEHTable);<br>
-  cast<DefinedAbsolute>(C->body(<wbr>))->setVA(SEHTable->getSize() / 4);<br>
+  SymbolBody *T = Symtab->find("___safe_se_<wbr>handler_table");<br>
+  SymbolBody *C = Symtab->find("___safe_se_<wbr>handler_count");<br>
+  replaceBody<DefinedSynthetic>(<wbr>T, T->getName(), SEHTable);<br>
+  cast<DefinedAbsolute>(C)-><wbr>setVA(SEHTable->getSize() / 4);<br>
 }<br>
<br>
 // Handles /section options to allow users to overwrite<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div></div>