summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/GdbIndex.cpp33
-rw-r--r--lld/ELF/GdbIndex.h13
2 files changed, 19 insertions, 27 deletions
diff --git a/lld/ELF/GdbIndex.cpp b/lld/ELF/GdbIndex.cpp
index a7c002cfe37..ef7240ebb42 100644
--- a/lld/ELF/GdbIndex.cpp
+++ b/lld/ELF/GdbIndex.cpp
@@ -67,18 +67,31 @@ using namespace llvm;
using namespace llvm::object;
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 *DebugInfoSec)
- : DebugInfoSec(DebugInfoSec) {
+ : DebugInfoSec(DebugInfoSec), ObjInfo(new ObjInfoTy) {
if (Expected<std::unique_ptr<object::ObjectFile>> Obj =
object::ObjectFile::createObjectFile(
DebugInfoSec->template getFile<ELFT>()->MB))
- Dwarf.reset(new DWARFContextInMemory(*Obj.get(), this));
+ Dwarf.reset(new DWARFContextInMemory(*Obj.get(), ObjInfo.get()));
else
error(toString(DebugInfoSec->template getFile<ELFT>()) +
": 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() {
@@ -166,22 +179,6 @@ GdbIndexBuilder<ELFT>::readAddressArea(size_t CurrentCU) {
return Ret;
}
-// We return file offset as load address for allocatable sections. That is
-// currently used for collecting address ranges in readAddressArea(). We are
-// able then to find section index that range belongs to.
-template <class ELFT>
-uint64_t GdbIndexBuilder<ELFT>::getSectionLoadAddress(
- const object::SectionRef &Sec) const {
- if (static_cast<const ELFSectionRef &>(Sec).getFlags() & ELF::SHF_ALLOC)
- return static_cast<const ELFSectionRef &>(Sec).getOffset();
- return 0;
-}
-
-template <class ELFT>
-std::unique_ptr<LoadedObjectInfo> GdbIndexBuilder<ELFT>::clone() const {
- return {};
-}
-
namespace lld {
namespace elf {
template class GdbIndexBuilder<ELF32LE>;
diff --git a/lld/ELF/GdbIndex.h b/lld/ELF/GdbIndex.h
index eec573099ef..3a39cb1ea35 100644
--- a/lld/ELF/GdbIndex.h
+++ b/lld/ELF/GdbIndex.h
@@ -18,6 +18,7 @@ namespace lld {
namespace elf {
class InputSection;
+class ObjInfoTy;
// Struct represents single entry of address area of gdb index.
template <class ELFT> struct AddressEntry {
@@ -29,15 +30,16 @@ template <class ELFT> struct AddressEntry {
// GdbIndexBuilder is a helper class used for extracting data required
// for building .gdb_index section from objects.
-template <class ELFT> class GdbIndexBuilder : public llvm::LoadedObjectInfo {
+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.
@@ -50,13 +52,6 @@ public:
// Method extracts public names and types. It returns list of name and
// gnu_pub* kind pairs.
std::vector<std::pair<StringRef, uint8_t>> readPubNamesAndTypes();
-
-private:
- // Method returns section file offset as a load addres for DWARF parser. That
- // allows to find the target section index for address ranges.
- uint64_t
- getSectionLoadAddress(const llvm::object::SectionRef &Sec) const override;
- std::unique_ptr<llvm::LoadedObjectInfo> clone() const override;
};
// Element of GdbHashTab hash table.
OpenPOWER on IntegriCloud