]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / DebugInfo / DWARF / DWARFUnitIndex.h
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, uint32_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
62     const SectionContribution *getOffsets() const {
63       return Contributions.get();
64     }
65
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:
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