diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-10-27 14:44:52 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-10-27 14:44:52 +0000 |
commit | a6866969ba3b12901b412bb53ba8c61a9991b8ad (patch) | |
tree | 0feb7bf2afacc0b9e8740e747c61fe080f8cb226 /lib | |
parent | 401b90a4bc2c5d78476f096bc020fecac5c257d4 (diff) |
Move more logic to isInSymtab and simplify.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117447 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 40 |
1 files changed, 19 insertions, 21 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 4ccc281c49..f26002371d 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -441,7 +441,8 @@ static const MCSymbol &AliasedSymbol(const MCSymbol &Symbol) { const MCSymbol *S = &Symbol; while (S->isVariable()) { const MCExpr *Value = S->getVariableValue(); - assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented"); + if (Value->getKind() != MCExpr::SymbolRef) + return *S; const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value); S = &Ref->getSymbol(); } @@ -769,6 +770,11 @@ static bool isInSymtab(const MCAssembler &Asm, const MCSymbolData &Data, return true; const MCSymbol &Symbol = Data.getSymbol(); + + const MCSymbol &A = AliasedSymbol(Symbol); + if (&A != &Symbol && A.isUndefined()) + return false; + if (!Asm.isSymbolLinkerVisible(Symbol) && !Symbol.isUndefined()) return false; @@ -822,20 +828,16 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { MSD.SymbolData = it; bool Local = isLocal(*it); - bool Add = false; if (it->isCommon()) { assert(!Local); MSD.SectionIndex = ELF::SHN_COMMON; - Add = true; } else if (Symbol.isAbsolute()) { MSD.SectionIndex = ELF::SHN_ABS; - Add = true; } else if (Symbol.isVariable()) { const MCSymbol &RefSymbol = AliasedSymbol(Symbol); if (RefSymbol.isDefined()) { MSD.SectionIndex = SectionIndexMap.lookup(&RefSymbol.getSection()); assert(MSD.SectionIndex && "Invalid section index!"); - Add = true; } } else if (Symbol.isUndefined()) { assert(!Local); @@ -844,28 +846,24 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) { // are able to set it. if (GetBinding(*it) == ELF::STB_LOCAL) SetBinding(*it, ELF::STB_GLOBAL); - Add = true; } else { MSD.SectionIndex = SectionIndexMap.lookup(&Symbol.getSection()); assert(MSD.SectionIndex && "Invalid section index!"); - Add = true; } - if (Add) { - uint64_t &Entry = StringIndexMap[Symbol.getName()]; - if (!Entry) { - Entry = StringTable.size(); - StringTable += Symbol.getName(); - StringTable += '\x00'; - } - MSD.StringIndex = Entry; - if (MSD.SectionIndex == ELF::SHN_UNDEF) - UndefinedSymbolData.push_back(MSD); - else if (Local) - LocalSymbolData.push_back(MSD); - else - ExternalSymbolData.push_back(MSD); + uint64_t &Entry = StringIndexMap[Symbol.getName()]; + if (!Entry) { + Entry = StringTable.size(); + StringTable += Symbol.getName(); + StringTable += '\x00'; } + MSD.StringIndex = Entry; + if (MSD.SectionIndex == ELF::SHN_UNDEF) + UndefinedSymbolData.push_back(MSD); + else if (Local) + LocalSymbolData.push_back(MSD); + else + ExternalSymbolData.push_back(MSD); } // Symbols are required to be in lexicographic order. |