[lld] r304895 - [ELF] - Simplify readAddressArea() implementation.
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 7 03:52:02 PDT 2017
Author: grimar
Date: Wed Jun 7 05:52:02 2017
New Revision: 304895
URL: http://llvm.org/viewvc/llvm-project?rev=304895&view=rev
Log:
[ELF] - Simplify readAddressArea() implementation.
Approach significantly simplifies LLD .gdb_index code and makes it much faster.
Also it should resolve issues, like D33176 tries to address once and forever in a clean way.
LLC binary linking without patch and without --gdb-index: 1,599241063
LLC binary linking without patch and with --gdb-index: 6,064316262
LLC binary linking with patch and with --gdb-index: 4,116792104
Time spent for building gdbindex changes from (6,064316262 - 1,599241063 == 4,465075199)
to (4,116792104- 1,599241063 == 2,517551041).
That is 2,517551041/4,465075199 = 0,564 or about 44% speedup.
Differential revision: https://reviews.llvm.org/D33183
Modified:
lld/trunk/ELF/SyntheticSections.cpp
Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=304895&r1=304894&r2=304895&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Wed Jun 7 05:52:02 2017
@@ -1719,10 +1719,15 @@ readAddressArea(DWARFContext &Dwarf, Inp
CU->collectAddressRanges(Ranges);
ArrayRef<InputSectionBase *> Sections = Sec->File->getSections();
- for (DWARFAddressRange &R : Ranges)
- if (InputSection *S = findSection(Sections, R.LowPC))
- Ret.push_back({S, R.LowPC - S->getOffsetInFile(),
- R.HighPC - S->getOffsetInFile(), CurrentCU});
+ for (DWARFAddressRange &R : Ranges) {
+ InputSectionBase *S = Sections[R.SectionIndex];
+ if (!S || S == &InputSection::Discarded || !S->Live)
+ continue;
+ // Range list with zero size has no effect.
+ if (R.LowPC == R.HighPC)
+ continue;
+ Ret.push_back({cast<InputSection>(S), R.LowPC, R.HighPC, CurrentCU});
+ }
++CurrentCU;
}
return Ret;
@@ -1743,17 +1748,6 @@ readPubNamesAndTypes(DWARFContext &Dwarf
return Ret;
}
-class ObjInfoTy : public llvm::LoadedObjectInfo {
- uint64_t getSectionLoadAddress(const object::SectionRef &Sec) const override {
- auto &S = static_cast<const object::ELFSectionRef &>(Sec);
- if (S.getFlags() & ELF::SHF_ALLOC)
- return S.getOffset();
- return 0;
- }
-
- std::unique_ptr<llvm::LoadedObjectInfo> clone() const override { return {}; }
-};
-
void GdbIndexSection::readDwarf(InputSection *Sec) {
Expected<std::unique_ptr<object::ObjectFile>> Obj =
object::ObjectFile::createObjectFile(Sec->File->MB);
@@ -1762,8 +1756,7 @@ void GdbIndexSection::readDwarf(InputSec
return;
}
- ObjInfoTy ObjInfo;
- DWARFContextInMemory Dwarf(*Obj.get(), &ObjInfo);
+ DWARFContextInMemory Dwarf(*Obj.get());
size_t CuId = CompilationUnits.size();
for (std::pair<uint64_t, uint64_t> &P : readCuList(Dwarf, Sec))
More information about the llvm-commits
mailing list