//===- GdbIndex.h --------------------------------------------*- C++ -*-===// // // The LLVM Linker // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===-------------------------------------------------------------------===// #ifndef LLD_ELF_GDB_INDEX_H #define LLD_ELF_GDB_INDEX_H #include "InputFiles.h" #include "llvm/Object/ELF.h" #include "llvm/DebugInfo/DWARF/DWARFContext.h" namespace lld { namespace elf { template class InputSection; // Struct represents single entry of address area of gdb index. template 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 GdbIndexBuilder : public llvm::LoadedObjectInfo { typedef typename ELFT::uint uintX_t; InputSection *DebugInfoSec; std::unique_ptr Dwarf; public: GdbIndexBuilder(InputSection *DebugInfoSec); // 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> readCUList(); // Extracts the vector of address area entries. Accepts global index of last // parsed CU. std::vector> readAddressArea(size_t CurrentCU); // Method extracts public names and types. It returns list of name and // gnu_pub* kind pairs. std::vector> 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 clone() const override; }; // 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; }; // 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 add(uint32_t Hash, size_t Offset); size_t getCapacity() { return Table.size(); } GdbSymbol *getSymbol(size_t I) { return Table[I]; } private: void expand(); GdbSymbol **findSlot(uint32_t Hash, size_t Offset); llvm::BumpPtrAllocator Alloc; std::vector Table; // Size keeps the amount of filled entries in Table. size_t Size = 0; // Initial size must be a power of 2. static const int32_t InitialSize = 1024; }; } // namespace elf } // namespace lld #endif