diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-05-12 17:56:47 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-05-12 17:56:47 +0000 |
commit | a11479eb49eac5d3378a1854dc1c6e4f5397886c (patch) | |
tree | 6169c5c19ac1af625ec18bdf887475dbc6b921b5 /llvm/lib/MC/MCAssembler.cpp | |
parent | cf925cb272888daacde875a43437cbe05079269f (diff) | |
download | bcm5719-llvm-a11479eb49eac5d3378a1854dc1c6e4f5397886c.tar.gz bcm5719-llvm-a11479eb49eac5d3378a1854dc1c6e4f5397886c.zip |
MC: Simplify LayoutSection to just take the index of the section to layout.
llvm-svn: 103627
Diffstat (limited to 'llvm/lib/MC/MCAssembler.cpp')
-rw-r--r-- | llvm/lib/MC/MCAssembler.cpp | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index 60349e69aa2..aefe2c42946 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/lib/MC/MCAssembler.cpp @@ -68,12 +68,9 @@ void MCAsmLayout::UpdateForSlide(MCFragment *F, int SlideAmount) { // // FIXME-PERF: This is O(N^2), but will be eliminated once we get smarter. - // Layout the concrete sections and fragments. - uint64_t Address = 0; - for (iterator it = begin(), ie = end(); it != ie; ++it) { - // Layout the section fragments and its size. - Address = getAssembler().LayoutSection(**it, *this, Address); - } + // Layout the sections in order. + for (unsigned i = 0, e = getSectionOrder().size(); i != e; ++i) + getAssembler().LayoutSection(*this, i); } uint64_t MCAsmLayout::getFragmentAddress(const MCFragment *F) const { @@ -365,13 +362,20 @@ bool MCAssembler::EvaluateFixup(const MCAsmLayout &Layout, return IsResolved; } -uint64_t MCAssembler::LayoutSection(MCSectionData &SD, - MCAsmLayout &Layout, - uint64_t StartAddress) { +void MCAssembler::LayoutSection(MCAsmLayout &Layout, + unsigned SectionOrderIndex) { + MCSectionData &SD = *Layout.getSectionOrder()[SectionOrderIndex]; bool IsVirtual = getBackend().isVirtualSection(SD.getSection()); ++stats::SectionLayouts; + // Get the section start address. + uint64_t StartAddress = 0; + if (SectionOrderIndex) { + MCSectionData *Prev = Layout.getSectionOrder()[SectionOrderIndex - 1]; + StartAddress = Layout.getSectionAddress(Prev) + Layout.getSectionSize(Prev); + } + // Align this section if necessary by adding padding bytes to the previous // section. It is safe to adjust this out-of-band, because no symbol or // fragment is allowed to point past the end of the section at any time. @@ -469,8 +473,6 @@ uint64_t MCAssembler::LayoutSection(MCSectionData &SD, Layout.setSectionFileSize(&SD, 0); else Layout.setSectionFileSize(&SD, Address - StartAddress); - - return Address; } /// WriteFragmentData - Write the \arg F data to the output file. @@ -705,13 +707,9 @@ bool MCAssembler::FragmentNeedsRelaxation(const MCInstFragment *IF, bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) { ++stats::RelaxationSteps; - // Layout the concrete sections and fragments. - uint64_t Address = 0; - for (MCAsmLayout::iterator it = Layout.begin(), - ie = Layout.end(); it != ie; ++it) { - // Layout the section fragments and its size. - Address = LayoutSection(**it, Layout, Address); - } + // Layout the sections in order. + for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i) + LayoutSection(Layout, i); // Scan for fragments that need relaxation. bool WasRelaxed = false; |