llvm-project/lldb/source/Plugins/ExpressionParser/Clang/ClangPersistentVariables.h
Sean Callanan b3a36df39e Handle any persistent Decl in the Clang expression parser, not just types.
Persistent decls have traditionally only been types.  However, we want to
be able to persist more things, like functions and global variables.  This
changes some of the nomenclature and the lookup rules to make this possible.

<rdar://problem/22864976>

llvm-svn: 263864
2016-03-19 00:51:43 +00:00

107 lines
4.0 KiB
C++

//===-- ClangPersistentVariables.h ------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_ClangPersistentVariables_h_
#define liblldb_ClangPersistentVariables_h_
// C Includes
// C++ Includes
// Other libraries and framework includes
#include "llvm/ADT/DenseMap.h"
// Project includes
#include "ClangExpressionVariable.h"
#include "ClangModulesDeclVendor.h"
#include "lldb/Expression/ExpressionVariable.h"
namespace lldb_private
{
//----------------------------------------------------------------------
/// @class ClangPersistentVariables ClangPersistentVariables.h "lldb/Expression/ClangPersistentVariables.h"
/// @brief Manages persistent values that need to be preserved between expression invocations.
///
/// A list of variables that can be accessed and updated by any expression. See
/// ClangPersistentVariable for more discussion. Also provides an increasing,
/// 0-based counter for naming result variables.
//----------------------------------------------------------------------
class ClangPersistentVariables : public PersistentExpressionState
{
public:
ClangPersistentVariables();
~ClangPersistentVariables() override = default;
//------------------------------------------------------------------
// llvm casting support
//------------------------------------------------------------------
static bool classof(const PersistentExpressionState *pv)
{
return pv->getKind() == PersistentExpressionState::eKindClang;
}
lldb::ExpressionVariableSP
CreatePersistentVariable (const lldb::ValueObjectSP &valobj_sp) override;
lldb::ExpressionVariableSP
CreatePersistentVariable (ExecutionContextScope *exe_scope,
const ConstString &name,
const CompilerType& compiler_type,
lldb::ByteOrder byte_order,
uint32_t addr_byte_size) override;
//----------------------------------------------------------------------
/// Return the next entry in the sequence of strings "$0", "$1", ... for
/// use naming persistent expression convenience variables.
///
/// @return
/// A string that contains the next persistent variable name.
//----------------------------------------------------------------------
ConstString
GetNextPersistentVariableName () override;
void
RemovePersistentVariable (lldb::ExpressionVariableSP variable) override;
lldb::addr_t
LookupSymbol (const ConstString &name) override { return LLDB_INVALID_ADDRESS; }
void
RegisterPersistentDecl (const ConstString &name,
clang::NamedDecl *decl);
clang::NamedDecl *
GetPersistentDecl (const ConstString &name);
void
AddHandLoadedClangModule(ClangModulesDeclVendor::ModuleID module)
{
m_hand_loaded_clang_modules.push_back(module);
}
const ClangModulesDeclVendor::ModuleVector &GetHandLoadedClangModules()
{
return m_hand_loaded_clang_modules;
}
private:
uint32_t m_next_persistent_variable_id; ///< The counter used by GetNextResultName().
typedef llvm::DenseMap<const char *, clang::NamedDecl *> PersistentDeclMap;
PersistentDeclMap m_persistent_decls; ///< Persistent entities declared by the user.
ClangModulesDeclVendor::ModuleVector m_hand_loaded_clang_modules; ///< These are Clang modules we hand-loaded; these are the highest-
///< priority source for macros.
};
} // namespace lldb_private
#endif // liblldb_ClangPersistentVariables_h_