From d354befbbbbd95a8ebcf3d8db3bf3deef2033ff1 Mon Sep 17 00:00:00 2001 From: Pete Cooper Date: Mon, 8 Jun 2015 18:41:57 +0000 Subject: [PATCH] Use a PointerUnion in MCSymbol for Section and Fragment. NFC. The Fragment and Section, and a bool for HasFragment were all used to create a PointerUnion. Just use a pointer union instead. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239324 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCSymbol.h | 45 ++++++++++++++++---------------------- lib/MC/MCSymbol.cpp | 3 +-- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/include/llvm/MC/MCSymbol.h b/include/llvm/MC/MCSymbol.h index 71d29c6e442..9875d4a3fa4 100644 --- a/include/llvm/MC/MCSymbol.h +++ b/include/llvm/MC/MCSymbol.h @@ -14,6 +14,7 @@ #ifndef LLVM_MC_MCSYMBOL_H #define LLVM_MC_MCSYMBOL_H +#include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/StringMap.h" #include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCExpr.h" @@ -58,16 +59,14 @@ protected: /// one pointer. /// FIXME: We might be able to simplify this by having the asm streamer create /// dummy fragments. - union { - /// The section the symbol is defined in. This is null for undefined - /// symbols, and the special AbsolutePseudoSection value for absolute - /// symbols. If this is a variable symbol, this caches the variable value's - /// section. - mutable MCSection *Section; - - /// The fragment this symbol's value is relative to, if any. - mutable MCFragment *Fragment; - }; + /// If this is a section, then it gives the symbol is defined in. This is null + /// for undefined symbols, and the special AbsolutePseudoSection value for + /// absolute symbols. If this is a variable symbol, this caches the variable + /// value's section. + /// + /// If this is a fragment, then it gives the fragment this symbol's value is + /// relative to, if any. + mutable PointerUnion SectionOrFragment; /// Value - If non-null, the value for a variable symbol. const MCExpr *Value; @@ -91,8 +90,6 @@ protected: /// This symbol is private extern. mutable unsigned IsPrivateExtern : 1; - mutable unsigned HasFragment : 1; - SymbolKind Kind : 2; /// Index field, for use by the object file implementation. @@ -119,9 +116,9 @@ protected: // MCContext creates and uniques these. friend class MCExpr; friend class MCContext; MCSymbol(SymbolKind Kind, const StringMapEntry *Name, bool isTemporary) - : Name(Name), Section(nullptr), Value(nullptr), IsTemporary(isTemporary), + : Name(Name), Value(nullptr), IsTemporary(isTemporary), IsRedefinable(false), IsUsed(false), IsRegistered(false), - IsExternal(false), IsPrivateExtern(false), HasFragment(false), + IsExternal(false), IsPrivateExtern(false), Kind(Kind) { Offset = 0; } @@ -132,7 +129,8 @@ private: MCSection *getSectionPtr() const { if (MCFragment *F = getFragment()) return F->getParent(); - assert(!HasFragment); + assert(!SectionOrFragment.is() && "Section or null expected"); + MCSection *Section = SectionOrFragment.dyn_cast(); if (Section || !Value) return Section; return Section = Value->findAssociatedSection(); @@ -163,8 +161,7 @@ public: void redefineIfPossible() { if (IsRedefinable) { Value = nullptr; - Section = nullptr; - HasFragment = false; + SectionOrFragment = nullptr; IsRedefinable = false; } } @@ -197,14 +194,13 @@ public: /// Mark the symbol as defined in the section \p S. void setSection(MCSection &S) { assert(!isVariable() && "Cannot set section of variable"); - assert(!HasFragment); - Section = &S; + assert(!SectionOrFragment.is() && "Section or null expected"); + SectionOrFragment = &S; } /// Mark the symbol as undefined. void setUndefined() { - HasFragment = false; - Section = nullptr; + SectionOrFragment = nullptr; } bool isELF() const { return Kind == SymbolKindELF; } @@ -291,13 +287,10 @@ public: bool isCommon() const { return CommonAlign != -1U; } MCFragment *getFragment() const { - if (!HasFragment) - return nullptr; - return Fragment; + return SectionOrFragment.dyn_cast(); } void setFragment(MCFragment *Value) const { - HasFragment = true; - Fragment = Value; + SectionOrFragment = Value; } bool isExternal() const { return IsExternal; } diff --git a/lib/MC/MCSymbol.cpp b/lib/MC/MCSymbol.cpp index 35208eb0466..bcab23b9fc3 100644 --- a/lib/MC/MCSymbol.cpp +++ b/lib/MC/MCSymbol.cpp @@ -42,8 +42,7 @@ void MCSymbol::setVariableValue(const MCExpr *Value) { assert(!IsUsed && "Cannot set a variable that has already been used."); assert(Value && "Invalid variable value!"); this->Value = Value; - Section = nullptr; - HasFragment = false; + SectionOrFragment = nullptr; } void MCSymbol::print(raw_ostream &OS) const { -- 2.34.1