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 Expression Expression.h "lldb/Expression/Expression.h" Encapsulates
24 /// a single expression for use in lldb
25 ///
26 /// LLDB uses expressions for various purposes, notably to call functions
27 /// and as a backend for the expr command.  Expression encapsulates the
28 /// objects needed to parse and interpret or JIT an expression.  It uses the
29 /// expression parser appropriate to the language of the expression to produce
30 /// LLVM IR from the expression.
31 class Expression {
32 public:
33   enum ResultType { eResultTypeAny, eResultTypeId };
34 
35   Expression(Target &target);
36 
37   Expression(ExecutionContextScope &exe_scope);
38 
39   /// Destructor
40   virtual ~Expression() = default;
41 
42   /// Return the string that the parser should parse.  Must be a full
43   /// translation unit.
44   virtual const char *Text() = 0;
45 
46   /// Return the function name that should be used for executing the
47   /// expression.  Text() should contain the definition of this function.
48   virtual const char *FunctionName() = 0;
49 
50   /// Return the language that should be used when parsing.  To use the
51   /// default, return eLanguageTypeUnknown.
52   virtual lldb::LanguageType Language() const {
53     return lldb::eLanguageTypeUnknown;
54   }
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 // LLDB_EXPRESSION_EXPRESSION_H
105