ClangExpressionDeclMap.cpp revision 0eca1a7136ec5a48d8cf97decf157dc04c93512a
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangExpressionDeclMap.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h"
17a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
20810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h"
216184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
23061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h"
2405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h"
256e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
27a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
28cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
40f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
41810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
4217c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
44f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
46a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
483bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) :
538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
55dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_keep_result_in_memory (keep_result_in_memory),
56aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
57dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_struct_vars ()
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
65aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
66aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
67aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
68166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool
69427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
708c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_exe_ctx = &exe_ctx;
73567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
74567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
75567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx.GetFramePtr())
76567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
77567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetThreadPtr())
78567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetProcessPtr())
80987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
81987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
83987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (target)
85987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
86987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
87567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
88987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
8997ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan
90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
91567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
92567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
93166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
94567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!target->GetScratchClangASTContext())
95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            return false;
96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
97166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
9847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    m_parser_vars->m_target_info = GetTargetInfo();
9947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
100166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    return true;
101aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
102c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
104427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
105aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
106aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
107aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
108427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
112427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp &&
114427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars.get() &&
115427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars->m_lldb_value)
116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                delete var_sp->m_parser_vars->m_lldb_value;
117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp->DisableParserVars();
119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
126427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
127427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                pvar_sp->DisableParserVars();
128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1317a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
13647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo
13747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo()
13847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
13947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
14047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo ret;
14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
144567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx)
14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
146567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx->GetProcessPtr();
147567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (process)
148567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
149567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.byte_order = process->GetByteOrder();
150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.address_byte_size = process->GetAddressByteSize();
151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        else
153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Target *target = exe_ctx->GetTargetPtr();
155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (target)
156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            {
157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.byte_order = target->GetArchitecture().GetByteOrder();
158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            }
160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
16147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
16247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
16347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return ret;
16447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1668de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1678de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
16882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
169aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
170aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
171aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
172427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
173427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
174427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
175427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
176427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
177aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
17882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
17982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
18005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
18105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
18205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
18305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
18405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
186166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
188567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
189567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
190567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
191567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
192567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
19305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
19405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
19505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetASTContext(),
19605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetOpaqueQualType()),
19705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
19847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
199fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
2010e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
20247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
2040e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
2050e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2060e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
2070e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2080e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
2090e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
21005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2110e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
2120e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
2130e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
21405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
21505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
21647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
21705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
2180e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
21905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
22005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
22105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
22205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
22305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2242bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen    for (size_t byte_idx = 0;
22505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
22805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
22905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (m_parser_vars->m_target_info.byte_order)
23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
2340e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
2350e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
2360e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
2370e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
2380e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
2400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
2420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
2430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
2440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
2460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
24805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
2496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
251696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
252696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
25505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
25605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
257696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP
258696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
2599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                           VarDecl *decl,
260696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           lldb_private::TypeFromParser type)
261696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{
262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    assert (m_parser_vars.get());
263696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
264696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
267567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
268567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
269567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
270567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
271567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
273567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
274696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
275696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
276696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
277696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return ClangExpressionVariableSP();
282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetASTContext(),
285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetOpaqueQualType()),
286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                           context);
287696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
288696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser var_type = var_sp->GetTypeFromUser();
289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
290567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx->GetFramePtr();
291567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL)
292567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
293567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
294567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var)
297696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
298696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
299567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_valobj)
302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
303696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
304696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_casted_valobj)
307696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
308696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
309696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (log)
310696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    {
311696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        StreamString my_stream_string;
312696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           var_type.GetOpaqueQualType(),
315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           &my_stream_string);
316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
317696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
318696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
319696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    }
320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!pvar_sp)
324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return pvar_sp;
334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan}
335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
33647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
33747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name)
33847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
33947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
34047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
34647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                lldb_private::Value &value,
34747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                const ConstString &name,
348a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                lldb_private::TypeFromParser type,
349a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                bool transient)
35047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
35147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
35247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
35347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
35447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
35547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!pvar_sp)
35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
359a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !pvar_sp->m_live_sp &&
360a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !transient)
36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        // The reference comes from the program.  We need to set up a live SP for it.
36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetASTContext(),
36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetName(),
36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetScalar().ULongLong(),
36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetValueAddressType(),
37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetByteSize());
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->ValueUpdated();
37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const size_t pvar_byte_size = pvar_sp->GetByteSize();
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        uint8_t *pvar_data = pvar_sp->GetValueBytes();
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!ReadTarget(pvar_data, value, pvar_byte_size))
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    valobj = pvar_sp;
38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return true;
38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
3918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
3928de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
3938de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3949b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
3958de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
3966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
3976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
3986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
3998de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
400a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
401aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
402aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
4036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
404fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
405567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
406567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
407567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
408567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
409567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
412a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
413a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
41482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
41582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
41697678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
420a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
421fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
422fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
423427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
4268c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4278c12720c108cd5e7ed792596749218d8400f647eSean Callanan
428427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
4298c12720c108cd5e7ed792596749218d8400f647eSean Callanan
430427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4318c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4328c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
4346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
4356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
4376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
4396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
4416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
4456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
4466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
4506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
451427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
4528c12720c108cd5e7ed792596749218d8400f647eSean Callanan
453427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
454427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
4558c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4568c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
457a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
458a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
459a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
4608de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
4618de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4629b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
4658de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
4668de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
4678de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
469aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
470aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
471aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
472e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
47345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
4758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4768c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
4778c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
4788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
479427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan
481427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
482427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
4838c12720c108cd5e7ed792596749218d8400f647eSean Callanan
484427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4868c12720c108cd5e7ed792596749218d8400f647eSean Callanan
48745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
48845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
48945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
4908de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
491427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
49245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
4938c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
4948c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
495427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
4968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
497427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
498427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
499427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
5008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
501427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
5028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
5088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
509aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
510aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
511aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
5128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
5138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
5158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
516aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
517aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
519427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
5208c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5218c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
5228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
523427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
524427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
525427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
526427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
527427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
5288c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5308c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
5328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
533427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
534427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan
536427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
5388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
5398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
540aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
5418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
542aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
5438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5468de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
5478de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
5498de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
5508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
5518de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
553aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
554aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
555aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
558427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
559aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
560aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5668de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
5678de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5689b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
5698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
5708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
5718de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
5728de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
5738de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
575aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
576aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
577aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
580427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
5818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
583427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
5848c12720c108cd5e7ed792596749218d8400f647eSean Callanan
585427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_jit_vars.get())
5888c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
5898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
593427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
5948c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
59802fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
5998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
6008de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
6028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value**& value,
6038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
6048de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
605ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
606427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
6078c12720c108cd5e7ed792596749218d8400f647eSean Callanan
608427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
6098c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
610ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
6118c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
6128c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
613ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
614427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = &entity_sp->m_parser_vars->m_llvm_value;
615427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
6168c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6178c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
618ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
619ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
620ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
621ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
622ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
623ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
624ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
625ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
626ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
627ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
628ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
6293e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan       sym_ctx.module_sp->FindSymbolsWithNameAndType(name, NULL, eSymbolTypeCode, sc_list);
630ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
631ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (!sc_list.GetSize())
632ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
633ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
634ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
635f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
6368de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
6378de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6388de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
639da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
6408de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
641f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
642aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
643aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
644aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
645567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
646567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
647567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
648567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
649f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
65178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
65278b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
653f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
654f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
655e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
656f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
657ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
658ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
659e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
660aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
661aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
662aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
663aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
664aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        Mangled mangled(name.GetCString(), true);
665aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
666aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        ConstString demangled_name = mangled.GetDemangledName();
667aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
668aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        if (strlen(demangled_name.GetCString()))
669aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
670aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            std::string const_name_scratch(demangled_name.GetCString());
671aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
672aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            const_name_scratch.append(" const");
673aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
674aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            ConstString const_name(const_name_scratch.c_str());
675aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
676ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan            FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
677aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
678aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
679aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan                log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString());
680aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
681aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
682aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
683aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
684f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
685f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
686f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
687e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
688f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
689da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
690f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
691f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
692da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
693f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
694da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
696f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
697f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
698ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
699ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
700ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
701567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (target);
702da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
703f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
704f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
705f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
706cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
707cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
708c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
709c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
710c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
711819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
712c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
713cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
714cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
715cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
716cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
717cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
718cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
719cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
720c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
721cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
722ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
723ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
724ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
725ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
726cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
727cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
728cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
729cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
730cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
731cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
732cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
733cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
734cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
735cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
736cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
737cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
738cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
739cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
740cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
741cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
742cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeExtern:
743cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
744cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
745cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
746cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
748cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
749cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
750cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
752cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
753cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
757cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
763c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
765c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
766c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
768cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
769819749647b1605f75753f625050cb240292c08b0Sean Callanan{
770819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
771819749647b1605f75753f625050cb240292c08b0Sean Callanan
772819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (!m_parser_vars->m_exe_ctx ||
773567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        !m_parser_vars->m_exe_ctx->GetTargetPtr())
774819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
775819749647b1605f75753f625050cb240292c08b0Sean Callanan
776567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name);
777819749647b1605f75753f625050cb240292c08b0Sean Callanan}
778819749647b1605f75753f625050cb240292c08b0Sean Callanan
77947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter
78047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
78147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
78247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
78347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const uint8_t *data,
78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     size_t length)
78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
78847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
790567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
793567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
79447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
79547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
79747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
79847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
80147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
80447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
805567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return reg_ctx->WriteRegister(reg_info, reg_value);
80947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
81047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        default:
81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeFileAddress:
81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
818567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
821567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
82347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
824567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
827567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
830567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory(load_addr, data, length, err);
83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeLoadAddress:
83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
836567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
840567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeHostAddress:
84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            memcpy ((void *)value.GetScalar().ULongLong(), data, length);
84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return true;
84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeScalar:
84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data,
85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    lldb_private::Value &value,
85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    size_t length)
85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
861567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
862567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
863567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
866567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx->ReadRegister(reg_info, reg_value))
87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
881567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            default:
88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeFileAddress:
89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
891567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
892567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (target == NULL)
89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
901567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                target->ReadMemory(file_addr, true, data, length, err);
90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeLoadAddress:
90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
907567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeHostAddress:
91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                memcpy (data, (const void *)value.GetScalar().ULongLong(), length);
91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return true;
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeScalar:
91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value
92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (expr_var_sp)
93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const ConstString &name(expr_var_sp->GetName());
93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        TypeFromUser type(expr_var_sp->GetTypeFromUser());
93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
939567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
940567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (frame)
94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
942567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableSP var(FindVariableInScope (*frame, name, &type));
94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            if (var)
94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return *GetVariableValue(exe_ctx, var, NULL);
94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
948567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
949567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
950567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (target)
95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
95294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            lldb::ModuleSP module;
95394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan
95494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            VariableSP global(FindGlobalVariable (*target, module, name, NULL, &type));
95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            if (global)
95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return *GetVariableValue(exe_ctx, global, NULL);
95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
959567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            lldb::addr_t location_load_addr = GetSymbolAddress(*target, name);
96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            if (location_load_addr != LLDB_INVALID_ADDRESS)
96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                lldb_private::Value ret;
96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                ret.SetValueType(Value::eValueTypeLoadAddress);
96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                ret.SetContext(Value::eContextTypeInvalid, NULL);
96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                ret.GetScalar() = location_load_addr;
96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return ret;
96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else if (persistent_var_sp)
97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
975a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
976a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan             persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
977a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            persistent_var_sp->m_live_sp)
978a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
979a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return persistent_var_sp->m_live_sp->GetValue();
980a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
981a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        else
982a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
983a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            lldb_private::Value ret;
984a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetValueType(Value::eValueTypeHostAddress);
985a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetContext(Value::eContextTypeInvalid, NULL);
986a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
987a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return ret;
988a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
99147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
99347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
996810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
997f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
998f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
9998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
10008de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1001aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
10028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
10038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
10048de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1005f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1006aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
1007aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1008567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    m_material_vars->m_process = exe_ctx.GetProcessPtr();
1009aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
10100ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
10110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                exe_ctx,
10120ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
10130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
10140ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
10150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
1016f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1017f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
1018aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
1019f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1020f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
1021f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1022f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1023f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
10248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
10258de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
10268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
10273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
1028aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1029047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
1030047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
10318de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
10323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
1033aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1034aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1035567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1036567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1037567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1038567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1039567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL || process == NULL || target == NULL)
10403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
10423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1045aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
10463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
10483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1051567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP object_ptr_var = FindVariableInScope (*frame,
1052696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
1053696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
10543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
10563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
10583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1061aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
10623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
1063aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
10643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
10663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
10683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
107150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
10723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
107350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
107450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
107550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
107650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
10773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
107850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1079567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
108050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
108150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
108250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
108350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
108450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
108550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
108650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
108750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
108850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
1089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
1090c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
109150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
109250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
109350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
1094c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
109550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
10963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
109750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
10983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
109950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
110050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
110150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
110250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
110350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
110450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
110550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
110650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
110750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1108061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
110950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1110061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
111150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
111250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
111350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
111450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
111550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1116061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
111750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1118061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
111950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
1120061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
112150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
112250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
112350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1124061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
112550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1126061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
112750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
112850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
11293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
11303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
11323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11333c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
11348de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
11358de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1137427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
11380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
11390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
11408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11418de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1142f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
11430ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
1144aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1145aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
1146aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
1147aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1148aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
1149aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
1150aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1151aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
1152aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
1153aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1154aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
1155aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
1156aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1157aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
1158aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1159aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
1160aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1161aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
1162aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1163aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
1164aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
1165f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1166f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
116732824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
11688de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
11698de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1170aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
11718de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
11728de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11738de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
117432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
1175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
1177aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1178aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
117932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
118032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
118132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
118232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
1183567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1184567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1185567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!process)
118632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
118732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
118832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
118932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
119032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1191567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1192567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!target)
119332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
119432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
119532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
119632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
119732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
11983371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
11993371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
12003371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
12013371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
12023371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
12033371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
1204c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
120532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
120632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
1207567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (process->ReadMemory (m_material_vars->m_materialized_location,
1208c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
1209c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
121032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
121132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
121232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
121332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
121432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1215567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
121632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1217427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1218427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
1219427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
122032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
1221427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
122232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1223427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
1224427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
1225427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
12278c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1228427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
12298c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
12308c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
1233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
1234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
1235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
1236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
1237427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
1238427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
1239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
124032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
124132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
124232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
124332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
124432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
124532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
124632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1247f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
12498de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
1251aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
12520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
12530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
1254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
12558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12568de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1257810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
1258427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
1259427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
1260427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1261aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1262aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1263e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
126482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1265aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
1266810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1267810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
126857067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
1269810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1270810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1271567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame)
127345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
127445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
127557067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
127645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
1277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
127845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
1279567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
1280aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1281aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
1282e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
1283e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
1284e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1285e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
12869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        m_material_vars->m_allocated_area = NULL;
1287e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1288e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
1289e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
1290e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1291567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
1292810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1293f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
1294f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1295567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx.GetProcessPtr();
1296aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1297f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
1298567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            process->DeallocateMemory(m_material_vars->m_materialized_location);
1299aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1300f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1301810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
13027a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
13037a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
13047a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
1305567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
1306aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1307aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
1308f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1309f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
1310f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
1311f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1312aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
1313f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1314810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1315aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
1316810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1317aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1318aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_materialized_location += (m_struct_vars->m_struct_alignment - (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment));
1319810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1320427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
13218c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
13228c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1323810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
13254d0b110715d321d366dec1dc690300f713b63236Sean Callanan
1326a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
1327336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
1328a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
1329427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
13301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
13311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
13321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1333aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
13341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
13361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1338427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
1339427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
1340427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
1341427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
1342427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1343427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
13471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
1348427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
13491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1351427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
1352427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
13536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
13546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
1355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13598c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1360a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
13618c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
1362a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
1363a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
1364a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
136545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
13666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1367a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
1368a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1369a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1370a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
13716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1372a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1373a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
13746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1375a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1376a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1377a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
13786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
1379a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
13800ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
13810ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
13820ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1383a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1384a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1385f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1386a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1387a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1388a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
13898c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1390a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
13918c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1392810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1393810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1394f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1395f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1396f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1397a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
13988de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
13998de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
14008de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
14018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
14038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
14040ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
14050ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
14068de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
14078de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1408aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
14096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
14106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1412a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1414a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1415a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1416a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1417427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1418a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1419427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1420427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
1421a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
1422a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1423a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1424567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1425567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
14266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
14276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1428a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1429a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
14306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
14316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
14326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
14346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
14356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
14366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
14376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1439567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->ReadPointerFromMemory (addr, read_error);
14406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
14426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
14446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
14486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
14496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
14516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
14526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
145347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
145447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
145547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
145647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
145747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
145847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
145947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
14606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
14636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
14656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1468b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
14696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
14716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
147497678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
147597678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
14766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
14806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
14816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
14830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
14846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
1485567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
14866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
14920ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
14930ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
14940ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
14950ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
14960ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
14970ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
14980ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
14990ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
15000ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
15010ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
15020ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
15030ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
15040ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
15056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
15066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
15096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
15106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
15136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
15146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
15156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
15166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1517567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error deallocate_error = process->DeallocateMemory(mem);
15186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
15206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
15216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
15226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
15236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
15246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
15256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
15276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1528a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
15296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1530a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1531a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1532a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1533a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1534a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
15356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
15366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
15376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
15396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
15416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1544567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->AllocateMemory(pvar_byte_size,
15456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
15466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  allocate_error);
15476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
15496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
15516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
15556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
15566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
15586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
155947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
156047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
156147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
156247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
156347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
156447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
156547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
15666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
15686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
15706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
15716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
15736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1574567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
15756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
15776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
15806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
15826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
15836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
15856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1586567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!process->WriteScalarToMemory (addr,
1587c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       var_sp->m_live_sp->GetValue().GetScalar(),
1588567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                       process->GetAddressByteSize(),
1589c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       write_error))
15906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
15926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1596c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
15976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1598696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1599a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1601a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1602a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1603a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1604a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1605a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1606a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1607a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1608f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
16098de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
16108de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
16118de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
16128de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
16138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
16146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
16158de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
16168de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
16178de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1618f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1619e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1620567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1621567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1622567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1623567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1624567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame || !process || !target)
1625cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
1626cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
16286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
16306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
16316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1632567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, name, &type);
16330eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan
16340eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    ModuleSP module;
16350eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan
16360eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    Symbol *sym = FindGlobalDataSymbol(*target, module, name, NULL);
1637f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1638819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
1639819749647b1605f75753f625050cb240292c08b0Sean Callanan
1640819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1641819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1642819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(GetVariableValue(exe_ctx,
1643819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              var,
1644819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1645819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1646819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
1647ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    {
1648819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(new Value);
1649819749647b1605f75753f625050cb240292c08b0Sean Callanan
1650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        addr_t location_load_addr = GetSymbolAddress(*target, name);
1651819749647b1605f75753f625050cb240292c08b0Sean Callanan
1652cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1653819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1654819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1655c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1656c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1657819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1658819749647b1605f75753f625050cb240292c08b0Sean Callanan
1659819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1660819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1661819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1662819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1663f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1664c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1665c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1666f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1668f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1669841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1670fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1671fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1672fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1673fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1674fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1675fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1676fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1677c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1678c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1679c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1680c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1681fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1682f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1683f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1684f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
16858de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1686f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1687f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
168817c6a05cb96f7110332342326a90692d9505982eSean Callanan
168917c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1690f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
16916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
16926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
169317c6a05cb96f7110332342326a90692d9505982eSean Callanan
169417c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
169517c6a05cb96f7110332342326a90692d9505982eSean Callanan
169617c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1697f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
169817c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1699f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
170017c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
170117c6a05cb96f7110332342326a90692d9505982eSean Callanan
170217c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
170317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1704c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1705c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1706c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
170717c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1708f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
170917c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
171017c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1711f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
17126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
171317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1714c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
17156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1716567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
1717c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           location_value->GetScalar(),
1718567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                           process->GetAddressByteSize(),
1719c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
17206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1721c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1722c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1723c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
17246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
172617c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1727f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
172817c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
172917c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1730f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
17316916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
173217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
173317c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
173417c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
173517c6a05cb96f7110332342326a90692d9505982eSean Callanan
1736c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1737c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1738c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
173917c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
174017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
174117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1742061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
174317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1744061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
174517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1746c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1747c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
174817c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
174917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
175017c6a05cb96f7110332342326a90692d9505982eSean Callanan
1751061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1752061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1753061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1754061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1755061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
175617c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1757c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1758c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1759c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
176017c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
176117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
176217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1763061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
176417c6a05cb96f7110332342326a90692d9505982eSean Callanan
176517c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
176617c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1775b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
17766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
17786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1781c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
178217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1783c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1784c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
1785c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
1786c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
1787061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
178817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
1789061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1790061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
179117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1792c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1793c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1794c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
179517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
179617c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
17976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
17996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1800567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
18016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
18036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1804c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1805c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1806c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
18076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
181117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
181217c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
181317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
18146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Allocate a spare memory area to place the register's contents into.  This memory area will be pointed to by the slot in the
18156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
18166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
18186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1819567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Scalar reg_addr (process->AllocateMemory (value_byte_size,
1820c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1821c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  allocate_error));
18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1823c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
18246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1825c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1826c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1827c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
18286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
18326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
183347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
183447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
183547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
183647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
1837c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
183847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
183947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
18406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
18426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error write_error;
1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
1845567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
1846c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr,
1847567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                           process->GetAddressByteSize(),
1848c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
18496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1850c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1851c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1852c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
18536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
185717c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1858c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
1859c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1860c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
186117c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
186217c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
1863061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1864061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                RegisterValue reg_value;
1865061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1866061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
186717c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1868c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1869c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1870c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
187117c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
187217c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
187317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1874c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1875c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
1876c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
1877c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
1878061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
187917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
188017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1881f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1882f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1883f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1884f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1885810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
1886810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
18871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
18881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
18891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
18901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
18911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
18921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
1893b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
18941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
18951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
18961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
18971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
18981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
1899061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
19001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
19011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
1902061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1903061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
19041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1905bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
19061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
19071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1909061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
19101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1911061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
19121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
19131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
19151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
19161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
19171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1918061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
19191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1920061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
19211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
19221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1924061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1925061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
19261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
192795b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
19281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
19291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
19311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
19331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
19341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1935696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
19368de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
19378de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
19388de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
19398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
19408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
19418de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1942aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1943e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1944cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1945f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    ValueObjectSP valobj;
1946f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    VariableSP var_sp;
1947f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    Error err;
1948f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan
1949f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
1950f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     eNoDynamicValues,
1951f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     StackFrame::eExpressionPathOptionCheckPtrVsMember,
1952f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     var_sp,
1953f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     err);
19543bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1955f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    if (!err.Success() ||
1956f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan        !var_sp ||
1957ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
1958ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
1959ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
19603bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
19613bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
19623bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
19633bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
19643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
196504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
1966696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                return lldb::VariableSP();
19673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
19683bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
19693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
19703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
19713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
1972696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan            return lldb::VariableSP();
19733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
19743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
19753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1976696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return var_sp;
1977cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
1978336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1979819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
1980819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
1981819749647b1605f75753f625050cb240292c08b0Sean Callanan(
1982819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
19830eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    ModuleSP &module,
19840eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    const ConstString &name,
19850eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    ClangNamespaceDecl *namespace_decl
1986819749647b1605f75753f625050cb240292c08b0Sean Callanan)
1987819749647b1605f75753f625050cb240292c08b0Sean Callanan{
1988819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
1989819749647b1605f75753f625050cb240292c08b0Sean Callanan
19900eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    if (module && namespace_decl)
19910eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan        module->FindSymbolsWithNameAndType(name,
19920eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                           namespace_decl,
19930eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                           eSymbolTypeData,
19940eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                           sc_list);
19950eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    else
19960eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan        target.GetImages().FindSymbolsWithNameAndType(name,
19970eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                                      eSymbolTypeData,
19980eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                                      sc_list);
1999819749647b1605f75753f625050cb240292c08b0Sean Callanan
2000819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
2001819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2002819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
2003819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
2004819749647b1605f75753f625050cb240292c08b0Sean Callanan
2005819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
2006819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2007819749647b1605f75753f625050cb240292c08b0Sean Callanan
2008819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
2009819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2010819749647b1605f75753f625050cb240292c08b0Sean Callanan
201147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// This is a callback used with Variable::GetValuesForVariableExpressionPath
201247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
201347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic uint32_t GetVariableCallback (void *baton,
201447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const char *name,
201547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     VariableList &variable_list)
201647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
201747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target *target = static_cast<Target *>(baton);
201847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (target)
201947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
202047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return target->GetImages().FindGlobalVariables (ConstString(name),
202147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                        true,
202247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                        UINT32_MAX,
202347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                        variable_list);
202447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
202547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return 0;
202647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
202747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
202847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
202947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
203047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
203147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
203294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
203394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
203494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
203547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
203647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
203747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
203847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
203947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ValueObjectList valobjs;
204047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
204194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
204294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
204394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
204494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
204547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
204647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
204747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
204847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
204947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
205047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
205147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
205247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
205347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
205447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
205547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                {
205647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
205747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        return var_sp;
205847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                }
205947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
206047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
206147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
206247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
206347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
206447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
206547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
206647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
206747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
206847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
206947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
207147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
207216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
207316b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name)
207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2075e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2077aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_ignore_lookups)
2078ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
2079ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
2080ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
2081ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
2082ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
2083e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
208416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
208516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
208616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
208716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalVisibleDecls for '%s' in a NULL DeclContext", name.GetCString());
208816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
208916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalVisibleDecls for '%s' in '%s'", name.GetCString(), context_named_decl->getNameAsString().c_str());
209016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
209116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalVisibleDecls for '%s' in a '%s'", name.GetCString(), context.m_decl_context->getDeclKindName());
209216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
209316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
209416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
209516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
209616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->m_ast_importer->GetNamespaceMap(namespace_context);
209716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
209816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
209916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
210016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
210116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
210216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
210316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                log->Printf("  Searching namespace '%s' in file '%s'",
210416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
210516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
210616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
210716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            //FindExternalVisibleDecls(context,
210816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            //                         i->first,
210916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            //                         i->second,
211016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            //                         name);
211116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
211216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
211316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else if (!isa<TranslationUnitDecl>(context.m_decl_context))
211416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
211516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        // we shouldn't be getting FindExternalVisibleDecls calls for these
211616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return;
211716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
211816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else
211916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
212016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
212116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
212216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
212394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            log->Printf("  Searching the root namespace");
212416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
212516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
212616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
212716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
212816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 name);
212916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
213016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
213116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
213216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
213316b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
213416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                                  lldb::ModuleSP module,
213503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
213616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                                  const ConstString &name)
213716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
213816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    assert (m_struct_vars.get());
213916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    assert (m_parser_vars.get());
214016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
214116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2142e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2143e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21453bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
21463bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
21483bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
21493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
21518de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
2152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
215403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
21553cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
215657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
215747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
215857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
215957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
216057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
216157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
216347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
216447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
216657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
216757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
216857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
216957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
217057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
217157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
217275a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!this_var ||
2173567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->IsInScope(frame) ||
2174567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->LocationIsValidForFrame (frame))
217557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
217657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
217757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
217857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
217957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
218057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
218157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
21822403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            if (log)
21832403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
21842403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString ("Type for \"this\" is: ");
21852403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
21862403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
21872403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
21882403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
218903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
219004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser this_user_type(this_type->GetClangFullType(),
219157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
219257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2193aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
219457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
219558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
219657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
219757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
219857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
219957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
220057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2201c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2202c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2203c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            if (pointer_target_qual_type.isConstQualified())
2204c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                pointer_target_qual_type.removeLocalConst();
2205c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2206c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
220757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
220803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22093aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
22103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
22113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
22123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
22133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
22143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
22153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
22163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
221757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            AddOneType(context, class_user_type, true);
221857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
221957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
222057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
222157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
22223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
22233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
22243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
22253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
22263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2227567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
222847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
222947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2230567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
223103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
22333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
223403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22353aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
223603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
223775a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!self_var ||
2238567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->IsInScope(frame) ||
2239567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->LocationIsValidForFrame (frame))
22403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
224103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22423aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
22433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
22453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
224603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
224704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser self_user_type(self_type->GetClangFullType(),
22483aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
22493aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22503aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
225103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
225258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
225303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
225527a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham                                                &pointer_target_type)
225619c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton                || pointer_target_type == NULL)
22573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
225803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22593aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
22603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
22613aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22623aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
22633aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
22643aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
22653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
22663aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
22673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
22683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
22693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            AddOneType(context, class_user_type, false);
22713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
22733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
2274c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
2275c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
2276c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2277c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
227803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
22802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
2281567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
22822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22832431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2284567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
22852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
22872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22882431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22892431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
22902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
22922431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22932431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
229503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
22972431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22992431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
23002431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
23022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23032431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
23052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
23072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23082431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
23102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                log->Printf("Found persistent type %s", name.GetCString());
23112431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
23132431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
23142431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
231603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2317427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
23181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2319427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            AddOneVariable(context, pvar_sp);
23201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
23211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
23221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
23231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
23241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2325aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
23261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2327b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
23281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
23291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
23301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                AddOneRegister(context, reg_info);
23311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
23328de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
233303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
233403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
233503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
233603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
233703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
233803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        bool found = false;
233903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
234003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
234103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
234203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
234303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
234403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember,
234503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
234603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
234703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
234803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
234903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (err.Success() && var != NULL)
235003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
235103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                AddOneVariable(context, var);
235203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                found = true;
235303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
235403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
235503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        else if (target)
235603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
235794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
235894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      module,
235994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
236094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
236103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
236203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
236303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
236403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
236503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                AddOneVariable(context, var);
236603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                found = true;
236703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
236803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
236903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
237003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (!found)
237103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
237203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool include_symbols = true;
237303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
2374a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
2375a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            if (namespace_decl && module)
2376a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
2377a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                module->FindFunctions(name,
2378a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                      &namespace_decl,
2379a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                      eFunctionNameTypeBase,
2380a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                      include_symbols,
2381a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                      append,
2382a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                      sc_list);
2383a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2384a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            else
2385a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
2386a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
2387a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  eFunctionNameTypeBase,
2388a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
2389a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
2390a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
2391a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2392a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
239303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
239403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
239503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                bool found_specific = false;
239603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
239703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
239803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
239903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
240003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
240103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
240203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
240303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
240403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
240503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
240603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
240703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
240803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
240903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // overloaded
241003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (!found_specific)
241103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            AddOneFunction(context, sym_ctx.function, NULL);
241203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        found_specific = true;
241303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        found = true;
241403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
241503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
241603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
241703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
241803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
241903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
242003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
242103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
242203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
242303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
242403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (!found_specific)
242503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
242603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
242703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
242803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        AddOneFunction (context, NULL, generic_symbol);
242903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        found = true;
243003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
243103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
243203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
243303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        AddOneFunction (context, NULL, non_extern_symbol);
243403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        found = true;
243503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
243603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
243703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
243803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
243903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (!found)
244003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
244103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // We couldn't find a variable or function for this.  Now we'll hunt for a generic
244203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
244303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
24440eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                Symbol *data_symbol;
24450eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan
24460eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                if (namespace_decl && module)
24470eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                {
24480eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                    data_symbol = FindGlobalDataSymbol(*target, module, name, &namespace_decl);
24490eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                }
24500eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                else
24510eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                {
24520eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                    ModuleSP module;
24530eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                    data_symbol = FindGlobalDataSymbol(*target, module, name, NULL);
24540eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                }
245503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
245603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
245703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
245803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    AddOneGenericVariable(context, *data_symbol);
245903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    found = true;
246003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
246103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
246203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
246303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
246403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages();
246503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
246603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ClangASTImporter::NamespaceMapSP namespace_decls(new ClangASTImporter::NamespaceMap);
246703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
246803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        for (uint32_t i = 0, e = images.GetSize();
246903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan             i != e;
247003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan             ++i)
247103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
247203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            ModuleSP image = images.GetModuleAtIndex(i);
247303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (!image)
247503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                continue;
247603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            ClangNamespaceDecl namespace_decl;
247803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            SymbolVendor *symbol_vendor = image->GetSymbolVendor();
248003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
248103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (!symbol_vendor)
248203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                continue;
248303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
248403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            SymbolContext null_sc;
248503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
248603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            namespace_decl = symbol_vendor->FindNamespace(null_sc, name);
248703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
248803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (namespace_decl)
248903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
249003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                (*namespace_decls)[image] = namespace_decl;
249103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
249203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (log)
249303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
249403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    std::string s;
249503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    llvm::raw_string_ostream os(s);
249603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    namespace_decl.GetNamespaceDecl()->print(os);
249703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    os.flush();
249803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    log->Printf("Found namespace %s in file %s", s.c_str(), image->GetFileSpec().GetFilename().GetCString());
250003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
250103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
250203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
250303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
250403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (!namespace_decls->empty())
250503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
250603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decls);
250703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
250803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (clang_namespace_decl)
250903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                clang_namespace_decl->setHasExternalVisibleStorage();
251003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
251103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    }
2512a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2513aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
25146df0840c87be29724055716db951aa6d494ddabcSean Callanan
2515ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    if (type_sp)
2516ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
2517ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
25186df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
2519ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf ("Matching type found for \"%s\": ", name.GetCString());
2520ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            StreamString strm;
2521ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            type_sp->Dump(&strm, true);
2522ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->PutCString (strm.GetData());
2523ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        }
25242403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
252504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        TypeFromUser user_type (type_sp->GetClangFullType(),
2526b01000fd063629facd45044f137446fb748ee179Greg Clayton                                type_sp->GetClangAST());
25276df0840c87be29724055716db951aa6d494ddabcSean Callanan
2528ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        AddOneType(context, user_type, false);
25296df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2531e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananclang::ExternalLoadResult
25339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context,
25349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  bool (*predicate)(Decl::Kind),
25359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  llvm::SmallVectorImpl<Decl*> &decls)
2536e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{
25379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
25389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2539e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
25409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const Decl *context_decl = dyn_cast<Decl>(decl_context);
25429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25439b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!context_decl)
25449b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25459b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast_context = &context_decl->getASTContext();
25479b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25489b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (log)
254916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
255016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
255116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalLexicalDecls in '%s' (a %s) with %s predicate",
255216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_named_decl->getNameAsString().c_str(),
255316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_decl->getDeclKindName(),
255416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
255516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if(context_decl)
255616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalLexicalDecls in a %s with %s predicate",
255716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_decl->getDeclKindName(),
255816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
255916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
256016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalLexicalDecls in a NULL context with %s predicate",
256116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
256216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
25639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *original_decl = NULL;
25659b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *original_ctx = NULL;
25669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25679b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context);
25689b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer)
25709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
25739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25749b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2575e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (log)
2576e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
25779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        std::string decl_print_string;
25789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        llvm::raw_string_ostream decl_print_stream(decl_print_string);
25799b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        original_decl->print(decl_print_stream);
25809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        decl_print_stream.flush();
25819b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        log->Printf("Original decl:\n%s", decl_print_string.c_str());
25829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    }
25839b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
25859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    {
25869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        ExternalASTSource *external_source = original_ctx->getExternalSource();
2587336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2588c613971c0016484053b60db95d01648a3f6ea849Sean Callanan        if (external_source)
2589c613971c0016484053b60db95d01648a3f6ea849Sean Callanan            external_source->CompleteType (original_tag_decl);
2590e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2591e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25929b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
2593e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25949b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!original_decl_context)
25959b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
2596e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
25989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         iter != original_decl_context->decls_end();
25999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         ++iter)
2600e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
26019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        Decl *decl = *iter;
2602e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!predicate || predicate(decl->getKind()))
2604e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
26059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            if (log)
26069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            {
26079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                std::string decl_print_string;
26089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                llvm::raw_string_ostream decl_print_stream(decl_print_string);
26099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                decl->print(decl_print_stream);
26109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                decl_print_stream.flush();
26119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                log->Printf("  Adding lexical decl %s", decl_print_string.c_str());
26129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            }
26139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl);
2615e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            decls.push_back(copied_decl);
2617e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
2618e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2619e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return ELR_AlreadyLoaded;
26219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
26229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
26249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
26259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
26269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
26279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl);
26299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
26309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
26329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
26339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
26349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
26359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl);
2637e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton}
2638e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2639336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
26408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
26418de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
26428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
2643696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP var,
26449b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
26458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
26468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
26478de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2649e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
26506184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2655810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2656810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
2657336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
266004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2664810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2665810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
2666336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2671b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2673810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2674810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
2675336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2678336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
2679336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2682178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2683178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
2684567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
2685567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2686178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
2687178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
2688178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
2689178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
2690567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
2691178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2694bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2696810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2697810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
2698336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2700b01000fd063629facd45044f137446fb748ee179Greg Clayton
270158baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
2702336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2703f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
2704f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
2705b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
2706f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
27074b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
27084b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
27094b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
27104b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
27114b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
27124b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
27134b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
27144b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
2715f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
2716f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2717f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2718336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
2719336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
27226916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
2728336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
2730336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
2735336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
2736336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2739567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
274147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
274247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
274347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->GetScalar() = load_addr;
274447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->SetValueType(Value::eValueTypeLoadAddress);
274547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2748f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
2749b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
2750336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2751336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
2752336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
2753336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2754336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
2755696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var)
2756336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
2757aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2758aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2759e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
276047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2761f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
2762f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
2763336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2764aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
27658de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
27668de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
27678de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
27688de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
2769336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
27704b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
27714b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
27724b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
27736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
27748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2775427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
2776fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2777fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      entity_name,
2778427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      ut,
277947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
278047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2781427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2782427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2783427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2784427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2785427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2786427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2787696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2789810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
27908de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2791a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2792a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2793a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2794a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2795a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2796a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
27976e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan
27989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //if (log->GetVerbose())
27999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //{
28009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    StreamString var_decl_dump_string;
28019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
28029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    log->Printf("%s\n", var_decl_dump_string.GetData());
28039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //}
28048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
28058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
28068f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
28078f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
2808a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
2809427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                       ClangExpressionVariableSP &pvar_sp)
2810a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
2811e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
281245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2813427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
2814a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2815427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2816427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
2817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
2818427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
2819a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
28206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
28218c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2822427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
2823427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
2824427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
2825427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
2826427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
282745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
282845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
2829a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
2830a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2831a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2832a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2833a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2834a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2835427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
2836a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
2837a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
2838a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
28391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
2840819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
2841819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              Symbol &symbol)
2842819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2843819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
2844819749647b1605f75753f625050cb240292c08b0Sean Callanan
2845819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2846819749647b1605f75753f625050cb240292c08b0Sean Callanan
2847567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2848567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2849567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
2850567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
2851567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2852567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2853819749647b1605f75753f625050cb240292c08b0Sean Callanan
2854fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
2855819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
2856819749647b1605f75753f625050cb240292c08b0Sean Callanan
2857fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
2858819749647b1605f75753f625050cb240292c08b0Sean Callanan                                context.GetASTContext());
2859819749647b1605f75753f625050cb240292c08b0Sean Callanan
2860fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2861819749647b1605f75753f625050cb240292c08b0Sean Callanan
2862819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2863819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
2864819749647b1605f75753f625050cb240292c08b0Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2865819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
2866819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
286747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
286847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2869819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
2870819749647b1605f75753f625050cb240292c08b0Sean Callanan
2871819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
2872819749647b1605f75753f625050cb240292c08b0Sean Callanan
2873819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddressRange &symbol_range = symbol.GetAddressRangeRef();
2874819749647b1605f75753f625050cb240292c08b0Sean Callanan    Address &symbol_address = symbol_range.GetBaseAddress();
2875567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
2876819749647b1605f75753f625050cb240292c08b0Sean Callanan
2877819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2878819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
2879819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2880819749647b1605f75753f625050cb240292c08b0Sean Callanan
2881fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    entity->EnableParserVars();
2882819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
2883819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
2884819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
2885819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
2886819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
2887fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //entity->m_flags                      |= ClangExpressionVariable::EVUnknownType;
2888819749647b1605f75753f625050cb240292c08b0Sean Callanan
2889819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
2890819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2891819749647b1605f75753f625050cb240292c08b0Sean Callanan        std::string var_decl_print_string;
2892819749647b1605f75753f625050cb240292c08b0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2893819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl->print(var_decl_print_stream);
2894819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl_print_stream.flush();
2895819749647b1605f75753f625050cb240292c08b0Sean Callanan
2896819749647b1605f75753f625050cb240292c08b0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
2897819749647b1605f75753f625050cb240292c08b0Sean Callanan
28989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //if (log->GetVerbose())
28999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //{
29009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    StreamString var_decl_dump_string;
29019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
29029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    log->Printf("%s\n", var_decl_dump_string.GetData());
29039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //}
2904819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2905819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2906819749647b1605f75753f625050cb240292c08b0Sean Callanan
2907fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
2908fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
2909fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
2910fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2912567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2913567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2914fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2915fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
2916fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
2917fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
2918fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
2919fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2920fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2921fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2922fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
2923fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2924fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2925fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2926fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
2927fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2928fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
2929fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
2930fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
2931fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2932fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2933fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
2934fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2935fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                std::string var_decl_print_string;
2936fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2937fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                var_decl->print(var_decl_print_stream);
2938fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                var_decl_print_stream.flush();
2939fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2940fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str());
2941fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2942fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2943fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
2944fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2945fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2946fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2947fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2948fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
2949fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2950fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2951fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_parser_type = parser_type;
2952fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2953fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
2954fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
2955fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2956fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2957fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
2958fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
2959fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2960fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
2961fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
2962fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2963819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
2964427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
2965427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        const RegisterInfo *reg_info)
29661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
29671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
29681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
29701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
29711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
29721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
29741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2975122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
2976122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen            log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
29771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
29781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
29791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2980427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
2981427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
29821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
29841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2985fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
298647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
298747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2988427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
29891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
2991427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
2992427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
29971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (log)
29991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
30001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        std::string var_decl_print_string;
30011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
30021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl->print(var_decl_print_stream);
30031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl_print_stream.flush();
30041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
30051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
30061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
30071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
30081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
30099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananNamespaceDecl *
301016b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls)
30116916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
301216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (namespace_decls.empty())
301316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return NULL;
301416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30156916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
30166916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
3017e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    assert (m_parser_vars.get());
3018e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
301916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second;
302016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
302216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                                                                         namespace_decl.GetNamespaceDecl());
302316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
302416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl);
302516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
302616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
302716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return dyn_cast<NamespaceDecl>(copied_decl);
30296916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
30306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
3031a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
3032da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3033da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
3034da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Symbol* symbol)
30358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
3036aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3037aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3038e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
30398f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
304058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
30410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
304258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
30438f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
30450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
30469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
30478f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
30490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
30510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
30530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
30550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no type");
30560fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30570fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
305904c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
30600fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
30620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
30640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no Clang type");
30650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
30690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
3070b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
3071ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
30720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
30740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30750fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
30760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
30780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
30800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
30828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
3083810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
30840fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            log->PutCString("AddOneFunction called with no function and no symbol");
30858f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
30868f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
30878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3088567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3090567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
30918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
30928f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
30938f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3094fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
309547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
309647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3097427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
30988de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
3099427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
3100427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
3101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
3102427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
3104427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
3105427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3106427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
31078c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3108810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
31098de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3110a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string fun_decl_print_string;
3111a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
3112a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl->print(fun_decl_print_stream);
3113a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl_print_stream.flush();
3114a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
3115a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
31168de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
311893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
311993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
312093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
31213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
31223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
312393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
31249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context = context.GetASTContext();
31259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
31263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3127ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
31283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
313093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
31313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
31323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
31333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
31343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
31363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
31383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
31393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
31403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
31413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
31423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
314330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
31451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
31461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
314730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
314830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
31501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
31518de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
31521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
31531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
31541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
31551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
315630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
315730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
31583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
315993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
316093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
316193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
3162ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3163ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid *
3164ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
3165ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         ASTContext *source_context,
3166ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         void *clang_type)
3167ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{
3168aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3169aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3170aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = true;
3171ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3172e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context);
3173e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
3174e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    QualType ret_qual_type = importer->CopyType (source_context,
3175e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                                 QualType::getFromOpaquePtr(clang_type));
3176e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
3177e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    void *ret = ret_qual_type.getAsOpaquePtr();
3178ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3179aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = false;
3180ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3181ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    return ret;
3182ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan}
3183