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 | |
| parent | 5a27007bb74a0d1c388a5db4f18e7e1d60220f65 (diff) | |
| download | bcm5719-llvm-20b11eaa0140c995d78deec463ca45cdc52ea4ef.tar.gz bcm5719-llvm-20b11eaa0140c995d78deec463ca45cdc52ea4ef.zip | |
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')
| -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 9dc67644b7a..8e87d5b5ee9 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) { | 

