diff options
| author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-11-07 15:03:27 +0000 |
|---|---|---|
| committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-11-07 15:03:27 +0000 |
| commit | 20b11eaa0140c995d78deec463ca45cdc52ea4ef (patch) | |
| tree | e7561f91c9e43aeac347f228ab843bf8b7c7eefd /llvm/lib/MC/MCAssembler.cpp | |
| parent | 5a27007bb74a0d1c388a5db4f18e7e1d60220f65 (diff) | |
| download | llvm-20b11eaa0140c995d78deec463ca45cdc52ea4ef.zip llvm-20b11eaa0140c995d78deec463ca45cdc52ea4ef.tar.gz llvm-20b11eaa0140c995d78deec463ca45cdc52ea4ef.tar.bz2 | |
Speed up AddSectionToTheEnd. It was walking all fragments in all sections.
This is really slow with we have 1000s of sections each with a corresponding
relocation section. Also, it is only used by the ELF writer to add
basic data, so there is no need to force a new layout pass.
Should fix PR8563.
llvm-svn: 118377
Diffstat (limited to 'llvm/lib/MC/MCAssembler.cpp')
| -rw-r--r-- | llvm/lib/MC/MCAssembler.cpp | 23 |
1 files changed, 4 insertions, 19 deletions
diff --git a/llvm/lib/MC/MCAssembler.cpp b/llvm/lib/MC/MCAssembler.cpp index 9dc67644..8e87d5b 100644 --- a/llvm/lib/MC/MCAssembler.cpp +++ b/llvm/lib/MC/MCAssembler.cpp @@ -590,24 +590,14 @@ void MCAssembler::WriteSectionData(const MCSectionData *SD, void MCAssembler::AddSectionToTheEnd(const MCObjectWriter &Writer, MCSectionData &SD, MCAsmLayout &Layout) { // Create dummy fragments and assign section ordinals. - unsigned SectionIndex = 0; - for (MCAssembler::iterator it = begin(), ie = end(); it != ie; ++it) - SectionIndex++; - + unsigned SectionIndex = size(); SD.setOrdinal(SectionIndex); // Assign layout order indices to sections and fragments. - unsigned FragmentIndex = 0; - unsigned i = 0; - for (unsigned e = Layout.getSectionOrder().size(); i != e; ++i) { - MCSectionData *SD = Layout.getSectionOrder()[i]; - - for (MCSectionData::iterator it2 = SD->begin(), - ie2 = SD->end(); it2 != ie2; ++it2) - FragmentIndex++; - } + const MCFragment &Last = *Layout.getSectionOrder().back()->rbegin(); + unsigned FragmentIndex = Last.getLayoutOrder() + 1; - SD.setLayoutOrder(i); + SD.setLayoutOrder(Layout.getSectionOrder().size()); for (MCSectionData::iterator it2 = SD.begin(), ie2 = SD.end(); it2 != ie2; ++it2) { it2->setLayoutOrder(FragmentIndex++); @@ -615,11 +605,6 @@ void MCAssembler::AddSectionToTheEnd(const MCObjectWriter &Writer, Layout.getSectionOrder().push_back(&SD); Layout.LayoutSection(&SD); - - // Layout until everything fits. - while (LayoutOnce(Writer, Layout)) - continue; - } void MCAssembler::Finish(MCObjectWriter *Writer) { |
