]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/ExpressionParser/Go/GoUserExpression.h
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / ExpressionParser / Go / GoUserExpression.h
1 //===-- GoUserExpression.h --------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_GoUserExpression_h_
11 #define liblldb_GoUserExpression_h_
12
13 // C Includes
14 // C++ Includes
15 #include <memory>
16
17 // Other libraries and framework includes
18 // Project includes
19 #include "lldb/Expression/ExpressionVariable.h"
20 #include "lldb/Expression/UserExpression.h"
21 #include "lldb/Target/ExecutionContext.h"
22 #include "lldb/lldb-forward.h"
23 #include "lldb/lldb-private.h"
24
25 namespace lldb_private {
26 class GoParser;
27
28 class GoPersistentExpressionState : public PersistentExpressionState {
29 public:
30   GoPersistentExpressionState();
31
32   llvm::StringRef
33   GetPersistentVariablePrefix(bool is_error) const override {
34     return "$go";
35   }
36   void RemovePersistentVariable(lldb::ExpressionVariableSP variable) override;
37
38   lldb::addr_t LookupSymbol(const ConstString &name) override {
39     return LLDB_INVALID_ADDRESS;
40   }
41
42   static bool classof(const PersistentExpressionState *pv) {
43     return pv->getKind() == PersistentExpressionState::eKindGo;
44   }
45
46 private:
47   uint32_t m_next_persistent_variable_id; ///< The counter used by
48                                           ///GetNextResultName().
49 };
50
51 //----------------------------------------------------------------------
52 /// @class GoUserExpression GoUserExpression.h
53 /// "lldb/Expression/GoUserExpression.h" Encapsulates a single expression for
54 /// use with Go
55 ///
56 /// LLDB uses expressions for various purposes, notably to call functions
57 /// and as a backend for the expr command.  GoUserExpression encapsulates the
58 /// objects needed to parse and interpret an expression.
59 //----------------------------------------------------------------------
60 class GoUserExpression : public UserExpression {
61 public:
62   GoUserExpression(ExecutionContextScope &exe_scope, llvm::StringRef expr,
63                    llvm::StringRef prefix, lldb::LanguageType language,
64                    ResultType desired_type,
65                    const EvaluateExpressionOptions &options);
66
67   bool Parse(DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
68              lldb_private::ExecutionPolicy execution_policy,
69              bool keep_result_in_memory, bool generate_debug_info) override;
70
71   bool CanInterpret() override { return true; }
72   bool FinalizeJITExecution(
73       DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
74       lldb::ExpressionVariableSP &result,
75       lldb::addr_t function_stack_bottom = LLDB_INVALID_ADDRESS,
76       lldb::addr_t function_stack_top = LLDB_INVALID_ADDRESS) override {
77     return true;
78   }
79
80 protected:
81   lldb::ExpressionResults
82   DoExecute(DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx,
83             const EvaluateExpressionOptions &options,
84             lldb::UserExpressionSP &shared_ptr_to_me,
85             lldb::ExpressionVariableSP &result) override;
86
87 private:
88   class GoInterpreter;
89   std::unique_ptr<GoInterpreter> m_interpreter;
90 };
91
92 } // namespace lldb_private
93
94 #endif // liblldb_GoUserExpression_h_