mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-02 16:54:58 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118377 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6bc6cd223c
commit
e25e1ef48b
@ -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];
|
||||
const MCFragment &Last = *Layout.getSectionOrder().back()->rbegin();
|
||||
unsigned FragmentIndex = Last.getLayoutOrder() + 1;
|
||||
|
||||
for (MCSectionData::iterator it2 = SD->begin(),
|
||||
ie2 = SD->end(); it2 != ie2; ++it2)
|
||||
FragmentIndex++;
|
||||
}
|
||||
|
||||
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) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user