OSDN Git Service

MC: Switch MCFragment to storing the layout order index, not its index in the file.
authorDaniel Dunbar <daniel@zuster.org>
Fri, 14 May 2010 00:37:14 +0000 (00:37 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 14 May 2010 00:37:14 +0000 (00:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103751 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCAssembler.h
lib/MC/MCAssembler.cpp

index 78a8bb2..6b0cacf 100644 (file)
@@ -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; }
 
index 57214af..47c8915 100644 (file)
@@ -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 << "<MCFragment " << (void*) this << " Offset:" << Offset
-     << " EffectiveSize:" << EffectiveSize << ">";
+  OS << "<MCFragment " << (void*) this << " LayoutOrder:" << LayoutOrder
+     << " Offset:" << Offset << " EffectiveSize:" << EffectiveSize << ">";
 }
 
 void MCAlignFragment::dump() {