1//===- DWARFDebugAbbrev.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_DWARFDEBUGABBREV_H
11#define LLVM_DEBUGINFO_DWARFDEBUGABBREV_H
12
13#include "llvm/DebugInfo/DWARF/DWARFAbbreviationDeclaration.h"
14#include "llvm/Support/DataExtractor.h"
15#include <cstdint>
16#include <map>
17#include <vector>
18
19namespace llvm {
20
21class raw_ostream;
22
23class DWARFAbbreviationDeclarationSet {
24  uint32_t Offset;
25  /// Code of the first abbreviation, if all abbreviations in the set have
26  /// consecutive codes. UINT32_MAX otherwise.
27  uint32_t FirstAbbrCode;
28  std::vector<DWARFAbbreviationDeclaration> Decls;
29
30  using const_iterator =
31      std::vector<DWARFAbbreviationDeclaration>::const_iterator;
32
33public:
34  DWARFAbbreviationDeclarationSet();
35
36  uint32_t getOffset() const { return Offset; }
37  void dump(raw_ostream &OS) const;
38  bool extract(DataExtractor Data, uint32_t *OffsetPtr);
39
40  const DWARFAbbreviationDeclaration *
41  getAbbreviationDeclaration(uint32_t AbbrCode) const;
42
43  const_iterator begin() const {
44    return Decls.begin();
45  }
46
47  const_iterator end() const {
48    return Decls.end();
49  }
50
51private:
52  void clear();
53};
54
55class DWARFDebugAbbrev {
56  using DWARFAbbreviationDeclarationSetMap =
57      std::map<uint64_t, DWARFAbbreviationDeclarationSet>;
58
59  mutable DWARFAbbreviationDeclarationSetMap AbbrDeclSets;
60  mutable DWARFAbbreviationDeclarationSetMap::const_iterator PrevAbbrOffsetPos;
61  mutable Optional<DataExtractor> Data;
62
63public:
64  DWARFDebugAbbrev();
65
66  const DWARFAbbreviationDeclarationSet *
67  getAbbreviationDeclarationSet(uint64_t CUAbbrOffset) const;
68
69  void dump(raw_ostream &OS) const;
70  void parse() const;
71  void extract(DataExtractor Data);
72
73  DWARFAbbreviationDeclarationSetMap::const_iterator begin() const {
74    parse();
75    return AbbrDeclSets.begin();
76  }
77
78  DWARFAbbreviationDeclarationSetMap::const_iterator end() const {
79    return AbbrDeclSets.end();
80  }
81
82private:
83  void clear();
84};
85
86} // end namespace llvm
87
88#endif // LLVM_DEBUGINFO_DWARFDEBUGABBREV_H
89