1//===- DWARFUnitIndex.h -----------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H 11#define LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H 12 13#include "llvm/ADT/ArrayRef.h" 14#include "llvm/ADT/StringRef.h" 15#include "llvm/Support/DataExtractor.h" 16#include <cstdint> 17#include <memory> 18 19namespace llvm { 20 21class raw_ostream; 22 23enum DWARFSectionKind { 24 DW_SECT_INFO = 1, 25 DW_SECT_TYPES, 26 DW_SECT_ABBREV, 27 DW_SECT_LINE, 28 DW_SECT_LOC, 29 DW_SECT_STR_OFFSETS, 30 DW_SECT_MACINFO, 31 DW_SECT_MACRO, 32}; 33 34class DWARFUnitIndex { 35 struct Header { 36 uint32_t Version; 37 uint32_t NumColumns; 38 uint32_t NumUnits; 39 uint32_t NumBuckets = 0; 40 41 bool parse(DataExtractor IndexData, uint32_t *OffsetPtr); 42 void dump(raw_ostream &OS) const; 43 }; 44 45public: 46 class Entry { 47 public: 48 struct SectionContribution { 49 uint32_t Offset; 50 uint32_t Length; 51 }; 52 53 private: 54 const DWARFUnitIndex *Index; 55 uint64_t Signature; 56 std::unique_ptr<SectionContribution[]> Contributions; 57 friend class DWARFUnitIndex; 58 59 public: 60 const SectionContribution *getOffset(DWARFSectionKind Sec) const; 61 const SectionContribution *getOffset() const; 62 63 const SectionContribution *getOffsets() const { 64 return Contributions.get(); 65 } 66 67 uint64_t getSignature() const { return Signature; } 68 }; 69 70private: 71 struct Header Header; 72 73 DWARFSectionKind InfoColumnKind; 74 int InfoColumn = -1; 75 std::unique_ptr<DWARFSectionKind[]> ColumnKinds; 76 std::unique_ptr<Entry[]> Rows; 77 78 static StringRef getColumnHeader(DWARFSectionKind DS); 79 80 bool parseImpl(DataExtractor IndexData); 81 82public: 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 94 ArrayRef<DWARFSectionKind> getColumnKinds() const { 95 return makeArrayRef(ColumnKinds.get(), Header.NumColumns); 96 } 97 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