Avoid counting sections twice.
We were counting the size of the bss section holding common symbols twice:
Dot += CurOutSec->getSize();
flush();
The new code is also simpler as now flush is the only function that
inserts in AlreadyOutputOS, which makes sense since the set hold fully
output sections.
llvm-svn: 282285
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 8227182..b7c65ed 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -383,10 +383,13 @@
}
template <class ELFT> void LinkerScript<ELFT>::flush() {
- if (auto *OutSec = dyn_cast_or_null<OutputSection<ELFT>>(CurOutSec)) {
+ if (!CurOutSec || !AlreadyOutputOS.insert(CurOutSec).second)
+ return;
+ if (auto *OutSec = dyn_cast<OutputSection<ELFT>>(CurOutSec)) {
for (InputSection<ELFT> *I : OutSec->Sections)
output(I);
- AlreadyOutputOS.insert(CurOutSec);
+ } else {
+ Dot += CurOutSec->getSize();
}
}
@@ -421,8 +424,8 @@
switchTo(IB->OutSec);
if (auto *I = dyn_cast<InputSection<ELFT>>(IB))
output(I);
- else if (AlreadyOutputOS.insert(CurOutSec).second)
- Dot += CurOutSec->getSize();
+ else
+ flush();
}
}
@@ -454,14 +457,9 @@
.base();
for (auto I = Cmd->Commands.begin(); I != E; ++I)
process(**I);
- flush();
- for (OutputSectionBase<ELFT> *Base : Sections) {
- if (AlreadyOutputOS.count(Base))
- continue;
+ for (OutputSectionBase<ELFT> *Base : Sections)
switchTo(Base);
- Dot += CurOutSec->getSize();
- flush();
- }
+ flush();
std::for_each(E, Cmd->Commands.end(),
[this](std::unique_ptr<BaseCommand> &B) { process(*B.get()); });
}