diff --git a/include/llvm/MC/MCAsmLayout.h b/include/llvm/MC/MCAsmLayout.h index f866aab95b5..18f720ecc14 100644 --- a/include/llvm/MC/MCAsmLayout.h +++ b/include/llvm/MC/MCAsmLayout.h @@ -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) /// @{ diff --git a/include/llvm/MC/MCAssembler.h b/include/llvm/MC/MCAssembler.h index 6522b672d3e..78a8bb2a072 100644 --- a/include/llvm/MC/MCAssembler.h +++ b/include/llvm/MC/MCAssembler.h @@ -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); diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index dfc2663650e..38994e777ec 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -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;