1 | //===-- DebugMacros.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 LLDB_SYMBOL_DEBUGMACROS_H |
10 | #define LLDB_SYMBOL_DEBUGMACROS_H |
11 | |
12 | #include <memory> |
13 | #include <vector> |
14 | |
15 | #include "lldb/Utility/ConstString.h" |
16 | #include "lldb/lldb-private.h" |
17 | |
18 | namespace lldb_private { |
19 | |
20 | class CompileUnit; |
21 | class DebugMacros; |
22 | typedef std::shared_ptr<DebugMacros> DebugMacrosSP; |
23 | |
24 | class DebugMacroEntry { |
25 | public: |
26 | enum EntryType : uint8_t { |
27 | INVALID, DEFINE, UNDEF, START_FILE, END_FILE, INDIRECT |
28 | }; |
29 | |
30 | static DebugMacroEntry CreateDefineEntry(uint32_t line, const char *str); |
31 | |
32 | static DebugMacroEntry CreateUndefEntry(uint32_t line, const char *str); |
33 | |
34 | static DebugMacroEntry CreateStartFileEntry(uint32_t line, |
35 | uint32_t debug_line_file_idx); |
36 | |
37 | static DebugMacroEntry CreateEndFileEntry(); |
38 | |
39 | static DebugMacroEntry |
40 | CreateIndirectEntry(const DebugMacrosSP &debug_macros_sp); |
41 | |
42 | DebugMacroEntry() : m_type(INVALID), m_line(0), m_debug_line_file_idx(0) {} |
43 | |
44 | ~DebugMacroEntry() = default; |
45 | |
46 | EntryType GetType() const { return static_cast<EntryType>(m_type); } |
47 | |
48 | uint64_t GetLineNumber() const { return m_line; } |
49 | |
50 | ConstString GetMacroString() const { return m_str; } |
51 | |
52 | const FileSpec &GetFileSpec(CompileUnit *comp_unit) const; |
53 | |
54 | DebugMacros *GetIndirectDebugMacros() const { |
55 | return m_debug_macros_sp.get(); |
56 | } |
57 | |
58 | private: |
59 | DebugMacroEntry(EntryType type, uint32_t line, uint32_t debug_line_file_idx, |
60 | const char *str); |
61 | |
62 | DebugMacroEntry(EntryType type, const DebugMacrosSP &debug_macros_sp); |
63 | |
64 | uint32_t m_type : 3; |
65 | uint32_t m_line : 29; |
66 | uint32_t m_debug_line_file_idx; |
67 | ConstString m_str; |
68 | DebugMacrosSP m_debug_macros_sp; |
69 | }; |
70 | |
71 | class DebugMacros { |
72 | public: |
73 | DebugMacros() = default; |
74 | |
75 | ~DebugMacros() = default; |
76 | |
77 | void AddMacroEntry(const DebugMacroEntry &entry) { |
78 | m_macro_entries.push_back(x: entry); |
79 | } |
80 | |
81 | size_t GetNumMacroEntries() const { return m_macro_entries.size(); } |
82 | |
83 | DebugMacroEntry GetMacroEntryAtIndex(const size_t index) const { |
84 | if (index < m_macro_entries.size()) |
85 | return m_macro_entries[index]; |
86 | else |
87 | return DebugMacroEntry(); |
88 | } |
89 | |
90 | private: |
91 | DebugMacros(const DebugMacros &) = delete; |
92 | const DebugMacros &operator=(const DebugMacros &) = delete; |
93 | |
94 | std::vector<DebugMacroEntry> m_macro_entries; |
95 | }; |
96 | |
97 | } // namespace lldb_private |
98 | |
99 | #endif // LLDB_SYMBOL_DEBUGMACROS_H |
100 | |