From dfe2d359c5e5517a7cbbe83009cc23518f4ff65a Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 17 Jun 2015 20:08:20 +0000 Subject: [PATCH] Move IsUsedInReloc from MCSymbolELF to MCSymbol. There is a free bit is MCSymbol and MachO needs the same information. llvm-svn: 239933 --- llvm/include/llvm/MC/MCAssembler.h | 5 ----- llvm/include/llvm/MC/MCSymbol.h | 14 ++++++++++---- llvm/include/llvm/MC/MCSymbolELF.h | 3 --- llvm/lib/MC/MCAssembler.cpp | 12 +----------- llvm/lib/MC/MCSymbolELF.cpp | 14 +------------- .../MCTargetDesc/AArch64MachObjectWriter.cpp | 2 +- .../X86/MCTargetDesc/X86MachObjectWriter.cpp | 2 +- 7 files changed, 14 insertions(+), 38 deletions(-) diff --git a/llvm/include/llvm/MC/MCAssembler.h b/llvm/include/llvm/MC/MCAssembler.h index a6178c214d47..484f370515ab 100644 --- a/llvm/include/llvm/MC/MCAssembler.h +++ b/llvm/include/llvm/MC/MCAssembler.h @@ -621,8 +621,6 @@ private: SymbolDataListType Symbols; - DenseSet LocalsUsedInReloc; - std::vector IndirectSymbols; std::vector DataRegions; @@ -713,9 +711,6 @@ private: MCFragment &F, const MCFixup &Fixup); public: - void addLocalUsedInReloc(const MCSymbol &Sym); - bool isLocalUsedInReloc(const MCSymbol &Sym) const; - /// Compute the effective fragment size assuming it is laid out at the given /// \p SectionAddress and \p FragmentOffset. uint64_t computeFragmentSize(const MCAsmLayout &Layout, diff --git a/llvm/include/llvm/MC/MCSymbol.h b/llvm/include/llvm/MC/MCSymbol.h index 9f97fd0c001e..0acf6e50ba48 100644 --- a/llvm/include/llvm/MC/MCSymbol.h +++ b/llvm/include/llvm/MC/MCSymbol.h @@ -95,6 +95,9 @@ protected: /// unsigned to avoid sign extension and achieve better bitpacking with MSVC. unsigned Kind : 2; + /// True if we have created a relocation that uses this symbol. + mutable unsigned IsUsedInReloc : 1; + /// Index field, for use by the object file implementation. mutable uint32_t Index = 0; @@ -129,10 +132,10 @@ protected: // MCContext creates and uniques these. } NameEntryStorageTy; MCSymbol(SymbolKind Kind, const StringMapEntry *Name, bool isTemporary) - : Value(nullptr), IsTemporary(isTemporary), - IsRedefinable(false), IsUsed(false), IsRegistered(false), - IsExternal(false), IsPrivateExtern(false), HasName(!!Name), - Kind(Kind) { + : Value(nullptr), IsTemporary(isTemporary), IsRedefinable(false), + IsUsed(false), IsRegistered(false), IsExternal(false), + IsPrivateExtern(false), HasName(!!Name), Kind(Kind), + IsUsedInReloc(false) { Offset = 0; if (Name) getNameEntryPtr() = Name; @@ -189,6 +192,9 @@ public: bool isRegistered() const { return IsRegistered; } void setIsRegistered(bool Value) const { IsRegistered = Value; } + void setUsedInReloc() const { IsUsedInReloc = true; } + bool isUsedInReloc() const { return IsUsedInReloc; } + /// \name Accessors /// @{ diff --git a/llvm/include/llvm/MC/MCSymbolELF.h b/llvm/include/llvm/MC/MCSymbolELF.h index 0cc11156b5cd..bbcd22e8e7db 100644 --- a/llvm/include/llvm/MC/MCSymbolELF.h +++ b/llvm/include/llvm/MC/MCSymbolELF.h @@ -38,9 +38,6 @@ public: bool isBindingSet() const; - void setUsedInReloc() const; - bool isUsedInReloc() const; - void setIsWeakrefUsedInReloc() const; bool isWeakrefUsedInReloc() const; diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index 55f50097744d..df416710182e 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/lib/MC/MCAssembler.cpp @@ -345,16 +345,6 @@ bool MCAssembler::isThumbFunc(const MCSymbol *Symbol) const { return true; } -void MCAssembler::addLocalUsedInReloc(const MCSymbol &Sym) { - assert(Sym.isTemporary()); - LocalsUsedInReloc.insert(&Sym); -} - -bool MCAssembler::isLocalUsedInReloc(const MCSymbol &Sym) const { - assert(Sym.isTemporary()); - return LocalsUsedInReloc.count(&Sym); -} - bool MCAssembler::isSymbolLinkerVisible(const MCSymbol &Symbol) const { // Non-temporary labels should always be visible to the linker. if (!Symbol.isTemporary()) @@ -364,7 +354,7 @@ bool MCAssembler::isSymbolLinkerVisible(const MCSymbol &Symbol) const { if (!Symbol.isInSection()) return false; - if (isLocalUsedInReloc(Symbol)) + if (Symbol.isUsedInReloc()) return true; return false; diff --git a/llvm/lib/MC/MCSymbolELF.cpp b/llvm/lib/MC/MCSymbolELF.cpp index c3620651f883..ec7ef447ff89 100644 --- a/llvm/lib/MC/MCSymbolELF.cpp +++ b/llvm/lib/MC/MCSymbolELF.cpp @@ -36,10 +36,7 @@ enum { ELF_WeakrefUsedInReloc_Shift = 11, // One bit. - ELF_UsedInReloc_Shift = 12, - - // One bit. - ELF_BindingSet_Shift = 13 + ELF_BindingSet_Shift = 12 }; } @@ -175,15 +172,6 @@ unsigned MCSymbolELF::getOther() const { return Other << 5; } -void MCSymbolELF::setUsedInReloc() const { - uint32_t OtherFlags = getFlags() & ~(0x1 << ELF_UsedInReloc_Shift); - setFlags(OtherFlags | (1 << ELF_UsedInReloc_Shift)); -} - -bool MCSymbolELF::isUsedInReloc() const { - return getFlags() & (0x1 << ELF_UsedInReloc_Shift); -} - void MCSymbolELF::setIsWeakrefUsedInReloc() const { uint32_t OtherFlags = getFlags() & ~(0x1 << ELF_WeakrefUsedInReloc_Shift); setFlags(OtherFlags | (1 << ELF_WeakrefUsedInReloc_Shift)); diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp index 67af810bbbec..741b273073e4 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp @@ -287,7 +287,7 @@ void AArch64MachObjectWriter::recordRelocation( if (Symbol->isTemporary() && (Value || !CanUseLocalRelocation)) { const MCSection &Sec = Symbol->getSection(); if (!Asm.getContext().getAsmInfo()->isSectionAtomizableBySymbols(Sec)) - Asm.addLocalUsedInReloc(*Symbol); + Symbol->setUsedInReloc(); } const MCSymbol *Base = Asm.getAtom(*Symbol); diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp index 95acc07192da..9e801fc8f191 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp @@ -205,7 +205,7 @@ void X86MachObjectWriter::RecordX86_64Relocation( if (Symbol->isTemporary() && Value) { const MCSection &Sec = Symbol->getSection(); if (!Asm.getContext().getAsmInfo()->isSectionAtomizableBySymbols(Sec)) - Asm.addLocalUsedInReloc(*Symbol); + Symbol->setUsedInReloc(); } RelSymbol = Asm.getAtom(*Symbol);