blob: 49ed4bb222f3ff597592b33c2305ce0963b673f4 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- 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