[llvm-dwp] Emit a rather fictional debug_cu_index
[oota-llvm.git] / include / llvm / DebugInfo / DWARF / DWARFUnitIndex.h
1 //===-- DWARFUnitIndex.h --------------------------------------------------===//
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_LIB_DEBUGINFO_DWARFUNITINDEX_H
11 #define LLVM_LIB_DEBUGINFO_DWARFUNITINDEX_H
12
13 #include "llvm/Support/DataExtractor.h"
14 #include "llvm/Support/Format.h"
15 #include "llvm/Support/raw_ostream.h"
16 #include <cstdint>
17
18 namespace llvm {
19
20 enum DWARFSectionKind {
21   DW_SECT_INFO = 1,
22   DW_SECT_TYPES,
23   DW_SECT_ABBREV,
24   DW_SECT_LINE,
25   DW_SECT_LOC,
26   DW_SECT_STR_OFFSETS,
27   DW_SECT_MACINFO,
28   DW_SECT_MACRO,
29 };
30
31 class DWARFUnitIndex {
32   struct Header {
33     uint32_t Version;
34     uint32_t NumColumns;
35     uint32_t NumUnits;
36     uint32_t NumBuckets = 0;
37
38     bool parse(DataExtractor IndexData, uint32_t *OffsetPtr);
39     void dump(raw_ostream &OS) const;
40   };
41
42 public:
43   class Entry {
44   public:
45     struct SectionContribution {
46       uint32_t Offset;
47       uint32_t Length;
48     };
49
50   private:
51     const DWARFUnitIndex *Index;
52     uint64_t Signature;
53     std::unique_ptr<SectionContribution[]> Contributions;
54     friend class DWARFUnitIndex;
55
56   public:
57     const SectionContribution *getOffset(DWARFSectionKind Sec) const;
58     const SectionContribution *getOffset() const;
59   };
60
61 private:
62   struct Header Header;
63
64   DWARFSectionKind InfoColumnKind;
65   int InfoColumn = -1;
66   std::unique_ptr<DWARFSectionKind[]> ColumnKinds;
67   std::unique_ptr<Entry[]> Rows;
68
69   static StringRef getColumnHeader(DWARFSectionKind DS);
70   bool parseImpl(DataExtractor IndexData);
71
72 public:
73   bool parse(DataExtractor IndexData);
74   DWARFUnitIndex(DWARFSectionKind InfoColumnKind)
75       : InfoColumnKind(InfoColumnKind) {}
76   void dump(raw_ostream &OS) const;
77   const Entry *getFromOffset(uint32_t Offset) const;
78 };
79 }
80
81 #endif