aboutsummaryrefslogtreecommitdiff
path: root/source/Plugins/LanguageRuntime/CPlusPlus/ItaniumABI/ItaniumABILanguageRuntime.h
blob: 86bd728d6c6f9b3d59da3861a43962e08c9653a8 (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
//===-- ItaniumABILanguageRuntime.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_ItaniumABILanguageRuntime_h_
#define liblldb_ItaniumABILanguageRuntime_h_

// C Includes
// C++ Includes
#include <map>
#include <mutex>
#include <vector>

// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Breakpoint/BreakpointResolver.h"
#include "lldb/Symbol/Type.h"
#include "lldb/Target/LanguageRuntime.h"
#include "lldb/Target/CPPLanguageRuntime.h"
#include "lldb/Core/Value.h"

namespace lldb_private {
    
    class ItaniumABILanguageRuntime :
    public lldb_private::CPPLanguageRuntime
    {
    public:
        ~ItaniumABILanguageRuntime() override = default;
        
        //------------------------------------------------------------------
        // Static Functions
        //------------------------------------------------------------------
        static void
        Initialize();
        
        static void
        Terminate();
        
        static lldb_private::LanguageRuntime *
        CreateInstance (Process *process, lldb::LanguageType language);
        
        static lldb_private::ConstString
        GetPluginNameStatic();

        bool
        IsVTableName(const char *name) override;
        
        bool
        GetDynamicTypeAndAddress(ValueObject &in_value,
                                 lldb::DynamicValueType use_dynamic,
                                 TypeAndOrName &class_type_or_name,
                                 Address &address,
                                 Value::ValueType &value_type) override;
        
        TypeAndOrName
        FixUpDynamicType(const TypeAndOrName& type_and_or_name,
                         ValueObject& static_value) override;
        
        bool
        CouldHaveDynamicValue(ValueObject &in_value) override;
        
        void
        SetExceptionBreakpoints() override;
        
        void
        ClearExceptionBreakpoints() override;
        
        bool
        ExceptionBreakpointsAreSet() override;
        
        bool
        ExceptionBreakpointsExplainStop(lldb::StopInfoSP stop_reason) override;

        lldb::BreakpointResolverSP
        CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp) override;
        
        lldb::SearchFilterSP
        CreateExceptionSearchFilter() override;

        //------------------------------------------------------------------
        // PluginInterface protocol
        //------------------------------------------------------------------
        lldb_private::ConstString
        GetPluginName() override;
        
        uint32_t
        GetPluginVersion() override;

    protected:
        lldb::BreakpointResolverSP
        CreateExceptionResolver (Breakpoint *bkpt, bool catch_bp, bool throw_bp, bool for_expressions);

        lldb::BreakpointSP
        CreateExceptionBreakpoint(bool catch_bp,
                                  bool throw_bp,
                                  bool for_expressions,
                                  bool is_internal);
        
    private:
        typedef std::map<lldb_private::Address, TypeAndOrName> DynamicTypeCache;

        ItaniumABILanguageRuntime(Process *process)
            : // Call CreateInstance instead.
              lldb_private::CPPLanguageRuntime(process),
              m_cxx_exception_bp_sp(),
              m_dynamic_type_map(),
              m_dynamic_type_map_mutex()
        {
        }

        lldb::BreakpointSP m_cxx_exception_bp_sp;
        DynamicTypeCache m_dynamic_type_map;
        std::mutex m_dynamic_type_map_mutex;

        TypeAndOrName
        GetTypeInfoFromVTableAddress(ValueObject &in_value, lldb::addr_t original_ptr, lldb::addr_t vtable_addr);

        TypeAndOrName
        GetDynamicTypeInfo(const lldb_private::Address &vtable_addr);

        void
        SetDynamicTypeInfo(const lldb_private::Address &vtable_addr, const TypeAndOrName &type_info);
    };
    
} // namespace lldb_private

#endif // liblldb_ItaniumABILanguageRuntime_h_