From 337718e09c99349939a53643984c04f5dc118bb7 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Fri, 14 May 2010 00:37:14 +0000 Subject: [PATCH] MC: Switch MCFragment to storing the layout order index, not its index in the file. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103751 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAssembler.h | 10 +++++----- lib/MC/MCAssembler.cpp | 27 ++++++++++++++------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 78a8bb2a072..6b0cacfb685 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -96,9 +96,9 @@ private: /// initialized. uint64_t EffectiveSize; - /// Ordinal - The global index of this fragment. This is the index across all - /// sections, not just the parent section. - unsigned Ordinal; + /// LayoutOrder - The global layout order of this fragment. This is the index + /// across all fragments in the file, not just within the section. + unsigned LayoutOrder; /// @} @@ -118,8 +118,8 @@ public: MCSymbolData *getAtom() const { return Atom; } void setAtom(MCSymbolData *Value) { Atom = Value; } - unsigned getOrdinal() const { return Ordinal; } - void setOrdinal(unsigned Value) { Ordinal = Value; } + unsigned getLayoutOrder() const { return LayoutOrder; } + void setLayoutOrder(unsigned Value) { LayoutOrder = Value; } static bool classof(const MCFragment *O) { return true; } diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 57214af2966..47c891534f5 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -599,10 +599,6 @@ void MCAssembler::Finish() { // Create the layout object. MCAsmLayout Layout(*this); - // Assign layout order indices. - for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i) - Layout.getSectionOrder()[i]->setLayoutOrder(i); - // Insert additional align fragments for concrete sections to explicitly pad // the previous section to match their alignment requirements. This is for // 'gas' compatibility, it shouldn't strictly be necessary. @@ -627,10 +623,8 @@ void MCAssembler::Finish() { AF->setOnlyAlignAddress(true); } - // Assign section and fragment ordinals, all subsequent backend code is - // responsible for updating these in place. + // Create dummy fragments and assign section ordinals. unsigned SectionIndex = 0; - unsigned FragmentIndex = 0; for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) { // Create dummy fragments to eliminate any empty sections, this simplifies // layout. @@ -642,10 +636,17 @@ void MCAssembler::Finish() { } it->setOrdinal(SectionIndex++); + } - for (MCSectionData::iterator it2 = it->begin(), - ie2 = it->end(); it2 != ie2; ++it2) - it2->setOrdinal(FragmentIndex++); + // Assign layout order indices to sections and fragments. + unsigned FragmentIndex = 0; + for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i) { + MCSectionData *SD = Layout.getSectionOrder()[i]; + SD->setLayoutOrder(i); + + for (MCSectionData::iterator it2 = SD->begin(), + ie2 = SD->end(); it2 != ie2; ++it2) + it2->setLayoutOrder(FragmentIndex++); } // Layout until everything fits. @@ -827,7 +828,7 @@ void MCAssembler::FinishLayout(MCAsmLayout &Layout) { // Update the data fragments layout data. DF->setParent(IF->getParent()); DF->setAtom(IF->getAtom()); - DF->setOrdinal(IF->getOrdinal()); + DF->setLayoutOrder(IF->getLayoutOrder()); Layout.FragmentReplaced(IF, DF); // Copy in the data and the fixups. @@ -857,8 +858,8 @@ raw_ostream &operator<<(raw_ostream &OS, const MCAsmFixup &AF) { void MCFragment::dump() { raw_ostream &OS = llvm::errs(); - OS << ""; + OS << ""; } void MCAlignFragment::dump() {