1 //===- DWARFUnitIndex.h -----------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H 10 #define LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H 11 12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/ADT/StringRef.h" 14 #include "llvm/Support/DataExtractor.h" 15 #include <cstdint> 16 #include <memory> 17 18 namespace llvm { 19 20 class raw_ostream; 21 22 enum DWARFSectionKind { 23 DW_SECT_INFO = 1, 24 DW_SECT_TYPES, 25 DW_SECT_ABBREV, 26 DW_SECT_LINE, 27 DW_SECT_LOC, 28 DW_SECT_STR_OFFSETS, 29 DW_SECT_MACINFO, 30 DW_SECT_MACRO, 31 }; 32 33 class DWARFUnitIndex { 34 struct Header { 35 uint32_t Version; 36 uint32_t NumColumns; 37 uint32_t NumUnits; 38 uint32_t NumBuckets = 0; 39 40 bool parse(DataExtractor IndexData, uint64_t *OffsetPtr); 41 void dump(raw_ostream &OS) const; 42 }; 43 44 public: 45 class Entry { 46 public: 47 struct SectionContribution { 48 uint32_t Offset; 49 uint32_t Length; 50 }; 51 52 private: 53 const DWARFUnitIndex *Index; 54 uint64_t Signature; 55 std::unique_ptr<SectionContribution[]> Contributions; 56 friend class DWARFUnitIndex; 57 58 public: 59 const SectionContribution *getOffset(DWARFSectionKind Sec) const; 60 const SectionContribution *getOffset() const; 61 getOffsets()62 const SectionContribution *getOffsets() const { 63 return Contributions.get(); 64 } 65 getSignature()66 uint64_t getSignature() const { return Signature; } 67 }; 68 69 private: 70 struct Header Header; 71 72 DWARFSectionKind InfoColumnKind; 73 int InfoColumn = -1; 74 std::unique_ptr<DWARFSectionKind[]> ColumnKinds; 75 std::unique_ptr<Entry[]> Rows; 76 mutable std::vector<Entry *> OffsetLookup; 77 78 static StringRef getColumnHeader(DWARFSectionKind DS); 79 80 bool parseImpl(DataExtractor IndexData); 81 82 public: DWARFUnitIndex(DWARFSectionKind InfoColumnKind)83 DWARFUnitIndex(DWARFSectionKind InfoColumnKind) 84 : InfoColumnKind(InfoColumnKind) {} 85 86 explicit operator bool() const { return Header.NumBuckets; } 87 88 bool parse(DataExtractor IndexData); 89 void dump(raw_ostream &OS) const; 90 91 const Entry *getFromOffset(uint32_t Offset) const; 92 const Entry *getFromHash(uint64_t Offset) const; 93 getColumnKinds()94 ArrayRef<DWARFSectionKind> getColumnKinds() const { 95 return makeArrayRef(ColumnKinds.get(), Header.NumColumns); 96 } 97 getRows()98 ArrayRef<Entry> getRows() const { 99 return makeArrayRef(Rows.get(), Header.NumBuckets); 100 } 101 }; 102 103 } // end namespace llvm 104 105 #endif // LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H 106