diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-21 04:22:09 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-21 04:22:09 +0000 |
commit | 62b83b62f377ac248038672015dc65970327f786 (patch) | |
tree | 05dbe876b43f097179e7e225dada431baaf96285 /lib/MC/MCAssembler.cpp | |
parent | c19aadb8b0219462ff55f4bdc8106cebc1245bb6 (diff) |
Layout one section until no relaxations are done and then move to the next
section.
This helps because in practice sections form a dag with debug sections pointing
to text sections. Finishing up the text sections first makes the debug section
relaxation trivial.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122314 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAssembler.cpp')
-rw-r--r-- | lib/MC/MCAssembler.cpp | 75 |
1 files changed, 41 insertions, 34 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 2d89fb3ed9..ed4401d749 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -707,46 +707,53 @@ bool MCAssembler::RelaxAlignment(MCAsmLayout &Layout, return OldSize != Size; } +bool MCAssembler::LayoutSectionOnce(MCAsmLayout &Layout, + MCSectionData &SD) { + MCFragment *FirstInvalidFragment = NULL; + // Scan for fragments that need relaxation. + for (MCSectionData::iterator it2 = SD.begin(), + ie2 = SD.end(); it2 != ie2; ++it2) { + // Check if this is an fragment that needs relaxation. + bool relaxedFrag = false; + switch(it2->getKind()) { + default: + break; + case MCFragment::FT_Align: + relaxedFrag = RelaxAlignment(Layout, *cast<MCAlignFragment>(it2)); + break; + case MCFragment::FT_Inst: + relaxedFrag = RelaxInstruction(Layout, *cast<MCInstFragment>(it2)); + break; + case MCFragment::FT_Org: + relaxedFrag = RelaxOrg(Layout, *cast<MCOrgFragment>(it2)); + break; + case MCFragment::FT_Dwarf: + relaxedFrag = RelaxDwarfLineAddr(Layout, + *cast<MCDwarfLineAddrFragment>(it2)); + break; + case MCFragment::FT_LEB: + relaxedFrag = RelaxLEB(Layout, *cast<MCLEBFragment>(it2)); + break; + } + // Update the layout, and remember that we relaxed. + if (relaxedFrag && !FirstInvalidFragment) + FirstInvalidFragment = it2; + } + if (FirstInvalidFragment) { + Layout.Invalidate(FirstInvalidFragment); + return true; + } + return false; +} + bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) { ++stats::RelaxationSteps; - // Scan for fragments that need relaxation. bool WasRelaxed = false; for (iterator it = begin(), ie = end(); it != ie; ++it) { MCSectionData &SD = *it; - MCFragment *FirstInvalidFragment = NULL; - - for (MCSectionData::iterator it2 = SD.begin(), - ie2 = SD.end(); it2 != ie2; ++it2) { - // Check if this is an fragment that needs relaxation. - bool relaxedFrag = false; - switch(it2->getKind()) { - default: - break; - case MCFragment::FT_Align: - relaxedFrag = RelaxAlignment(Layout, *cast<MCAlignFragment>(it2)); - break; - case MCFragment::FT_Inst: - relaxedFrag = RelaxInstruction(Layout, *cast<MCInstFragment>(it2)); - break; - case MCFragment::FT_Org: - relaxedFrag = RelaxOrg(Layout, *cast<MCOrgFragment>(it2)); - break; - case MCFragment::FT_Dwarf: - relaxedFrag = RelaxDwarfLineAddr(Layout, - *cast<MCDwarfLineAddrFragment>(it2)); - break; - case MCFragment::FT_LEB: - relaxedFrag = RelaxLEB(Layout, *cast<MCLEBFragment>(it2)); - break; - } - // Update the layout, and remember that we relaxed. - if (relaxedFrag && !FirstInvalidFragment) - FirstInvalidFragment = it2; - WasRelaxed |= relaxedFrag; - } - if (FirstInvalidFragment) - Layout.Invalidate(FirstInvalidFragment); + while(LayoutSectionOnce(Layout, SD)) + WasRelaxed = true; } return WasRelaxed; |