ClangPersistentVariables.h revision 360660
1//===-- ClangPersistentVariables.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_ClangPersistentVariables_h_
10#define liblldb_ClangPersistentVariables_h_
11
12#include "llvm/ADT/DenseMap.h"
13
14#include "ClangExpressionVariable.h"
15#include "ClangModulesDeclVendor.h"
16
17#include "lldb/Expression/ExpressionVariable.h"
18
19namespace lldb_private {
20
21/// \class ClangPersistentVariables ClangPersistentVariables.h
22/// "lldb/Expression/ClangPersistentVariables.h" Manages persistent values
23/// that need to be preserved between expression invocations.
24///
25/// A list of variables that can be accessed and updated by any expression.  See
26/// ClangPersistentVariable for more discussion.  Also provides an increasing,
27/// 0-based counter for naming result variables.
28class ClangPersistentVariables : public PersistentExpressionState {
29public:
30  ClangPersistentVariables();
31
32  ~ClangPersistentVariables() override = default;
33
34  // llvm casting support
35  static bool classof(const PersistentExpressionState *pv) {
36    return pv->getKind() == PersistentExpressionState::eKindClang;
37  }
38
39  lldb::ExpressionVariableSP
40  CreatePersistentVariable(const lldb::ValueObjectSP &valobj_sp) override;
41
42  lldb::ExpressionVariableSP CreatePersistentVariable(
43      ExecutionContextScope *exe_scope, ConstString name,
44      const CompilerType &compiler_type, lldb::ByteOrder byte_order,
45      uint32_t addr_byte_size) override;
46
47  void RemovePersistentVariable(lldb::ExpressionVariableSP variable) override;
48  llvm::StringRef
49  GetPersistentVariablePrefix(bool is_error) const override {
50    return "$";
51  }
52
53  llvm::Optional<CompilerType>
54  GetCompilerTypeFromPersistentDecl(ConstString type_name) override;
55
56  void RegisterPersistentDecl(ConstString name, clang::NamedDecl *decl);
57
58  clang::NamedDecl *GetPersistentDecl(ConstString name);
59
60  void AddHandLoadedClangModule(ClangModulesDeclVendor::ModuleID module) {
61    m_hand_loaded_clang_modules.push_back(module);
62  }
63
64  const ClangModulesDeclVendor::ModuleVector &GetHandLoadedClangModules() {
65    return m_hand_loaded_clang_modules;
66  }
67
68private:
69  uint32_t m_next_persistent_variable_id; ///< The counter used by
70                                          ///GetNextResultName().
71
72  typedef llvm::DenseMap<const char *, clang::NamedDecl *> PersistentDeclMap;
73  PersistentDeclMap
74      m_persistent_decls; ///< Persistent entities declared by the user.
75
76  ClangModulesDeclVendor::ModuleVector
77      m_hand_loaded_clang_modules; ///< These are Clang modules we hand-loaded;
78                                   ///these are the highest-
79                                   ///< priority source for macros.
80};
81
82} // namespace lldb_private
83
84#endif // liblldb_ClangPersistentVariables_h_
85