diff options
Diffstat (limited to 'ELF/GdbIndex.h')
-rw-r--r-- | ELF/GdbIndex.h | 89 |
1 files changed, 39 insertions, 50 deletions
diff --git a/ELF/GdbIndex.h b/ELF/GdbIndex.h index bc024e6689ef8..41ae9d793c11f 100644 --- a/ELF/GdbIndex.h +++ b/ELF/GdbIndex.h @@ -19,61 +19,50 @@ namespace elf { class InputSection; -// Struct represents single entry of address area of gdb index. -struct AddressEntry { - InputSection *Section; - uint64_t LowAddress; - uint64_t HighAddress; - uint32_t CuIndex; +struct LLDDWARFSection final : public llvm::DWARFSection { + InputSectionBase *Sec = nullptr; }; -// Struct represents single entry of compilation units list area of gdb index. -// It consist of CU offset in .debug_info section and it's size. -struct CompilationUnitEntry { - uint64_t CuOffset; - uint64_t CuLength; -}; - -// Represents data about symbol and type names which are used -// to build symbol table and constant pool area of gdb index. -struct NameTypeEntry { - StringRef Name; - uint8_t Type; -}; - -// We fill one GdbIndexDataChunk for each object where scan of -// debug information performed. That information futher used -// for filling gdb index section areas. -struct GdbIndexChunk { - InputSection *DebugInfoSec; - std::vector<AddressEntry> AddressArea; - std::vector<CompilationUnitEntry> CompilationUnits; - std::vector<NameTypeEntry> NamesAndTypes; -}; +template <class ELFT> class LLDDwarfObj final : public llvm::DWARFObject { + LLDDWARFSection InfoSection; + LLDDWARFSection RangeSection; + LLDDWARFSection LineSection; + StringRef AbbrevSection; + StringRef GnuPubNamesSection; + StringRef GnuPubTypesSection; + StringRef StrSection; -// Element of GdbHashTab hash table. -struct GdbSymbol { - GdbSymbol(uint32_t Hash, size_t Offset) - : NameHash(Hash), NameOffset(Offset) {} - uint32_t NameHash; - size_t NameOffset; - size_t CuVectorIndex; -}; + template <class RelTy> + llvm::Optional<llvm::RelocAddrEntry> findAux(const InputSectionBase &Sec, + uint64_t Pos, + ArrayRef<RelTy> Rels) const; -// This class manages the hashed symbol table for the .gdb_index section. -// The hash value for a table entry is computed by applying an iterative hash -// function to the symbol's name. -class GdbHashTab final { public: - std::pair<bool, GdbSymbol *> add(uint32_t Hash, size_t Offset); - - void finalizeContents(); - size_t getCapacity() { return Table.size(); } - GdbSymbol *getSymbol(size_t I) { return Table[I]; } - -private: - llvm::DenseMap<size_t, GdbSymbol *> Map; - std::vector<GdbSymbol *> Table; + explicit LLDDwarfObj(ObjFile<ELFT> *Obj); + const llvm::DWARFSection &getInfoSection() const override { + return InfoSection; + } + const llvm::DWARFSection &getRangeSection() const override { + return RangeSection; + } + const llvm::DWARFSection &getLineSection() const override { + return LineSection; + } + StringRef getFileName() const override { return ""; } + StringRef getCUIndexSection() const override { return ""; } + StringRef getAbbrevSection() const override { return AbbrevSection; } + StringRef getStringSection() const override { return StrSection; } + StringRef getGnuPubNamesSection() const override { + return GnuPubNamesSection; + } + StringRef getGnuPubTypesSection() const override { + return GnuPubTypesSection; + } + bool isLittleEndian() const override { + return ELFT::TargetEndianness == llvm::support::little; + } + llvm::Optional<llvm::RelocAddrEntry> find(const llvm::DWARFSection &Sec, + uint64_t Pos) const override; }; } // namespace elf |