1 //===-- ClangExpression.h ---------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef liblldb_ClangExpression_h_
11 #define liblldb_ClangExpression_h_
12 
13 // C Includes
14 // C++ Includes
15 #include <string>
16 #include <map>
17 #include <vector>
18 
19 // Other libraries and framework includes
20 // Project includes
21 
22 #include "lldb/lldb-forward.h"
23 #include "lldb/lldb-private.h"
24 #include "lldb/Core/ClangForward.h"
25 #include "lldb/Target/Process.h"
26 
27 namespace lldb_private {
28 
29 class RecordingMemoryManager;
30 
31 //----------------------------------------------------------------------
32 /// @class ClangExpression ClangExpression.h "lldb/Expression/ClangExpression.h"
33 /// @brief Encapsulates a single expression for use with Clang
34 ///
35 /// LLDB uses expressions for various purposes, notably to call functions
36 /// and as a backend for the expr command.  ClangExpression encapsulates
37 /// the objects needed to parse and interpret or JIT an expression.  It
38 /// uses the Clang parser to produce LLVM IR from the expression.
39 //----------------------------------------------------------------------
40 class ClangExpression
41 {
42 public:
43     enum ResultType {
44         eResultTypeAny,
45         eResultTypeId
46     };
47 
ClangExpression()48     ClangExpression () :
49         m_jit_process_wp(),
50         m_jit_start_addr (LLDB_INVALID_ADDRESS),
51         m_jit_end_addr (LLDB_INVALID_ADDRESS)
52     {
53     }
54 
55     //------------------------------------------------------------------
56     /// Destructor
57     //------------------------------------------------------------------
~ClangExpression()58     virtual ~ClangExpression ()
59     {
60     }
61 
62     //------------------------------------------------------------------
63     /// Return the string that the parser should parse.  Must be a full
64     /// translation unit.
65     //------------------------------------------------------------------
66     virtual const char *
67     Text () = 0;
68 
69     //------------------------------------------------------------------
70     /// Return the function name that should be used for executing the
71     /// expression.  Text() should contain the definition of this
72     /// function.
73     //------------------------------------------------------------------
74     virtual const char *
75     FunctionName () = 0;
76 
77     //------------------------------------------------------------------
78     /// Return the language that should be used when parsing.  To use
79     /// the default, return eLanguageTypeUnknown.
80     //------------------------------------------------------------------
81     virtual lldb::LanguageType
Language()82     Language ()
83     {
84         return lldb::eLanguageTypeUnknown;
85     }
86 
87     //------------------------------------------------------------------
88     /// Return the object that the parser should use when resolving external
89     /// values.  May be NULL if everything should be self-contained.
90     //------------------------------------------------------------------
91     virtual ClangExpressionDeclMap *
92     DeclMap () = 0;
93 
94     //------------------------------------------------------------------
95     /// Return the object that the parser should allow to access ASTs.
96     /// May be NULL if the ASTs do not need to be transformed.
97     ///
98     /// @param[in] passthrough
99     ///     The ASTConsumer that the returned transformer should send
100     ///     the ASTs to after transformation.
101     //------------------------------------------------------------------
102     virtual clang::ASTConsumer *
103     ASTTransformer (clang::ASTConsumer *passthrough) = 0;
104 
105     //------------------------------------------------------------------
106     /// Return the desired result type of the function, or
107     /// eResultTypeAny if indifferent.
108     //------------------------------------------------------------------
109     virtual ResultType
DesiredResultType()110     DesiredResultType ()
111     {
112         return eResultTypeAny;
113     }
114 
115     //------------------------------------------------------------------
116     /// Flags
117     //------------------------------------------------------------------
118 
119     //------------------------------------------------------------------
120     /// Return true if validation code should be inserted into the
121     /// expression.
122     //------------------------------------------------------------------
123     virtual bool
124     NeedsValidation () = 0;
125 
126     //------------------------------------------------------------------
127     /// Return true if external variables in the expression should be
128     /// resolved.
129     //------------------------------------------------------------------
130     virtual bool
131     NeedsVariableResolution () = 0;
132 
133     //------------------------------------------------------------------
134     /// Return the address of the function's JIT-compiled code, or
135     /// LLDB_INVALID_ADDRESS if the function is not JIT compiled
136     //------------------------------------------------------------------
137     lldb::addr_t
StartAddress()138     StartAddress ()
139     {
140         return m_jit_start_addr;
141     }
142 
143 protected:
144 
145     lldb::ProcessWP m_jit_process_wp;
146     lldb::addr_t    m_jit_start_addr;       ///< The address of the JITted function within the JIT allocation.  LLDB_INVALID_ADDRESS if invalid.
147     lldb::addr_t    m_jit_end_addr;         ///< The address of the JITted function within the JIT allocation.  LLDB_INVALID_ADDRESS if invalid.
148 
149 };
150 
151 } // namespace lldb_private
152 
153 #endif  // liblldb_ClangExpression_h_
154