Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 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 | |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 9 | #ifndef LLDB_EXPRESSION_EXPRESSION_H |
| 10 | #define LLDB_EXPRESSION_EXPRESSION_H |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 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: |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 35 | enum ResultType { eResultTypeAny, eResultTypeId }; |
| 36 | |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 37 | Expression(Target &target); |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 38 | |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 39 | Expression(ExecutionContextScope &exe_scope); |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 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. |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 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. |
| 60 | virtual Materializer *GetMaterializer() { return nullptr; } |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 61 | |
| 62 | /// Return the desired result type of the function, or eResultTypeAny if |
| 63 | /// indifferent. |
| 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 | |
| 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 |
| 78 | lldb::addr_t StartAddress() { return m_jit_start_addr; } |
| 79 | |
| 80 | /// Called to notify the expression that it is about to be executed. |
| 81 | virtual void WillStartExecuting() {} |
| 82 | |
| 83 | /// Called to notify the expression that its execution has finished. |
| 84 | virtual void DidFinishExecuting() {} |
| 85 | |
| 86 | virtual ExpressionTypeSystemHelper *GetTypeSystemHelper() { return nullptr; } |
| 87 | |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 88 | // LLVM RTTI support |
| 89 | virtual bool isA(const void *ClassID) const = 0; |
| 90 | |
Andrew Walbran | 3d2c197 | 2020-04-07 12:24:26 +0100 | [diff] [blame] | 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 | |
Olivier Deprez | f4ef2d0 | 2021-04-20 13:36:24 +0200 | [diff] [blame] | 106 | #endif // LLDB_EXPRESSION_EXPRESSION_H |