From 27ade18431a3504b412e6359e80c9b88e3b0f932 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 11 Feb 2010 21:29:29 +0000 Subject: [PATCH] MC: Move MCSectionData::Fixup out to MCAsmFixup. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95925 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAssembler.h | 67 ++++++++++++++++++++++--------------------- lib/MC/MCAssembler.cpp | 15 +++++----- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 55696b08fd6..9d3efa7ee65 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -22,10 +22,39 @@ class raw_ostream; class MCAssembler; class MCContext; class MCExpr; +class MCFragment; class MCSection; class MCSectionData; class MCSymbol; +/// MCAsmFixup - Represent a fixed size region of bytes inside some fragment +/// which needs to be rewritten. This region will either be rewritten by the +/// assembler or cause a relocation entry to be generated. +struct MCAsmFixup { + /// Fragment - The fragment containing the fixup. + MCFragment *Fragment; + + /// Offset - The offset inside the fragment which needs to be rewritten. + uint64_t Offset; + + /// Value - The expression to eventually write into the fragment. + const MCExpr *Value; + + /// Size - The fixup size. + unsigned Size; + + /// FixedValue - The value to replace the fix up by. + // + // FIXME: This should not be here. + uint64_t FixedValue; + +public: + MCAsmFixup(MCFragment &_Fragment, uint64_t _Offset, const MCExpr &_Value, + unsigned _Size) + : Fragment(&_Fragment), Offset(_Offset), Value(&_Value), Size(_Size), + FixedValue(0) {} +}; + class MCFragment : public ilist_node { MCFragment(const MCFragment&); // DO NOT IMPLEMENT void operator=(const MCFragment&); // DO NOT IMPLEMENT @@ -284,41 +313,14 @@ class MCSectionData : public ilist_node { void operator=(const MCSectionData&); // DO NOT IMPLEMENT public: - /// Fixup - Represent a fixed size region of bytes inside some fragment which - /// needs to be rewritten. This region will either be rewritten by the - /// assembler or cause a relocation entry to be generated. - struct Fixup { - /// Fragment - The fragment containing the fixup. - MCFragment *Fragment; - - /// Offset - The offset inside the fragment which needs to be rewritten. - uint64_t Offset; - - /// Value - The expression to eventually write into the fragment. - const MCExpr *Value; - - /// Size - The fixup size. - unsigned Size; - - /// FixedValue - The value to replace the fix up by. - // - // FIXME: This should not be here. - uint64_t FixedValue; - - public: - Fixup(MCFragment &_Fragment, uint64_t _Offset, const MCExpr &_Value, - unsigned _Size) - : Fragment(&_Fragment), Offset(_Offset), Value(&_Value), Size(_Size), - FixedValue(0) {} - }; typedef iplist FragmentListType; typedef FragmentListType::const_iterator const_iterator; typedef FragmentListType::iterator iterator; - typedef std::vector::const_iterator const_fixup_iterator; - typedef std::vector::iterator fixup_iterator; + typedef std::vector::const_iterator const_fixup_iterator; + typedef std::vector::iterator fixup_iterator; private: iplist Fragments; @@ -347,7 +349,7 @@ private: mutable unsigned LastFixupLookup; /// Fixups - The list of fixups in this section. - std::vector Fixups; + std::vector Fixups; /// HasInstructions - Whether this section has had instructions emitted into /// it. @@ -385,7 +387,7 @@ public: /// @name Fixup Access /// @{ - std::vector &getFixups() { + std::vector &getFixups() { return Fixups; } @@ -413,7 +415,8 @@ public: // // FIXME: This isn't horribly slow in practice, but there are much nicer // solutions to applying the fixups. - const Fixup *LookupFixup(const MCFragment *Fragment, uint64_t Offset) const; + const MCAsmFixup *LookupFixup(const MCFragment *Fragment, + uint64_t Offset) const; uint64_t getAddress() const { assert(Address != ~UINT64_C(0) && "Address not set!"); diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index bdc886bc67a..682b505e347 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -403,7 +403,7 @@ public: uint32_t Word1; }; void ComputeScatteredRelocationInfo(MCAssembler &Asm, - MCSectionData::Fixup &Fixup, + MCAsmFixup &Fixup, const MCValue &Target, DenseMap &SymbolMap, std::vector &Relocs) { @@ -454,7 +454,7 @@ public: } void ComputeRelocationInfo(MCAssembler &Asm, - MCSectionData::Fixup &Fixup, + MCAsmFixup &Fixup, DenseMap &SymbolMap, std::vector &Relocs) { MCValue Target; @@ -912,15 +912,15 @@ MCSectionData::MCSectionData(const MCSection &_Section, MCAssembler *A) A->getSectionList().push_back(this); } -const MCSectionData::Fixup * -MCSectionData::LookupFixup(const MCFragment *Fragment, uint64_t Offset) const { +const MCAsmFixup *MCSectionData::LookupFixup(const MCFragment *Fragment, + uint64_t Offset) const { // Use a one level cache to turn the common case of accessing the fixups in // order into O(1) instead of O(N). unsigned i = LastFixupLookup, Count = Fixups.size(), End = Fixups.size(); if (i >= End) i = 0; while (Count--) { - const Fixup &F = Fixups[i]; + const MCAsmFixup &F = Fixups[i]; if (F.Fragment == Fragment && F.Offset == Offset) { LastFixupLookup = i; return &F; @@ -998,8 +998,7 @@ void MCAssembler::LayoutSection(MCSectionData &SD) { // Otherwise, add fixups for the values. for (uint64_t i = 0, e = FF.getCount(); i != e; ++i) { - MCSectionData::Fixup Fix(F, i * FF.getValueSize(), - FF.getValue(),FF.getValueSize()); + MCAsmFixup Fix(F, i*FF.getValueSize(), FF.getValue(),FF.getValueSize()); SD.getFixups().push_back(Fix); } break; @@ -1107,7 +1106,7 @@ static void WriteFileData(raw_ostream &OS, const MCFragment &F, // Find the fixup. // // FIXME: Find a better way to write in the fixes. - const MCSectionData::Fixup *Fixup = + const MCAsmFixup *Fixup = F.getParent()->LookupFixup(&F, i * FF.getValueSize()); assert(Fixup && "Missing fixup for fill value!"); Value = Fixup->FixedValue; -- 2.11.0