[lld] r296700 - Split GdbIndexBuilder class into non-member functions.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 1 14:54:50 PST 2017
Author: ruiu
Date: Wed Mar 1 16:54:50 2017
New Revision: 296700
URL: http://llvm.org/viewvc/llvm-project?rev=296700&view=rev
Log:
Split GdbIndexBuilder class into non-member functions.
That class had three member functions, and all of them are just reader
methods that did not depend on class members, so they can be just non-
member functions.
Probably we should reorganize the functions themselves because their
return types doesn't make much sense to me, but for now I just moved
these functions out of the class.
Modified:
lld/trunk/ELF/GdbIndex.cpp
lld/trunk/ELF/GdbIndex.h
lld/trunk/ELF/SyntheticSections.cpp
lld/trunk/ELF/SyntheticSections.h
Modified: lld/trunk/ELF/GdbIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/GdbIndex.cpp?rev=296700&r1=296699&r2=296700&view=diff
==============================================================================
--- lld/trunk/ELF/GdbIndex.cpp (original)
+++ lld/trunk/ELF/GdbIndex.cpp Wed Mar 1 16:54:50 2017
@@ -68,59 +68,6 @@ using namespace llvm::object;
using namespace lld;
using namespace lld::elf;
-class lld::elf::ObjInfoTy : public llvm::LoadedObjectInfo {
- uint64_t getSectionLoadAddress(const object::SectionRef &Sec) const override {
- auto &S = static_cast<const ELFSectionRef &>(Sec);
- if (S.getFlags() & ELF::SHF_ALLOC)
- return S.getOffset();
- return 0;
- }
-
- std::unique_ptr<llvm::LoadedObjectInfo> clone() const override { return {}; }
-};
-
-template <class ELFT>
-GdbIndexBuilder<ELFT>::GdbIndexBuilder(InputSection *Sec)
- : DebugInfoSec(Sec), ObjInfo(new ObjInfoTy) {
- elf::ObjectFile<ELFT> *File = Sec->template getFile<ELFT>();
- Expected<std::unique_ptr<object::ObjectFile>> Obj =
- object::ObjectFile::createObjectFile(File->MB);
-
- if (Obj)
- Dwarf.reset(new DWARFContextInMemory(*Obj.get(), ObjInfo.get()));
- else
- error(toString(File) + ": error creating DWARF context");
-}
-
-template <class ELFT> GdbIndexBuilder<ELFT>::~GdbIndexBuilder() {}
-
-template <class ELFT>
-std::vector<std::pair<typename ELFT::uint, typename ELFT::uint>>
-GdbIndexBuilder<ELFT>::readCUList() {
- std::vector<std::pair<uintX_t, uintX_t>> Ret;
- for (std::unique_ptr<DWARFCompileUnit> &CU : Dwarf->compile_units())
- Ret.push_back(
- {DebugInfoSec->OutSecOff + CU->getOffset(), CU->getLength() + 4});
- return Ret;
-}
-
-template <class ELFT>
-std::vector<std::pair<StringRef, uint8_t>>
-GdbIndexBuilder<ELFT>::readPubNamesAndTypes() {
- const bool IsLE = ELFT::TargetEndianness == llvm::support::little;
- StringRef Data[] = {Dwarf->getGnuPubNamesSection(),
- Dwarf->getGnuPubTypesSection()};
-
- std::vector<std::pair<StringRef, uint8_t>> Ret;
- for (StringRef D : Data) {
- DWARFDebugPubTable PubTable(D, IsLE, true);
- for (const DWARFDebugPubTable::Set &S : PubTable.getData())
- for (const DWARFDebugPubTable::Entry &E : S.Entries)
- Ret.push_back({E.Name, E.Descriptor.toBits()});
- }
- return Ret;
-}
-
std::pair<bool, GdbSymbol *> GdbHashTab::add(uint32_t Hash, size_t Offset) {
GdbSymbol *&Sym = Map[Offset];
if (Sym)
@@ -149,38 +96,3 @@ void GdbHashTab::finalizeContents() {
}
}
}
-
-template <class ELFT>
-static InputSectionBase *findSection(ArrayRef<InputSectionBase *> Arr,
- uint64_t Offset) {
- for (InputSectionBase *S : Arr)
- if (S && S != &InputSection::Discarded)
- if (Offset >= S->Offset && Offset < S->Offset + S->getSize<ELFT>())
- return S;
- return nullptr;
-}
-
-template <class ELFT>
-std::vector<AddressEntry<ELFT>>
-GdbIndexBuilder<ELFT>::readAddressArea(size_t CurrentCU) {
- std::vector<AddressEntry<ELFT>> Ret;
- for (std::unique_ptr<DWARFCompileUnit> &CU : Dwarf->compile_units()) {
- DWARFAddressRangesVector Ranges;
- CU->collectAddressRanges(Ranges);
-
- ArrayRef<InputSectionBase *> Sections =
- DebugInfoSec->template getFile<ELFT>()->getSections();
-
- for (std::pair<uint64_t, uint64_t> &R : Ranges)
- if (InputSectionBase *S = findSection<ELFT>(Sections, R.first))
- Ret.push_back(
- {S, R.first - S->Offset, R.second - S->Offset, CurrentCU});
- ++CurrentCU;
- }
- return Ret;
-}
-
-template class elf::GdbIndexBuilder<ELF32LE>;
-template class elf::GdbIndexBuilder<ELF32BE>;
-template class elf::GdbIndexBuilder<ELF64LE>;
-template class elf::GdbIndexBuilder<ELF64BE>;
Modified: lld/trunk/ELF/GdbIndex.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/GdbIndex.h?rev=296700&r1=296699&r2=296700&view=diff
==============================================================================
--- lld/trunk/ELF/GdbIndex.h (original)
+++ lld/trunk/ELF/GdbIndex.h Wed Mar 1 16:54:50 2017
@@ -18,42 +18,15 @@ namespace lld {
namespace elf {
class InputSection;
-class ObjInfoTy;
// Struct represents single entry of address area of gdb index.
-template <class ELFT> struct AddressEntry {
+struct AddressEntry {
InputSectionBase *Section;
uint64_t LowAddress;
uint64_t HighAddress;
size_t CuIndex;
};
-// GdbIndexBuilder is a helper class used for extracting data required
-// for building .gdb_index section from objects.
-template <class ELFT> class GdbIndexBuilder {
- typedef typename ELFT::uint uintX_t;
-
- InputSection *DebugInfoSec;
- std::unique_ptr<llvm::DWARFContext> Dwarf;
- std::unique_ptr<ObjInfoTy> ObjInfo;
-
-public:
- GdbIndexBuilder(InputSection *DebugInfoSec);
- ~GdbIndexBuilder();
-
- // Extracts the compilation units. Each first element of pair is a offset of a
- // CU in the .debug_info section and second is the length of that CU.
- std::vector<std::pair<uintX_t, uintX_t>> readCUList();
-
- // Extracts the vector of address area entries. Accepts global index of last
- // parsed CU.
- std::vector<AddressEntry<ELFT>> readAddressArea(size_t CurrentCU);
-
- // Method extracts public names and types. It returns list of name and
- // gnu_pub* kind pairs.
- std::vector<std::pair<StringRef, uint8_t>> readPubNamesAndTypes();
-};
-
// Element of GdbHashTab hash table.
struct GdbSymbol {
GdbSymbol(uint32_t Hash, size_t Offset)
Modified: lld/trunk/ELF/SyntheticSections.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=296700&r1=296699&r2=296700&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.cpp (original)
+++ lld/trunk/ELF/SyntheticSections.cpp Wed Mar 1 16:54:50 2017
@@ -27,6 +27,8 @@
#include "Threads.h"
#include "Writer.h"
#include "lld/Config/Version.h"
+#include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h"
+#include "llvm/Object/ELFObjectFile.h"
#include "llvm/Support/Dwarf.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/MD5.h"
@@ -1702,20 +1704,93 @@ static uint32_t hash(StringRef Str) {
return R;
}
+static std::vector<std::pair<uint64_t, uint64_t>>
+readCuList(DWARFContext &Dwarf, InputSection *Sec) {
+ std::vector<std::pair<uint64_t, uint64_t>> Ret;
+ for (std::unique_ptr<DWARFCompileUnit> &CU : Dwarf.compile_units())
+ Ret.push_back({Sec->OutSecOff + CU->getOffset(), CU->getLength() + 4});
+ return Ret;
+}
+
+template <class ELFT>
+static InputSectionBase *findSection(ArrayRef<InputSectionBase *> Arr,
+ uint64_t Offset) {
+ for (InputSectionBase *S : Arr)
+ if (S && S != &InputSection::Discarded)
+ if (Offset >= S->Offset && Offset < S->Offset + S->getSize<ELFT>())
+ return S;
+ return nullptr;
+}
+
+template <class ELFT>
+static std::vector<AddressEntry>
+readAddressArea(DWARFContext &Dwarf, InputSection *Sec, size_t CurrentCU) {
+ std::vector<AddressEntry> Ret;
+
+ for (std::unique_ptr<DWARFCompileUnit> &CU : Dwarf.compile_units()) {
+ DWARFAddressRangesVector Ranges;
+ CU->collectAddressRanges(Ranges);
+
+ ArrayRef<InputSectionBase *> Sections =
+ Sec->template getFile<ELFT>()->getSections();
+
+ for (std::pair<uint64_t, uint64_t> &R : Ranges)
+ if (InputSectionBase *S = findSection<ELFT>(Sections, R.first))
+ Ret.push_back(
+ {S, R.first - S->Offset, R.second - S->Offset, CurrentCU});
+ ++CurrentCU;
+ }
+ return Ret;
+}
+
+static std::vector<std::pair<StringRef, uint8_t>>
+readPubNamesAndTypes(DWARFContext &Dwarf, bool IsLE) {
+ StringRef Data[] = {Dwarf.getGnuPubNamesSection(),
+ Dwarf.getGnuPubTypesSection()};
+
+ std::vector<std::pair<StringRef, uint8_t>> Ret;
+ for (StringRef D : Data) {
+ DWARFDebugPubTable PubTable(D, IsLE, true);
+ for (const DWARFDebugPubTable::Set &Set : PubTable.getData())
+ for (const DWARFDebugPubTable::Entry &Ent : Set.Entries)
+ Ret.push_back({Ent.Name, Ent.Descriptor.toBits()});
+ }
+ 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 {}; }
+};
+
template <class ELFT> void GdbIndexSection<ELFT>::readDwarf(InputSection *Sec) {
- GdbIndexBuilder<ELFT> Builder(Sec);
- if (ErrorCount)
+ elf::ObjectFile<ELFT> *File = Sec->template getFile<ELFT>();
+
+ Expected<std::unique_ptr<object::ObjectFile>> Obj =
+ object::ObjectFile::createObjectFile(File->MB);
+ if (!Obj) {
+ error(toString(File) + ": error creating DWARF context");
return;
+ }
+
+ ObjInfoTy ObjInfo;
+ DWARFContextInMemory Dwarf(*Obj.get(), &ObjInfo);
size_t CuId = CompilationUnits.size();
- std::vector<std::pair<uintX_t, uintX_t>> CuList = Builder.readCUList();
- CompilationUnits.insert(CompilationUnits.end(), CuList.begin(), CuList.end());
+ for (std::pair<uint64_t, uint64_t> &P : readCuList(Dwarf, Sec))
+ CompilationUnits.push_back(P);
- std::vector<AddressEntry<ELFT>> AddrArea = Builder.readAddressArea(CuId);
- AddressArea.insert(AddressArea.end(), AddrArea.begin(), AddrArea.end());
+ for (AddressEntry &Ent : readAddressArea<ELFT>(Dwarf, Sec, CuId))
+ AddressArea.push_back(Ent);
std::vector<std::pair<StringRef, uint8_t>> NamesAndTypes =
- Builder.readPubNamesAndTypes();
+ readPubNamesAndTypes(Dwarf, ELFT::TargetEndianness == support::little);
for (std::pair<StringRef, uint8_t> &Pair : NamesAndTypes) {
uint32_t Hash = hash(Pair.first);
@@ -1785,7 +1860,7 @@ template <class ELFT> void GdbIndexSecti
}
// Write the address area.
- for (AddressEntry<ELFT> &E : AddressArea) {
+ for (AddressEntry &E : AddressArea) {
uintX_t BaseAddr =
E.Section->OutSec->Addr + E.Section->template getOffset<ELFT>(0);
write64le(Buf, BaseAddr + E.LowAddress);
Modified: lld/trunk/ELF/SyntheticSections.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.h?rev=296700&r1=296699&r2=296700&view=diff
==============================================================================
--- lld/trunk/ELF/SyntheticSections.h (original)
+++ lld/trunk/ELF/SyntheticSections.h Wed Mar 1 16:54:50 2017
@@ -521,7 +521,7 @@ public:
// The CU vector portion of the constant pool.
std::vector<std::vector<std::pair<uint32_t, uint8_t>>> CuVectors;
- std::vector<AddressEntry<ELFT>> AddressArea;
+ std::vector<AddressEntry> AddressArea;
private:
void readDwarf(InputSection *Sec);
More information about the llvm-commits
mailing list