ClangPersistentVariables.cpp revision 309124
1//===-- ClangPersistentVariables.cpp ----------------------------*- 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#include "ClangPersistentVariables.h"
11
12#include "lldb/Core/DataExtractor.h"
13#include "lldb/Core/Log.h"
14#include "lldb/Core/StreamString.h"
15#include "lldb/Core/Value.h"
16
17#include "clang/AST/Decl.h"
18
19#include "llvm/ADT/StringMap.h"
20
21using namespace lldb;
22using namespace lldb_private;
23
24ClangPersistentVariables::ClangPersistentVariables () :
25    lldb_private::PersistentExpressionState(LLVMCastKind::eKindClang),
26    m_next_persistent_variable_id (0)
27{
28}
29
30ExpressionVariableSP
31ClangPersistentVariables::CreatePersistentVariable (const lldb::ValueObjectSP &valobj_sp)
32{
33    return AddNewlyConstructedVariable(new ClangExpressionVariable(valobj_sp));
34}
35
36ExpressionVariableSP
37ClangPersistentVariables::CreatePersistentVariable (ExecutionContextScope *exe_scope,
38                                                    const ConstString &name,
39                                                    const CompilerType& compiler_type,
40                                                    lldb::ByteOrder byte_order,
41                                                    uint32_t addr_byte_size)
42{
43    return AddNewlyConstructedVariable(new ClangExpressionVariable(exe_scope, name, compiler_type, byte_order, addr_byte_size));
44}
45
46void
47ClangPersistentVariables::RemovePersistentVariable (lldb::ExpressionVariableSP variable)
48{
49    RemoveVariable(variable);
50
51    const char *name = variable->GetName().AsCString();
52
53    if (*name != '$')
54        return;
55    name++;
56
57    if (strtoul(name, NULL, 0) == m_next_persistent_variable_id - 1)
58        m_next_persistent_variable_id--;
59}
60
61ConstString
62ClangPersistentVariables::GetNextPersistentVariableName ()
63{
64    char name_cstr[256];
65    ::snprintf (name_cstr, sizeof(name_cstr), "$%u", m_next_persistent_variable_id++);
66    ConstString name(name_cstr);
67    return name;
68}
69
70void
71ClangPersistentVariables::RegisterPersistentDecl (const ConstString &name,
72                                                  clang::NamedDecl *decl)
73{
74    m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(name.GetCString(), decl));
75
76    if (clang::EnumDecl *enum_decl = llvm::dyn_cast<clang::EnumDecl>(decl))
77    {
78        for (clang::EnumConstantDecl *enumerator_decl : enum_decl->enumerators())
79        {
80            m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(ConstString(enumerator_decl->getNameAsString()).GetCString(), enumerator_decl));
81        }
82    }
83}
84
85clang::NamedDecl *
86ClangPersistentVariables::GetPersistentDecl (const ConstString &name)
87{
88    PersistentDeclMap::const_iterator i = m_persistent_decls.find(name.GetCString());
89
90    if (i == m_persistent_decls.end())
91        return NULL;
92    else
93        return i->second;
94}
95