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