1321369Sdim//===- DWARFUnitIndex.h -----------------------------------------*- C++ -*-===// 2292915Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6292915Sdim// 7292915Sdim//===----------------------------------------------------------------------===// 8292915Sdim 9321369Sdim#ifndef LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H 10321369Sdim#define LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H 11292915Sdim 12309124Sdim#include "llvm/ADT/ArrayRef.h" 13321369Sdim#include "llvm/ADT/StringRef.h" 14292915Sdim#include "llvm/Support/DataExtractor.h" 15292915Sdim#include <cstdint> 16321369Sdim#include <memory> 17292915Sdim 18292915Sdimnamespace llvm { 19292915Sdim 20321369Sdimclass raw_ostream; 21321369Sdim 22292915Sdimenum DWARFSectionKind { 23292915Sdim DW_SECT_INFO = 1, 24292915Sdim DW_SECT_TYPES, 25292915Sdim DW_SECT_ABBREV, 26292915Sdim DW_SECT_LINE, 27292915Sdim DW_SECT_LOC, 28292915Sdim DW_SECT_STR_OFFSETS, 29292915Sdim DW_SECT_MACINFO, 30292915Sdim DW_SECT_MACRO, 31292915Sdim}; 32292915Sdim 33292915Sdimclass DWARFUnitIndex { 34292915Sdim struct Header { 35292915Sdim uint32_t Version; 36292915Sdim uint32_t NumColumns; 37292915Sdim uint32_t NumUnits; 38292915Sdim uint32_t NumBuckets = 0; 39292915Sdim 40360784Sdim bool parse(DataExtractor IndexData, uint64_t *OffsetPtr); 41292915Sdim void dump(raw_ostream &OS) const; 42292915Sdim }; 43292915Sdim 44292915Sdimpublic: 45292915Sdim class Entry { 46292915Sdim public: 47292915Sdim struct SectionContribution { 48292915Sdim uint32_t Offset; 49292915Sdim uint32_t Length; 50292915Sdim }; 51292915Sdim 52292915Sdim private: 53292915Sdim const DWARFUnitIndex *Index; 54292915Sdim uint64_t Signature; 55292915Sdim std::unique_ptr<SectionContribution[]> Contributions; 56292915Sdim friend class DWARFUnitIndex; 57292915Sdim 58292915Sdim public: 59292915Sdim const SectionContribution *getOffset(DWARFSectionKind Sec) const; 60292915Sdim const SectionContribution *getOffset() const; 61321369Sdim 62309124Sdim const SectionContribution *getOffsets() const { 63309124Sdim return Contributions.get(); 64309124Sdim } 65321369Sdim 66309124Sdim uint64_t getSignature() const { return Signature; } 67292915Sdim }; 68292915Sdim 69292915Sdimprivate: 70292915Sdim struct Header Header; 71292915Sdim 72292915Sdim DWARFSectionKind InfoColumnKind; 73292915Sdim int InfoColumn = -1; 74292915Sdim std::unique_ptr<DWARFSectionKind[]> ColumnKinds; 75292915Sdim std::unique_ptr<Entry[]> Rows; 76344779Sdim mutable std::vector<Entry *> OffsetLookup; 77292915Sdim 78292915Sdim static StringRef getColumnHeader(DWARFSectionKind DS); 79321369Sdim 80292915Sdim bool parseImpl(DataExtractor IndexData); 81292915Sdim 82292915Sdimpublic: 83292915Sdim DWARFUnitIndex(DWARFSectionKind InfoColumnKind) 84292915Sdim : InfoColumnKind(InfoColumnKind) {} 85321369Sdim 86327952Sdim explicit operator bool() const { return Header.NumBuckets; } 87327952Sdim 88321369Sdim bool parse(DataExtractor IndexData); 89292915Sdim void dump(raw_ostream &OS) const; 90327952Sdim 91292915Sdim const Entry *getFromOffset(uint32_t Offset) const; 92327952Sdim const Entry *getFromHash(uint64_t Offset) const; 93321369Sdim 94309124Sdim ArrayRef<DWARFSectionKind> getColumnKinds() const { 95309124Sdim return makeArrayRef(ColumnKinds.get(), Header.NumColumns); 96309124Sdim } 97321369Sdim 98309124Sdim ArrayRef<Entry> getRows() const { 99309124Sdim return makeArrayRef(Rows.get(), Header.NumBuckets); 100309124Sdim } 101292915Sdim}; 102292915Sdim 103321369Sdim} // end namespace llvm 104321369Sdim 105321369Sdim#endif // LLVM_DEBUGINFO_DWARF_DWARFUNITINDEX_H 106