diff options
Diffstat (limited to 'llvm/include')
-rw-r--r-- | llvm/include/llvm/MC/MCAssembler.h | 13 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCExpr.h | 5 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCMachObjectWriter.h | 5 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCObjectWriter.h | 5 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCSection.h | 6 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCStreamer.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/MC/MCSymbol.h | 63 |
7 files changed, 59 insertions, 40 deletions
diff --git a/llvm/include/llvm/MC/MCAssembler.h b/llvm/include/llvm/MC/MCAssembler.h index 6becda88ebf..d69472bf2ec 100644 --- a/llvm/include/llvm/MC/MCAssembler.h +++ b/llvm/include/llvm/MC/MCAssembler.h @@ -52,7 +52,8 @@ public: FT_Dwarf, FT_DwarfFrame, FT_LEB, - FT_SafeSEH + FT_SafeSEH, + FT_Dummy }; private: @@ -136,9 +137,19 @@ public: /// and only some fragments have a meaningful implementation. void setBundlePadding(uint8_t N) { BundlePadding = N; } + /// \brief Return true if given frgment has FT_Dummy type. + bool isDummy() const { return Kind == FT_Dummy; } + void dump(); }; +class MCDummyFragment : public MCFragment { +public: + explicit MCDummyFragment(MCSection *Sec) + : MCFragment(FT_Dummy, false, 0, Sec){}; + static bool classof(const MCFragment *F) { return F->getKind() == FT_Dummy; } +}; + /// Interface implemented by fragments that contain encoded instructions and/or /// data. /// diff --git a/llvm/include/llvm/MC/MCExpr.h b/llvm/include/llvm/MC/MCExpr.h index b3a607351a8..76da86cd7d6 100644 --- a/llvm/include/llvm/MC/MCExpr.h +++ b/llvm/include/llvm/MC/MCExpr.h @@ -20,6 +20,7 @@ class MCAsmLayout; class MCAssembler; class MCContext; class MCFixup; +class MCFragment; class MCSection; class MCStreamer; class MCSymbol; @@ -115,7 +116,7 @@ public: /// currently defined as the absolute section for constants, or /// otherwise the section associated with the first defined symbol in the /// expression. - MCSection *findAssociatedSection() const; + MCFragment *findAssociatedFragment() const; /// @} }; @@ -556,7 +557,7 @@ public: const MCAsmLayout *Layout, const MCFixup *Fixup) const = 0; virtual void visitUsedExpr(MCStreamer& Streamer) const = 0; - virtual MCSection *findAssociatedSection() const = 0; + virtual MCFragment *findAssociatedFragment() const = 0; virtual void fixELFSymbolsInTLSFixups(MCAssembler &) const = 0; diff --git a/llvm/include/llvm/MC/MCMachObjectWriter.h b/llvm/include/llvm/MC/MCMachObjectWriter.h index 7eccd562af3..fe1227fe3dd 100644 --- a/llvm/include/llvm/MC/MCMachObjectWriter.h +++ b/llvm/include/llvm/MC/MCMachObjectWriter.h @@ -248,6 +248,11 @@ public: const MCAsmLayout &Layout) override; bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, + const MCSymbol &A, + const MCSymbol &B, + bool InSet) const override; + + bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, bool InSet, bool IsPCRel) const override; diff --git a/llvm/include/llvm/MC/MCObjectWriter.h b/llvm/include/llvm/MC/MCObjectWriter.h index 406831aae81..ed1f493d74e 100644 --- a/llvm/include/llvm/MC/MCObjectWriter.h +++ b/llvm/include/llvm/MC/MCObjectWriter.h @@ -93,6 +93,11 @@ public: bool InSet) const; virtual bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, + const MCSymbol &A, + const MCSymbol &B, + bool InSet) const; + + virtual bool isSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm, const MCSymbol &SymA, const MCFragment &FB, bool InSet, diff --git a/llvm/include/llvm/MC/MCSection.h b/llvm/include/llvm/MC/MCSection.h index 2d0d4dfc591..f5490fcd173 100644 --- a/llvm/include/llvm/MC/MCSection.h +++ b/llvm/include/llvm/MC/MCSection.h @@ -18,6 +18,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/ADT/ilist.h" #include "llvm/ADT/ilist_node.h" +#include "llvm/MC/MCAssembler.h" #include "llvm/MC/SectionKind.h" #include "llvm/Support/Compiler.h" @@ -92,6 +93,8 @@ private: unsigned IsRegistered : 1; + MCDummyFragment DummyFragment; + FragmentListType Fragments; /// Mapping from subsection number to insertion point for subsection numbers @@ -152,6 +155,9 @@ public: return const_cast<MCSection *>(this)->getFragmentList(); } + const MCDummyFragment &getDummyFragment() const { return DummyFragment; } + MCDummyFragment &getDummyFragment() { return DummyFragment; } + MCSection::iterator begin(); MCSection::const_iterator begin() const { return const_cast<MCSection *>(this)->begin(); diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h index 6beeaa9dd77..209bfe5801f 100644 --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -358,7 +358,7 @@ public: /// /// Each emitted symbol will be tracked in the ordering table, /// so we can sort on them later. - void AssignSection(MCSymbol *Symbol, MCSection *Section); + void AssignFragment(MCSymbol *Symbol, MCFragment *Fragment); /// \brief Emit a label for \p Symbol into the current section. /// diff --git a/llvm/include/llvm/MC/MCSymbol.h b/llvm/include/llvm/MC/MCSymbol.h index 563fa803b0e..c51ecfcb0c5 100644 --- a/llvm/include/llvm/MC/MCSymbol.h +++ b/llvm/include/llvm/MC/MCSymbol.h @@ -56,19 +56,17 @@ protected: SymContentsCommon, }; - // Special sentinal value for the absolute pseudo section. - // - // FIXME: Use a PointerInt wrapper for this? - static MCSection *AbsolutePseudoSection; + // Special sentinal value for the absolute pseudo fragment. + static MCFragment *AbsolutePseudoFragment; /// If a symbol has a Fragment, the section is implied, so we only need /// one pointer. + /// The special AbsolutePseudoFragment value is for absolute symbols. + /// If this is a variable symbol, this caches the variable value's fragment. /// FIXME: We might be able to simplify this by having the asm streamer create /// dummy fragments. /// 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. + /// for undefined symbols. /// /// If this is a fragment, then it gives the fragment this symbol's value is /// relative to, if any. @@ -76,8 +74,7 @@ protected: /// For the 'HasName' integer, this is true if this symbol is named. /// A named symbol will have a pointer to the name allocated in the bytes /// immediately prior to the MCSymbol. - mutable PointerIntPair<PointerUnion<MCSection *, MCFragment *>, 1> - SectionOrFragmentAndHasName; + mutable PointerIntPair<MCFragment *, 1> FragmentAndHasName; /// IsTemporary - True if this is an assembler temporary label, which /// typically does not survive in the .o file's symbol table. Usually @@ -155,7 +152,7 @@ protected: // MCContext creates and uniques these. Kind(Kind), IsUsedInReloc(false), SymbolContents(SymContentsUnset), CommonAlignLog2(0), Flags(0) { Offset = 0; - SectionOrFragmentAndHasName.setInt(!!Name); + FragmentAndHasName.setInt(!!Name); if (Name) getNameEntryPtr() = Name; } @@ -180,19 +177,16 @@ private: MCSymbol(const MCSymbol &) = delete; void operator=(const MCSymbol &) = delete; MCSection *getSectionPtr(bool SetUsed = true) const { - if (MCFragment *F = getFragment()) + if (MCFragment *F = getFragment(SetUsed)) { + assert(F != AbsolutePseudoFragment); return F->getParent(); - const auto &SectionOrFragment = SectionOrFragmentAndHasName.getPointer(); - assert(!SectionOrFragment.is<MCFragment *>() && "Section or null expected"); - MCSection *Section = SectionOrFragment.dyn_cast<MCSection *>(); - if (Section || !isVariable()) - return Section; - return Section = getVariableValue(SetUsed)->findAssociatedSection(); + } + return nullptr; } /// \brief Get a reference to the name field. Requires that we have a name const StringMapEntry<bool> *&getNameEntryPtr() { - assert(SectionOrFragmentAndHasName.getInt() && "Name is required"); + assert(FragmentAndHasName.getInt() && "Name is required"); NameEntryStorageTy *Name = reinterpret_cast<NameEntryStorageTy *>(this); return (*(Name - 1)).NameEntry; } @@ -203,7 +197,7 @@ private: public: /// getName - Get the symbol name. StringRef getName() const { - if (!SectionOrFragmentAndHasName.getInt()) + if (!FragmentAndHasName.getInt()) return StringRef(); return getNameEntryPtr()->first(); @@ -249,7 +243,7 @@ public: /// /// Defined symbols are either absolute or in some section. bool isDefined(bool SetUsed = true) const { - return getSectionPtr(SetUsed) != nullptr; + return getFragment(SetUsed) != nullptr; } /// isInSection - Check if this symbol is defined in some section (i.e., it @@ -263,7 +257,7 @@ public: /// isAbsolute - Check if this is an absolute symbol. bool isAbsolute(bool SetUsed = true) const { - return getSectionPtr(SetUsed) == AbsolutePseudoSection; + return getFragment(SetUsed) == AbsolutePseudoFragment; } /// Get the section associated with a defined, non-absolute symbol. @@ -272,19 +266,14 @@ public: return *getSectionPtr(SetUsed); } - /// Mark the symbol as defined in the section \p S. - void setSection(MCSection &S) { - assert(!isVariable() && "Cannot set section of variable"); - assert(!SectionOrFragmentAndHasName.getPointer().is<MCFragment *>() && - "Section or null expected"); - SectionOrFragmentAndHasName.setPointer(&S); + /// Mark the symbol as defined in the fragment \p F. + void setFragment(MCFragment *F) const { + assert(!isVariable() && "Cannot set fragment of variable"); + FragmentAndHasName.setPointer(F); } /// Mark the symbol as undefined. - void setUndefined() { - SectionOrFragmentAndHasName.setPointer( - PointerUnion<MCSection *, MCFragment *>()); - } + void setUndefined() { FragmentAndHasName.setPointer(nullptr); } bool isELF() const { return Kind == SymbolKindELF; } @@ -385,11 +374,13 @@ public: return SymbolContents == SymContentsCommon; } - MCFragment *getFragment() const { - return SectionOrFragmentAndHasName.getPointer().dyn_cast<MCFragment *>(); - } - void setFragment(MCFragment *Value) const { - SectionOrFragmentAndHasName.setPointer(Value); + MCFragment *getFragment(bool SetUsed = true) const { + MCFragment *Fragment = FragmentAndHasName.getPointer(); + if (Fragment || !isVariable()) + return Fragment; + Fragment = getVariableValue(SetUsed)->findAssociatedFragment(); + FragmentAndHasName.setPointer(Fragment); + return Fragment; } bool isExternal() const { return IsExternal; } |