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