aboutsummaryrefslogtreecommitdiff
path: root/include/lldb/Target/LanguageRuntime.h
blob: beb7a9e74876b80ee1f9f52410858fa1d4a69707 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
//===-- LanguageRuntime.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_LanguageRuntime_h_
#define liblldb_LanguageRuntime_h_

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-public.h"
#include "lldb/Breakpoint/BreakpointResolver.h"
#include "lldb/Breakpoint/BreakpointResolverName.h"
#include "lldb/Core/PluginInterface.h"
#include "lldb/lldb-private.h"
#include "lldb/Core/ValueObject.h"
#include "lldb/Core/Value.h"
#include "lldb/Target/ExecutionContextScope.h"
#include "lldb/Expression/LLVMUserExpression.h"

#include "clang/Basic/TargetOptions.h"

namespace lldb_private {

class LanguageRuntime :
    public PluginInterface
{
public:

    ~LanguageRuntime() override;
    
    static LanguageRuntime* 
    FindPlugin (Process *process, lldb::LanguageType language);

    static void
    InitializeCommands (CommandObject* parent);
    
    virtual lldb::LanguageType
    GetLanguageType () const = 0;
    
    virtual bool
    GetObjectDescription (Stream &str, ValueObject &object) = 0;
    
    virtual bool
    GetObjectDescription (Stream &str, Value &value, ExecutionContextScope *exe_scope) = 0;
    
    // this call should return true if it could set the name and/or the type
    virtual bool
    GetDynamicTypeAndAddress (ValueObject &in_value, 
                              lldb::DynamicValueType use_dynamic, 
                              TypeAndOrName &class_type_or_name, 
                              Address &address,
                              Value::ValueType &value_type) = 0;
    
    // This call should return a CompilerType given a generic type name
    // and an ExecutionContextScope in which one can actually fetch
    // any specialization information required.
    virtual CompilerType
    GetConcreteType (ExecutionContextScope *exe_scope,
                     ConstString abstract_type_name)
    {
        return CompilerType();
    }
    
    // This should be a fast test to determine whether it is likely that this value would
    // have a dynamic type.
    virtual bool
    CouldHaveDynamicValue (ValueObject &in_value) = 0;
    
    // The contract for GetDynamicTypeAndAddress() is to return a "bare-bones" dynamic type
    // For instance, given a Base* pointer, GetDynamicTypeAndAddress() will return the type of
    // Derived, not Derived*. The job of this API is to correct this misalignment between the
    // static type and the discovered dynamic type
    virtual TypeAndOrName
    FixUpDynamicType (const TypeAndOrName& type_and_or_name,
                      ValueObject& static_value) = 0;

    virtual void
    SetExceptionBreakpoints ()
    {
    }
    
    virtual void
    ClearExceptionBreakpoints ()
    {
    }
    
    virtual bool
    ExceptionBreakpointsAreSet ()
    {
        return false;
    }
    
    virtual bool
    ExceptionBreakpointsExplainStop (lldb::StopInfoSP stop_reason)
    {
        return false;
    }
    
    static lldb::BreakpointSP
    CreateExceptionBreakpoint (Target &target,
                               lldb::LanguageType language,
                               bool catch_bp, 
                               bool throw_bp, 
                               bool is_internal = false);

    static Breakpoint::BreakpointPreconditionSP
    CreateExceptionPrecondition (lldb::LanguageType language,
                                 bool catch_bp,
                                 bool throw_bp);
    Process *
    GetProcess()
    {
        return m_process;
    }
    
    Target&
    GetTargetRef()
    {
        return m_process->GetTarget();
    }

    virtual lldb::BreakpointResolverSP
    CreateExceptionResolver (Breakpoint *bkpt, bool catch_bp, bool throw_bp) = 0;
    
    virtual lldb::SearchFilterSP
    CreateExceptionSearchFilter ();
    
    virtual bool
    GetTypeBitSize (const CompilerType& compiler_type,
                    uint64_t &size)
    {
        return false;
    }
    
    virtual bool
    IsRuntimeSupportValue (ValueObject& valobj)
    {
        return false;
    }

    virtual void
    ModulesDidLoad (const ModuleList &module_list)
    {
    }

    // Called by the Clang expression evaluation engine to allow runtimes to alter the set of target options provided to
    // the compiler.
    // If the options prototype is modified, runtimes must return true, false otherwise.
    virtual bool
    GetOverrideExprOptions(clang::TargetOptions &prototype)
    {
        return false;
    }

    // Called by ClangExpressionParser::PrepareForExecution to query for any custom LLVM IR passes
    // that need to be run before an expression is assembled and run.
    virtual bool
    GetIRPasses(LLVMUserExpression::IRPasses &custom_passes)
    {
        return false;
    }
protected:
    //------------------------------------------------------------------
    // Classes that inherit from LanguageRuntime can see and modify these
    //------------------------------------------------------------------
    
    LanguageRuntime(Process *process);
    Process *m_process;
private:

    DISALLOW_COPY_AND_ASSIGN (LanguageRuntime);
};

} // namespace lldb_private

#endif // liblldb_LanguageRuntime_h_