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 liblldb_Expression_h_
10 #define liblldb_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() {}
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.
54   virtual lldb::LanguageType Language() { return lldb::eLanguageTypeUnknown; }
55 
56   /// Return the Materializer that the parser should use when registering
57   /// external values.
58   virtual Materializer *GetMaterializer() { return nullptr; }
59 
60   /// Return the desired result type of the function, or eResultTypeAny if
61   /// indifferent.
62   virtual ResultType DesiredResultType() { return eResultTypeAny; }
63 
64   /// Flags
65 
66   /// Return true if validation code should be inserted into the expression.
67   virtual bool NeedsValidation() = 0;
68 
69   /// Return true if external variables in the expression should be resolved.
70   virtual bool NeedsVariableResolution() = 0;
71 
72   virtual EvaluateExpressionOptions *GetOptions() { return nullptr; };
73 
74   /// Return the address of the function's JIT-compiled code, or
75   /// LLDB_INVALID_ADDRESS if the function is not JIT compiled
76   lldb::addr_t StartAddress() { return m_jit_start_addr; }
77 
78   /// Called to notify the expression that it is about to be executed.
79   virtual void WillStartExecuting() {}
80 
81   /// Called to notify the expression that its execution has finished.
82   virtual void DidFinishExecuting() {}
83 
84   virtual ExpressionTypeSystemHelper *GetTypeSystemHelper() { return nullptr; }
85 
86   // LLVM RTTI support
87   virtual bool isA(const void *ClassID) const = 0;
88 
89 protected:
90   lldb::TargetWP m_target_wp; /// Expression's always have to have a target...
91   lldb::ProcessWP m_jit_process_wp; /// An expression might have a process, but
92                                     /// it doesn't need to (e.g. calculator
93                                     /// mode.)
94   lldb::addr_t m_jit_start_addr; ///< The address of the JITted function within
95                                  ///the JIT allocation.  LLDB_INVALID_ADDRESS if
96                                  ///invalid.
97   lldb::addr_t m_jit_end_addr;   ///< The address of the JITted function within
98                                  ///the JIT allocation.  LLDB_INVALID_ADDRESS if
99                                  ///invalid.
100 };
101 
102 } // namespace lldb_private
103 
104 #endif // liblldb_Expression_h_
105