aboutsummaryrefslogtreecommitdiff
path: root/include/lldb/Symbol/DebugMacros.h
blob: 24bf03a8c3b1a0ae20c7336da97a48c542facdfa (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//===-- DebugMacros.h -------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_DebugMacros_h_
#define liblldb_DebugMacros_h_

// C Includes
// C++ Includes
#include <memory>
#include <vector>

// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Core/ConstString.h"

namespace lldb_private {

class CompileUnit;
class DebugMacros;
typedef std::shared_ptr<DebugMacros> DebugMacrosSP;

class DebugMacroEntry
{
public:
    enum EntryType
    {
        INVALID,
        DEFINE,
        UNDEF,
        START_FILE,
        END_FILE,
        INDIRECT
    };

public:
    static DebugMacroEntry
    CreateDefineEntry(uint32_t line, const char *str);

    static DebugMacroEntry
    CreateUndefEntry(uint32_t line, const char *str);

    static DebugMacroEntry
    CreateStartFileEntry(uint32_t line, uint32_t debug_line_file_idx);

    static DebugMacroEntry
    CreateEndFileEntry();

    static DebugMacroEntry
    CreateIndirectEntry(const DebugMacrosSP &debug_macros_sp);

    DebugMacroEntry() : m_type(INVALID) { }

    ~DebugMacroEntry() = default;

    EntryType
    GetType() const
    {
        return m_type;
    }

    uint64_t
    GetLineNumber() const
    {
        return m_line;
    }

    ConstString
    GetMacroString() const
    {
        return m_str;
    }

    const FileSpec& GetFileSpec(CompileUnit *comp_unit) const;

    DebugMacros *
    GetIndirectDebugMacros() const
    {
        return m_debug_macros_sp.get();
    }

private:
    DebugMacroEntry(EntryType type,
                    uint32_t line,
                    uint32_t debug_line_file_idx,
                    const char *str);

    DebugMacroEntry(EntryType type,
                    const DebugMacrosSP &debug_macros_sp);

    EntryType m_type:3;
    uint32_t m_line:29;
    uint32_t m_debug_line_file_idx;
    ConstString m_str;
    DebugMacrosSP m_debug_macros_sp;
};

class DebugMacros
{
public:
    DebugMacros() = default;

    ~DebugMacros() = default;

    void
    AddMacroEntry(const DebugMacroEntry &entry)
    {
        m_macro_entries.push_back(entry);
    }

    size_t
    GetNumMacroEntries() const
    {
        return m_macro_entries.size();
    }

    DebugMacroEntry
    GetMacroEntryAtIndex(const size_t index) const
    {
        if (index < m_macro_entries.size())
            return m_macro_entries[index];
        else
            return DebugMacroEntry();
    }

private:
    DISALLOW_COPY_AND_ASSIGN(DebugMacros);

    std::vector<DebugMacroEntry> m_macro_entries;
};

} // namespace lldb_private

#endif // liblldb_DebugMacros_h_