From f3857c334ff3fdb3d187673476bb32ff06d0ebda Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 3 Jun 2015 21:41:59 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238980 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCSectionELF.h | 5 ++++- include/llvm/MC/MCSymbolELF.h | 4 ++++ lib/MC/ELFObjectWriter.cpp | 23 ++--------------------- lib/MC/MCSymbolELF.cpp | 21 +++++++++++++++++---- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/include/llvm/MC/MCSectionELF.h b/include/llvm/MC/MCSectionELF.h index df959420c5c..f6730371fe1 100644 --- a/include/llvm/MC/MCSectionELF.h +++ b/include/llvm/MC/MCSectionELF.h @@ -58,7 +58,10 @@ private: MCSymbol *Begin, const MCSectionELF *Associated) : MCSection(SV_ELF, K, Begin), SectionName(Section), Type(type), Flags(flags), UniqueID(UniqueID), EntrySize(entrySize), Group(group), - Associated(Associated) {} + Associated(Associated) { + if (Group) + Group->setIsSignature(); + } ~MCSectionELF() override; void setSectionName(StringRef Name) { SectionName = Name; } diff --git a/include/llvm/MC/MCSymbolELF.h b/include/llvm/MC/MCSymbolELF.h index 22ade52fb71..63c7a6794bf 100644 --- a/include/llvm/MC/MCSymbolELF.h +++ b/include/llvm/MC/MCSymbolELF.h @@ -19,6 +19,7 @@ class MCSymbolELF : public MCSymbol { mutable unsigned BindingSet : 1; mutable unsigned UsedInReloc : 1; + mutable unsigned IsSignature : 1; public: MCSymbolELF(const StringMapEntry *Name, bool isTemporary) @@ -44,6 +45,9 @@ public: void setUsedInReloc() const; bool isUsedInReloc() const; + void setIsSignature() const; + bool isSignature() const; + static bool classof(const MCSymbol *S) { return S->isELF(); } }; } diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 6165533882a..bf9a29a41db 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/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(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(&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/lib/MC/MCSymbolELF.cpp b/lib/MC/MCSymbolELF.cpp index f8a90b9c8b8..4e6def0c2e1 100644 --- a/lib/MC/MCSymbolELF.cpp +++ b/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; } } -- 2.34.1