MC: Move Layout{Fragment,Section} into MCAsmLayout, and add LayoutFile().
authorDaniel Dunbar <daniel@zuster.org>
Thu, 13 May 2010 20:40:12 +0000 (20:40 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 13 May 2010 20:40:12 +0000 (20:40 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103738 91177308-0d34-0410-b5e6-96231b3b80d8

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

index f866aab95b502564ca66fa5b8ebbd5dddfd234ed..18f720ecc14dca3218e5f52a8fbe1f3c3352f75c 100644 (file)
@@ -50,6 +50,18 @@ public:
   /// \brief Update the layout because a fragment has been replaced.
   void FragmentReplaced(MCFragment *Src, MCFragment *Dst);
 
+  /// \brief Perform a full layout.
+  void LayoutFile();
+
+  /// \brief Perform layout for a single fragment, assuming that the previous
+  /// fragment has already been layed out correctly, and the parent section has
+  /// been initialized.
+  void LayoutFragment(MCFragment *Fragment);
+
+  /// \brief Performs layout for a single section, assuming that the previous
+  /// section has already been layed out correctly.
+  void LayoutSection(MCSectionData *SD);
+
   /// @name Section Access (in layout order)
   /// @{
 
index 6522b672d3e1ed26b71323eff091d9892b1c5f4a..78a8bb2a07249d08ae9e44bdd022d7c647d483cf 100644 (file)
@@ -656,16 +656,6 @@ private:
                                uint64_t SectionAddress,
                                uint64_t FragmentOffset) const;
 
-  /// LayoutFragment - Performs layout of the given \arg Fragment; assuming that
-  /// the previous fragment has already been layed out correctly, and the parent
-  /// section has been initialized.
-  void LayoutFragment(MCAsmLayout &Layout, MCFragment &Fragment);
-
-  /// LayoutSection - Performs layout of the section referenced by the given
-  /// \arg SectionOrderIndex. The layout assumes that the previous section has
-  /// already been layed out correctly.
-  void LayoutSection(MCAsmLayout &Layout, unsigned SectionOrderIndex);
-
   /// LayoutOnce - Perform one layout iteration and return true if any offsets
   /// were adjusted.
   bool LayoutOnce(MCAsmLayout &Layout);
index dfc2663650eb2539de33d4fd61ed8e1f1c1e8144..38994e777ec92d1593475d157a5a0a7875154b22 100644 (file)
@@ -69,8 +69,7 @@ void MCAsmLayout::UpdateForSlide(MCFragment *F, int SlideAmount) {
   // FIXME-PERF: This is O(N^2), but will be eliminated once we get smarter.
 
   // Layout the sections in order.
-  for (unsigned i = 0, e = getSectionOrder().size(); i != e; ++i)
-    getAssembler().LayoutSection(*this, i);
+  LayoutFile();
 }
 
 void MCAsmLayout::FragmentReplaced(MCFragment *Src, MCFragment *Dst) {
@@ -426,49 +425,52 @@ uint64_t MCAssembler::ComputeFragmentSize(MCAsmLayout &Layout,
   return 0;
 }
 
-void MCAssembler::LayoutFragment(MCAsmLayout &Layout, MCFragment &F) {
-  uint64_t StartAddress = Layout.getSectionAddress(F.getParent());
+void MCAsmLayout::LayoutFile() {
+  for (unsigned i = 0, e = getSectionOrder().size(); i != e; ++i)
+    LayoutSection(getSectionOrder()[i]);
+}
+
+void MCAsmLayout::LayoutFragment(MCFragment *F) {
+  uint64_t StartAddress = getSectionAddress(F->getParent());
 
   // Get the fragment start address.
   uint64_t Address = StartAddress;
-  MCSectionData::iterator it = &F;
-  if (MCFragment *Prev = F.getPrevNode())
-    Address = (StartAddress + Layout.getFragmentOffset(Prev) +
-               Layout.getFragmentEffectiveSize(Prev));
+  MCSectionData::iterator it = F;
+  if (MCFragment *Prev = F->getPrevNode())
+    Address = (StartAddress + getFragmentOffset(Prev) +
+               getFragmentEffectiveSize(Prev));
 
   ++stats::FragmentLayouts;
 
-  uint64_t FragmentOffset = Address - StartAddress;
-  Layout.setFragmentOffset(&F, FragmentOffset);
+  // Compute fragment offset and size.
+  uint64_t Offset = Address - StartAddress;
+  uint64_t EffectiveSize =
+    getAssembler().ComputeFragmentSize(*this, *F, StartAddress, Offset);
 
-  // Evaluate fragment size.
-  uint64_t EffectiveSize = ComputeFragmentSize(Layout, F, StartAddress,
-                                               FragmentOffset);
-  Layout.setFragmentEffectiveSize(&F, EffectiveSize);
+  setFragmentOffset(F, Offset);
+  setFragmentEffectiveSize(F, EffectiveSize);
 }
 
-void MCAssembler::LayoutSection(MCAsmLayout &Layout,
-                                unsigned SectionOrderIndex) {
-  MCSectionData &SD = *Layout.getSectionOrder()[SectionOrderIndex];
+void MCAsmLayout::LayoutSection(MCSectionData *SD) {
+  unsigned SectionOrderIndex = SD->getLayoutOrder();
 
   ++stats::SectionLayouts;
 
   // Compute the section start address.
   uint64_t StartAddress = 0;
   if (SectionOrderIndex) {
-    MCSectionData *Prev = Layout.getSectionOrder()[SectionOrderIndex - 1];
-    StartAddress = (Layout.getSectionAddress(Prev) +
-                    Layout.getSectionAddressSize(Prev));
+    MCSectionData *Prev = getSectionOrder()[SectionOrderIndex - 1];
+    StartAddress = getSectionAddress(Prev) + getSectionAddressSize(Prev);
   }
 
   // Honor the section alignment requirements.
-  StartAddress = RoundUpToAlignment(StartAddress, SD.getAlignment());
+  StartAddress = RoundUpToAlignment(StartAddress, SD->getAlignment());
 
   // Set the section address.
-  Layout.setSectionAddress(&SD, StartAddress);
+  setSectionAddress(SD, StartAddress);
 
-  for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it)
-    LayoutFragment(Layout, *it);
+  for (MCSectionData::iterator it = SD->begin(), ie = SD->end(); it != ie; ++it)
+    LayoutFragment(it);
 }
 
 /// WriteFragmentData - Write the \arg F data to the output file.
@@ -754,8 +756,7 @@ bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
   ++stats::RelaxationSteps;
 
   // Layout the sections in order.
-  for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i)
-    LayoutSection(Layout, i);
+  Layout.LayoutFile();
 
   // Scan for fragments that need relaxation.
   bool WasRelaxed = false;