From: Daniel Dunbar Date: Sat, 13 Feb 2010 09:28:43 +0000 (+0000) Subject: MCAssembler: Sink fixup list into MCDataFragment. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0bcf074867d4d366f7988a219c7a53265fcb4f23;p=oota-llvm.git MCAssembler: Sink fixup list into MCDataFragment. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96093 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 6b609d88c19..268a3fc3b8d 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -54,10 +54,6 @@ class MCFragment : public ilist_node { MCFragment(const MCFragment&); // DO NOT IMPLEMENT void operator=(const MCFragment&); // DO NOT IMPLEMENT -public: - typedef std::vector::const_iterator const_fixup_iterator; - typedef std::vector::iterator fixup_iterator; - public: enum FragmentType { FT_Data, @@ -85,11 +81,6 @@ private: /// FileSize - The file size of this section. This is ~0 until initialized. uint64_t FileSize; - /// Fixups - The list of fixups in this fragment. - // - // FIXME: This should be sunk into MCDataFragment. - std::vector Fixups; - /// @} protected: @@ -111,36 +102,6 @@ public: return 0; } - /// @name Fixup Access - /// @{ - - /// LookupFixup - Look up the fixup for the given \arg Fragment and \arg - /// Offset. - /// - /// If multiple fixups exist for the same fragment and offset it is undefined - /// which one is returned. - // - // FIXME: This isn't horribly slow in practice, but there are much nicer - // solutions to applying the fixups. This will be fixed by sinking fixups into - // data fragments exclusively. - const MCAsmFixup *LookupFixup(uint64_t Offset) const { - for (unsigned i = 0, e = Fixups.size(); i != e; ++i) - if (Fixups[i].Offset == Offset) - return &Fixups[i]; - return 0; - } - - std::vector &getFixups() { return Fixups; } - const std::vector &getFixups() const { return Fixups; } - - fixup_iterator fixup_begin() { return Fixups.begin(); } - const_fixup_iterator fixup_begin() const { return Fixups.begin(); } - - fixup_iterator fixup_end() {return Fixups.end();} - const_fixup_iterator fixup_end() const {return Fixups.end();} - - size_t fixup_size() const { return Fixups.size(); } - /// @name Assembler Backend Support /// @{ // @@ -173,6 +134,13 @@ public: class MCDataFragment : public MCFragment { SmallString<32> Contents; + /// Fixups - The list of fixups in this fragment. + std::vector Fixups; + +public: + typedef std::vector::const_iterator const_fixup_iterator; + typedef std::vector::iterator fixup_iterator; + public: MCDataFragment(MCSectionData *SD = 0) : MCFragment(FT_Data, SD) {} @@ -188,6 +156,22 @@ public: /// @} + /// @name Fixup Access + /// @{ + + std::vector &getFixups() { return Fixups; } + const std::vector &getFixups() const { return Fixups; } + + fixup_iterator fixup_begin() { return Fixups.begin(); } + const_fixup_iterator fixup_begin() const { return Fixups.begin(); } + + fixup_iterator fixup_end() {return Fixups.end();} + const_fixup_iterator fixup_end() const {return Fixups.end();} + + size_t fixup_size() const { return Fixups.size(); } + + /// @} + static bool classof(const MCFragment *F) { return F->getKind() == MCFragment::FT_Data; } diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 7f3930cddfe..2875730dd32 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -455,7 +455,7 @@ public: } } - void ComputeRelocationInfo(MCAssembler &Asm, MCFragment &Fragment, + void ComputeRelocationInfo(MCAssembler &Asm, MCDataFragment &Fragment, MCAsmFixup &Fixup, DenseMap &SymbolMap, std::vector &Relocs) { @@ -780,9 +780,10 @@ public: unsigned NumRelocsStart = RelocInfos.size(); for (MCSectionData::reverse_iterator it2 = SD.rbegin(), ie2 = SD.rend(); it2 != ie2; ++it2) - for (unsigned i = 0, e = it2->fixup_size(); i != e; ++i) - ComputeRelocationInfo(Asm, *it2, it2->getFixups()[e - i - 1], - SymbolMap, RelocInfos); + if (MCDataFragment *DF = dyn_cast(&*it2)) + for (unsigned i = 0, e = DF->fixup_size(); i != e; ++i) + ComputeRelocationInfo(Asm, *DF, DF->getFixups()[e - i - 1], + SymbolMap, RelocInfos); unsigned NumRelocs = RelocInfos.size() - NumRelocsStart; uint64_t SectionStart = SectionDataStart + SD.getAddress(); @@ -1198,16 +1199,6 @@ void MCFragment::dump() { OS << ""; } @@ -1233,7 +1224,19 @@ void MCDataFragment::dump() { if (i) OS << ","; OS << hexdigit((Contents[i] >> 4) & 0xF) << hexdigit(Contents[i] & 0xF); } - OS << "]>"; + OS << "]"; + + if (!getFixups().empty()) { + OS << ",\n "; + OS << " Fixups:["; + for (fixup_iterator it = fixup_begin(), ie = fixup_end(); it != ie; ++it) { + if (it != fixup_begin()) OS << ",\n "; + OS << *it; + } + OS << "]"; + } + + OS << ">"; } void MCFillFragment::dump() {