1 //===-- Expression.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_EXPRESSION_EXPRESSION_H
10 #define LLDB_EXPRESSION_EXPRESSION_H
11 
12 #include <map>
13 #include <string>
14 #include <vector>
15 
16 
17 #include "lldb/Expression/ExpressionTypeSystemHelper.h"
18 #include "lldb/lldb-forward.h"
19 #include "lldb/lldb-private.h"
20 
21 namespace lldb_private {
22 
23 class RecordingMemoryManager;
24 
25 /// \class Expression Expression.h "lldb/Expression/Expression.h" Encapsulates
26 /// a single expression for use in lldb
27 ///
28 /// LLDB uses expressions for various purposes, notably to call functions
29 /// and as a backend for the expr command.  Expression encapsulates the
30 /// objects needed to parse and interpret or JIT an expression.  It uses the
31 /// expression parser appropriate to the language of the expression to produce
32 /// LLVM IR from the expression.
33 class Expression {
34 public:
35   enum ResultType { eResultTypeAny, eResultTypeId };
36 
37   Expression(Target &target);
38 
39   Expression(ExecutionContextScope &exe_scope);
40 
41   /// Destructor
42   virtual ~Expression() = default;
43 
44   /// Return the string that the parser should parse.  Must be a full
45   /// translation unit.
46   virtual const char *Text() = 0;
47 
48   /// Return the function name that should be used for executing the
49   /// expression.  Text() should contain the definition of this function.
50   virtual const char *FunctionName() = 0;
51 
52   /// Return the language that should be used when parsing.  To use the
53   /// default, return eLanguageTypeUnknown.
Language()54   virtual lldb::LanguageType Language() const {
55     return lldb::eLanguageTypeUnknown;
56   }
57 
58   /// Return the Materializer that the parser should use when registering
59   /// external values.
GetMaterializer()60   virtual Materializer *GetMaterializer() { return nullptr; }
61 
62   /// Return the desired result type of the function, or eResultTypeAny if
63   /// indifferent.
DesiredResultType()64   virtual ResultType DesiredResultType() { return eResultTypeAny; }
65 
66   /// Flags
67 
68   /// Return true if validation code should be inserted into the expression.
69   virtual bool NeedsValidation() = 0;
70 
71   /// Return true if external variables in the expression should be resolved.
72   virtual bool NeedsVariableResolution() = 0;
73 
GetOptions()74   virtual EvaluateExpressionOptions *GetOptions() { return nullptr; };
75 
76   /// Return the address of the function's JIT-compiled code, or
77   /// LLDB_INVALID_ADDRESS if the function is not JIT compiled
StartAddress()78   lldb::addr_t StartAddress() { return m_jit_start_addr; }
79 
80   /// Called to notify the expression that it is about to be executed.
WillStartExecuting()81   virtual void WillStartExecuting() {}
82 
83   /// Called to notify the expression that its execution has finished.
DidFinishExecuting()84   virtual void DidFinishExecuting() {}
85 
GetTypeSystemHelper()86   virtual ExpressionTypeSystemHelper *GetTypeSystemHelper() { return nullptr; }
87 
88   // LLVM RTTI support
89   virtual bool isA(const void *ClassID) const = 0;
90 
91 protected:
92   lldb::TargetWP m_target_wp; /// Expression's always have to have a target...
93   lldb::ProcessWP m_jit_process_wp; /// An expression might have a process, but
94                                     /// it doesn't need to (e.g. calculator
95                                     /// mode.)
96   lldb::addr_t m_jit_start_addr; ///< The address of the JITted function within
97                                  ///the JIT allocation.  LLDB_INVALID_ADDRESS if
98                                  ///invalid.
99   lldb::addr_t m_jit_end_addr;   ///< The address of the JITted function within
100                                  ///the JIT allocation.  LLDB_INVALID_ADDRESS if
101                                  ///invalid.
102 };
103 
104 } // namespace lldb_private
105 
106 #endif // LLDB_EXPRESSION_EXPRESSION_H
107