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
95 lines
3.0 KiB
C++
95 lines
3.0 KiB
C++
//===-- ClangPersistentVariables.cpp ----------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "ClangPersistentVariables.h"
|
|
|
|
#include "lldb/Core/DataExtractor.h"
|
|
#include "lldb/Core/Log.h"
|
|
#include "lldb/Core/StreamString.h"
|
|
#include "lldb/Core/Value.h"
|
|
|
|
#include "clang/AST/Decl.h"
|
|
|
|
#include "llvm/ADT/StringMap.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
ClangPersistentVariables::ClangPersistentVariables () :
|
|
lldb_private::PersistentExpressionState(LLVMCastKind::eKindClang),
|
|
m_next_persistent_variable_id (0)
|
|
{
|
|
}
|
|
|
|
ExpressionVariableSP
|
|
ClangPersistentVariables::CreatePersistentVariable (const lldb::ValueObjectSP &valobj_sp)
|
|
{
|
|
return AddNewlyConstructedVariable(new ClangExpressionVariable(valobj_sp));
|
|
}
|
|
|
|
ExpressionVariableSP
|
|
ClangPersistentVariables::CreatePersistentVariable (ExecutionContextScope *exe_scope,
|
|
const ConstString &name,
|
|
const CompilerType& compiler_type,
|
|
lldb::ByteOrder byte_order,
|
|
uint32_t addr_byte_size)
|
|
{
|
|
return AddNewlyConstructedVariable(new ClangExpressionVariable(exe_scope, name, compiler_type, byte_order, addr_byte_size));
|
|
}
|
|
|
|
void
|
|
ClangPersistentVariables::RemovePersistentVariable (lldb::ExpressionVariableSP variable)
|
|
{
|
|
RemoveVariable(variable);
|
|
|
|
const char *name = variable->GetName().AsCString();
|
|
|
|
if (*name != '$')
|
|
return;
|
|
name++;
|
|
|
|
if (strtoul(name, NULL, 0) == m_next_persistent_variable_id - 1)
|
|
m_next_persistent_variable_id--;
|
|
}
|
|
|
|
ConstString
|
|
ClangPersistentVariables::GetNextPersistentVariableName ()
|
|
{
|
|
char name_cstr[256];
|
|
::snprintf (name_cstr, sizeof(name_cstr), "$%u", m_next_persistent_variable_id++);
|
|
ConstString name(name_cstr);
|
|
return name;
|
|
}
|
|
|
|
void
|
|
ClangPersistentVariables::RegisterPersistentDecl (const ConstString &name,
|
|
clang::NamedDecl *decl)
|
|
{
|
|
m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(name.GetCString(), decl));
|
|
|
|
if (clang::EnumDecl *enum_decl = llvm::dyn_cast<clang::EnumDecl>(decl))
|
|
{
|
|
for (clang::EnumConstantDecl *enumerator_decl : enum_decl->enumerators())
|
|
{
|
|
m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(ConstString(enumerator_decl->getNameAsString()).GetCString(), enumerator_decl));
|
|
}
|
|
}
|
|
}
|
|
|
|
clang::NamedDecl *
|
|
ClangPersistentVariables::GetPersistentDecl (const ConstString &name)
|
|
{
|
|
PersistentDeclMap::const_iterator i = m_persistent_decls.find(name.GetCString());
|
|
|
|
if (i == m_persistent_decls.end())
|
|
return NULL;
|
|
else
|
|
return i->second;
|
|
}
|