1292932Sdim//===-- DebugMacros.h -------------------------------------------*- C++ -*-===//
2292932Sdim//
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
6292932Sdim//
7292932Sdim//===----------------------------------------------------------------------===//
8292932Sdim
9292932Sdim#ifndef liblldb_DebugMacros_h_
10292932Sdim#define liblldb_DebugMacros_h_
11292932Sdim
12292932Sdim#include <memory>
13292932Sdim#include <vector>
14292932Sdim
15321369Sdim#include "lldb/Utility/ConstString.h"
16292932Sdim#include "lldb/lldb-private.h"
17292932Sdim
18292932Sdimnamespace lldb_private {
19292932Sdim
20292932Sdimclass CompileUnit;
21292932Sdimclass DebugMacros;
22292932Sdimtypedef std::shared_ptr<DebugMacros> DebugMacrosSP;
23292932Sdim
24314564Sdimclass DebugMacroEntry {
25292932Sdimpublic:
26360784Sdim  enum EntryType : uint8_t {
27360784Sdim      INVALID, DEFINE, UNDEF, START_FILE, END_FILE, INDIRECT
28360784Sdim  };
29292932Sdim
30292932Sdimpublic:
31314564Sdim  static DebugMacroEntry CreateDefineEntry(uint32_t line, const char *str);
32292932Sdim
33314564Sdim  static DebugMacroEntry CreateUndefEntry(uint32_t line, const char *str);
34292932Sdim
35314564Sdim  static DebugMacroEntry CreateStartFileEntry(uint32_t line,
36314564Sdim                                              uint32_t debug_line_file_idx);
37292932Sdim
38314564Sdim  static DebugMacroEntry CreateEndFileEntry();
39292932Sdim
40314564Sdim  static DebugMacroEntry
41314564Sdim  CreateIndirectEntry(const DebugMacrosSP &debug_macros_sp);
42292932Sdim
43314564Sdim  DebugMacroEntry() : m_type(INVALID) {}
44292932Sdim
45314564Sdim  ~DebugMacroEntry() = default;
46292932Sdim
47360784Sdim  EntryType GetType() const { return static_cast<EntryType>(m_type); }
48292932Sdim
49314564Sdim  uint64_t GetLineNumber() const { return m_line; }
50292932Sdim
51314564Sdim  ConstString GetMacroString() const { return m_str; }
52292932Sdim
53314564Sdim  const FileSpec &GetFileSpec(CompileUnit *comp_unit) const;
54292932Sdim
55314564Sdim  DebugMacros *GetIndirectDebugMacros() const {
56314564Sdim    return m_debug_macros_sp.get();
57314564Sdim  }
58292932Sdim
59292932Sdimprivate:
60314564Sdim  DebugMacroEntry(EntryType type, uint32_t line, uint32_t debug_line_file_idx,
61314564Sdim                  const char *str);
62292932Sdim
63314564Sdim  DebugMacroEntry(EntryType type, const DebugMacrosSP &debug_macros_sp);
64292932Sdim
65360784Sdim  uint32_t m_type : 3;
66314564Sdim  uint32_t m_line : 29;
67314564Sdim  uint32_t m_debug_line_file_idx;
68314564Sdim  ConstString m_str;
69314564Sdim  DebugMacrosSP m_debug_macros_sp;
70292932Sdim};
71292932Sdim
72314564Sdimclass DebugMacros {
73292932Sdimpublic:
74314564Sdim  DebugMacros() = default;
75292932Sdim
76314564Sdim  ~DebugMacros() = default;
77292932Sdim
78314564Sdim  void AddMacroEntry(const DebugMacroEntry &entry) {
79314564Sdim    m_macro_entries.push_back(entry);
80314564Sdim  }
81292932Sdim
82314564Sdim  size_t GetNumMacroEntries() const { return m_macro_entries.size(); }
83292932Sdim
84314564Sdim  DebugMacroEntry GetMacroEntryAtIndex(const size_t index) const {
85314564Sdim    if (index < m_macro_entries.size())
86314564Sdim      return m_macro_entries[index];
87314564Sdim    else
88314564Sdim      return DebugMacroEntry();
89314564Sdim  }
90292932Sdim
91292932Sdimprivate:
92314564Sdim  DISALLOW_COPY_AND_ASSIGN(DebugMacros);
93292932Sdim
94314564Sdim  std::vector<DebugMacroEntry> m_macro_entries;
95292932Sdim};
96292932Sdim
97292932Sdim} // namespace lldb_private
98292932Sdim
99292932Sdim#endif // liblldb_DebugMacros_h_
100