<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>