diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-06-03 21:41:59 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-06-03 21:41:59 +0000 |
commit | 8c52a9b0f611e4daa09c00e0da15b44b9528dbe5 (patch) | |
tree | 16ff48c06dd0096cf227efddbb8ca1c2f2c3f167 /llvm/lib | |
parent | ada43f6337e430a38f007778a5ebb7e022bb9c2d (diff) | |
download | bcm5719-llvm-8c52a9b0f611e4daa09c00e0da15b44b9528dbe5.tar.gz bcm5719-llvm-8c52a9b0f611e4daa09c00e0da15b44b9528dbe5.zip |
Store whether a symbol is a comdat signature in MCSymbolELF.
With this getBinging can now return the correct answer for all cases not
involving a .symver and the elf writer doesn't need to patch it last minute.
llvm-svn: 238980
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 23 | ||||
-rw-r--r-- | llvm/lib/MC/MCSymbolELF.cpp | 21 |
2 files changed, 19 insertions, 25 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index 6165533882a..bf9a29a41db 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -74,7 +74,6 @@ class ELFObjectWriter : public MCObjectWriter { static uint64_t SymbolValue(const MCSymbol &Sym, const MCAsmLayout &Layout); static bool isInSymtab(const MCAsmLayout &Layout, const MCSymbolELF &Symbol, bool Used, bool Renamed); - static bool isLocal(const MCSymbolELF &Symbol, bool IsSignature); /// Helper struct for containing some precomputed information on symbols. struct ELFSymbolData { @@ -755,19 +754,6 @@ bool ELFObjectWriter::isInSymtab(const MCAsmLayout &Layout, return true; } -bool ELFObjectWriter::isLocal(const MCSymbolELF &Symbol, bool IsSignature) { - if (Symbol.isExternal()) - return false; - - if (Symbol.isDefined()) - return true; - - if (Symbol.isUsedInReloc()) - return false; - - return IsSignature; -} - void ELFObjectWriter::computeSymbolTable( MCAssembler &Asm, const MCAsmLayout &Layout, const SectionIndexMapTy &SectionIndexMap, const RevGroupMapTy &RevGroupMap, @@ -800,7 +786,7 @@ void ELFObjectWriter::computeSymbolTable( const auto &Symbol = cast<MCSymbolELF>(S); bool Used = Symbol.isUsedInReloc(); bool WeakrefUsed = WeakrefUsedInReloc.count(&Symbol); - bool isSignature = RevGroupMap.count(&Symbol); + bool isSignature = Symbol.isSignature(); if (!isInSymtab(Layout, Symbol, Used || WeakrefUsed || isSignature, Renames.count(&Symbol))) @@ -809,12 +795,7 @@ void ELFObjectWriter::computeSymbolTable( ELFSymbolData MSD; MSD.Symbol = cast<MCSymbolELF>(&Symbol); - // Undefined symbols are global, but this is the first place we - // are able to set it. - bool Local = isLocal(Symbol, isSignature); - if (!Local && Symbol.getBinding() == ELF::STB_LOCAL) - Symbol.setBinding(ELF::STB_GLOBAL); - + bool Local = Symbol.getBinding() == ELF::STB_LOCAL; if (Symbol.isAbsolute()) { MSD.SectionIndex = ELF::SHN_ABS; } else if (Symbol.isCommon()) { diff --git a/llvm/lib/MC/MCSymbolELF.cpp b/llvm/lib/MC/MCSymbolELF.cpp index f8a90b9c8b8..4e6def0c2e1 100644 --- a/llvm/lib/MC/MCSymbolELF.cpp +++ b/llvm/lib/MC/MCSymbolELF.cpp @@ -24,10 +24,20 @@ void MCSymbolELF::setBinding(unsigned Binding) const { } unsigned MCSymbolELF::getBinding() const { - uint32_t Binding = (getFlags() & (0xf << ELF_STB_Shift)) >> ELF_STB_Shift; - assert(Binding == ELF::STB_LOCAL || Binding == ELF::STB_GLOBAL || - Binding == ELF::STB_WEAK || Binding == ELF::STB_GNU_UNIQUE); - return Binding; + if (isBindingSet()) { + uint32_t Binding = (getFlags() & (0xf << ELF_STB_Shift)) >> ELF_STB_Shift; + assert(Binding == ELF::STB_LOCAL || Binding == ELF::STB_GLOBAL || + Binding == ELF::STB_WEAK || Binding == ELF::STB_GNU_UNIQUE); + return Binding; + } + + if (isDefined()) + return ELF::STB_LOCAL; + if (isUsedInReloc()) + return ELF::STB_GLOBAL; + if (isSignature()) + return ELF::STB_LOCAL; + return ELF::STB_GLOBAL; } void MCSymbolELF::setType(unsigned Type) const { @@ -86,4 +96,7 @@ bool MCSymbolELF::isUsedInReloc() const { return UsedInReloc; } +void MCSymbolELF::setIsSignature() const { IsSignature = true; } + +bool MCSymbolELF::isSignature() const { return IsSignature; } } |