ClangExpressionDeclMap.cpp revision 6d284ef56532873d669f8edd4b40031407f0ffe4
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{
646d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    // Note: The model is now that the parser's AST context and all associated
656d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   data does not vanish until the expression has been executed.  This means
666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   that valuable lookup data (like namespaces) doesn't vanish, but
676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    DidParse();
69aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
73166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool
74427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
758c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_exe_ctx = &exe_ctx;
78567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx.GetFramePtr())
81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetThreadPtr())
83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetProcessPtr())
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    }
89567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (target)
90987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
92567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
93987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
9497ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan
95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
97567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
98166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!target->GetScratchClangASTContext())
100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            return false;
101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
102166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    m_parser_vars->m_target_info = GetTargetInfo();
10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
105166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    return true;
106aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
107c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
108427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp &&
119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars.get() &&
120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars->m_lldb_value)
121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                delete var_sp->m_parser_vars->m_lldb_value;
122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp->DisableParserVars();
124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
126427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
130427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                pvar_sp->DisableParserVars();
133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1367a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo
14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo()
14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo ret;
14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
149567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx)
15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx->GetProcessPtr();
152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (process)
153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.byte_order = process->GetByteOrder();
155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.address_byte_size = process->GetAddressByteSize();
156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        else
158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Target *target = exe_ctx->GetTargetPtr();
160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (target)
161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            {
162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.byte_order = target->GetArchitecture().GetByteOrder();
163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            }
165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return ret;
16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1718de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
17382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
177427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
182aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
18382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
18482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
191166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
193567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
194567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
195567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
196567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
197567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
19805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
19905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
20005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetASTContext(),
20105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetOpaqueQualType()),
20205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
2060e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
20747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
20847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
2090e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
2100e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2110e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
2120e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2130e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
2140e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
21505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2160e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
2170e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
2180e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
21905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
22005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
22147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
22205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
2230e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
22405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
22505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
22805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2292bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen    for (size_t byte_idx = 0;
23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
23205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
23405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (m_parser_vars->m_target_info.byte_order)
23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
2400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
2410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
2420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
2430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
2450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
2470e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
2480e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
2490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
2510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
25205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
25305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
2546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
256696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
257696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
26005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
26105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP
263696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
2649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                           VarDecl *decl,
265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           lldb_private::TypeFromParser type)
266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{
267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    assert (m_parser_vars.get());
268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
270696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
271696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
273567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
274567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
275567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
276567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
278567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return ClangExpressionVariableSP();
287696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
288696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetASTContext(),
290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetOpaqueQualType()),
291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                           context);
292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser var_type = var_sp->GetTypeFromUser();
294696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
295567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx->GetFramePtr();
296567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL)
297567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
298567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
299567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var)
302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
303696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
304567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_valobj)
307696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
308696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
309696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
310696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
311696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_casted_valobj)
312696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (log)
315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    {
316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        StreamString my_stream_string;
317696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
318696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
319696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           var_type.GetOpaqueQualType(),
320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           &my_stream_string);
321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    }
325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!pvar_sp)
329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return pvar_sp;
339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan}
340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name)
34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
34647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
34747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
34847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
34947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
35047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
35147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                lldb_private::Value &value,
35247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                const ConstString &name,
353a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                lldb_private::TypeFromParser type,
354a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                bool transient)
35547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!pvar_sp)
36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
364a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !pvar_sp->m_live_sp &&
365a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !transient)
36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        // The reference comes from the program.  We need to set up a live SP for it.
36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetASTContext(),
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetName(),
37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetScalar().ULongLong(),
37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetValueAddressType(),
37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetByteSize());
37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->ValueUpdated();
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const size_t pvar_byte_size = pvar_sp->GetByteSize();
38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        uint8_t *pvar_data = pvar_sp->GetValueBytes();
38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!ReadTarget(pvar_data, value, pvar_byte_size))
38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    valobj = pvar_sp;
39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return true;
39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
3968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
3978de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
3988de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4008de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
4026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
4036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
4048de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
405a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
406aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
407aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
4086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
409fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
412567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
413567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
414567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
415567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
416567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
417a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
418a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
41982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
42082b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
42197678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
425a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
426fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
427fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
428427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
42947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
43047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
4318c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4328c12720c108cd5e7ed792596749218d8400f647eSean Callanan
433427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
4348c12720c108cd5e7ed792596749218d8400f647eSean Callanan
435427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4368c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4378c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
4396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
4406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
4466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
4506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
4516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
4546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
4556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
456427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
4578c12720c108cd5e7ed792596749218d8400f647eSean Callanan
458427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
459427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
4608c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4618c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
462a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
463a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
464a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
4658de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
4668de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4679b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
4708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
4718de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
4728de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
476aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
477e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
47845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
479aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
4808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
4838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
484427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan
486427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
487427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
4888c12720c108cd5e7ed792596749218d8400f647eSean Callanan
489427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4918c12720c108cd5e7ed792596749218d8400f647eSean Callanan
49245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
49345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
49445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
4958de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
496427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
49745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
4988c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
4998c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
500427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
5018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
502427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
503427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
504427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
5058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
506427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
5078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
5138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
514aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
515aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
516aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
5178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
5208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
521aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
522aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
5238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
524427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
5258c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5268c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
5278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
528427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
529427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
530427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
532427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
5338c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
536427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
5378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
539427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
5408c12720c108cd5e7ed792596749218d8400f647eSean Callanan
541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
542427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
5438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
5448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
545aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
5468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
547aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
5488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5518de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
5528de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
5548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
5558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
5568de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
558aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
559aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
560aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
563427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
565aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
5728de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
5748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
5758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
5768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
5778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
5788de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
582aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
585427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
5868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
588427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
5898c12720c108cd5e7ed792596749218d8400f647eSean Callanan
590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_jit_vars.get())
5938c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
596427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
597427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
5998c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
60302fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
6048de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
6058de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
6078de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value**& value,
6088de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
6098de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
610ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
611427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
6128c12720c108cd5e7ed792596749218d8400f647eSean Callanan
613427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
6148c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
615ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
6168c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
6178c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
618ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
619427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = &entity_sp->m_parser_vars->m_llvm_value;
620427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
6218c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6228c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
623ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
624ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
625ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
626ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
627ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
628ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
629ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
630ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
631ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
632ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
633ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
6343e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan       sym_ctx.module_sp->FindSymbolsWithNameAndType(name, NULL, eSymbolTypeCode, sc_list);
635ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
636ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (!sc_list.GetSize())
637ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
638ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
639ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
640f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
6418de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
6428de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
644da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
6458de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
646f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
648aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
649aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
651567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
652567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
653567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
654f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
655567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
65678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
65778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
658f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
659f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
660e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
661f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
662ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
663ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
664e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
665aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
666aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
667aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
668aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
669aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        Mangled mangled(name.GetCString(), true);
670aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
671aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        ConstString demangled_name = mangled.GetDemangledName();
672aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
673aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        if (strlen(demangled_name.GetCString()))
674aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
675aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            std::string const_name_scratch(demangled_name.GetCString());
676aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
677aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            const_name_scratch.append(" const");
678aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
679aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            ConstString const_name(const_name_scratch.c_str());
680aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
681ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan            FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
682aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
683aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
684aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan                log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString());
685aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
686aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
687aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
688aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
689f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
690f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
691f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
692e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
693f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
694da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
696f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
697da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
698f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
699da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
700f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
701f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
702f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
703ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
704ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
705ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
706567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (target);
707da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
708f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
709f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
710f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
711cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
712cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
713c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
714c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
715c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
716819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
717c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
718cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
719cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
720cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
721cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
722cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
723cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
724cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
725c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
726cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
727ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
728ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
729ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
730ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
731cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
732cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
733cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
734cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
735cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
736cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
737cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
738cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
739cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
740cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
741cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
742cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
743cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
744cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
745cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
746cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeExtern:
748cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
749cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
750cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
752cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
753cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
757cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
765cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
766cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
768c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
769cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
770c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
771c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
772cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
773cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
774819749647b1605f75753f625050cb240292c08b0Sean Callanan{
775819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
776819749647b1605f75753f625050cb240292c08b0Sean Callanan
777819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (!m_parser_vars->m_exe_ctx ||
778567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        !m_parser_vars->m_exe_ctx->GetTargetPtr())
779819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
780819749647b1605f75753f625050cb240292c08b0Sean Callanan
781567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name);
782819749647b1605f75753f625050cb240292c08b0Sean Callanan}
783819749647b1605f75753f625050cb240292c08b0Sean Callanan
78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter
78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
78847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const uint8_t *data,
78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     size_t length)
79047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
79347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
79447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
795567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
79747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
798567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
80947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
810567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return reg_ctx->WriteRegister(reg_info, reg_value);
81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
81847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        default:
82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeFileAddress:
82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
823567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
82447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
826567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
829567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
832567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
835567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory(load_addr, data, length, err);
83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeLoadAddress:
84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
841567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
845567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeHostAddress:
85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            memcpy ((void *)value.GetScalar().ULongLong(), data, length);
85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return true;
85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeScalar:
85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data,
86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    lldb_private::Value &value,
86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    size_t length)
86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
866567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
867567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
868567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
871567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx->ReadRegister(reg_info, reg_value))
88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
886567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            default:
89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeFileAddress:
89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
896567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (target == NULL)
89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
902567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
906567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                target->ReadMemory(file_addr, true, data, length, err);
90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeLoadAddress:
91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
912567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeHostAddress:
92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                memcpy (data, (const void *)value.GetScalar().ULongLong(), length);
92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return true;
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeScalar:
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value
93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (expr_var_sp)
94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
9416d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan        if (!expr_var_sp->m_parser_vars.get())
9426d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan            return Value();
9436d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const ConstString &name(expr_var_sp->GetName());
94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        TypeFromUser type(expr_var_sp->GetTypeFromUser());
94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
947567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
948567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (frame)
94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
950567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableSP var(FindVariableInScope (*frame, name, &type));
95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            if (var)
95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return *GetVariableValue(exe_ctx, var, NULL);
95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
956567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
957567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
958567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (target)
95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
96094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            lldb::ModuleSP module;
96194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan
96294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            VariableSP global(FindGlobalVariable (*target, module, name, NULL, &type));
96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            if (global)
96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return *GetVariableValue(exe_ctx, global, NULL);
96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
967567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            lldb::addr_t location_load_addr = GetSymbolAddress(*target, name);
96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            if (location_load_addr != LLDB_INVALID_ADDRESS)
97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                lldb_private::Value ret;
97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                ret.SetValueType(Value::eValueTypeLoadAddress);
97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                ret.SetContext(Value::eContextTypeInvalid, NULL);
97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                ret.GetScalar() = location_load_addr;
97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return ret;
97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
97847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else if (persistent_var_sp)
98247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
983a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
984a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan             persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
985a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            persistent_var_sp->m_live_sp)
986a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
987a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return persistent_var_sp->m_live_sp->GetValue();
988a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
989a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        else
990a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
991a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            lldb_private::Value ret;
992a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetValueType(Value::eValueTypeHostAddress);
993a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetContext(Value::eContextTypeInvalid, NULL);
994a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
995a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return ret;
996a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1004810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
1005f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1006f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
10078de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
10088de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1009aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
10108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
10118de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
10128de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1013f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1014aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
1015aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1016567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    m_material_vars->m_process = exe_ctx.GetProcessPtr();
1017aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
10180ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
10190ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                exe_ctx,
10200ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
10210ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
10220ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
10230ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
1024f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1025f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
1026aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
1027f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1028f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
1029f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1030f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1031f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
10328de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
10338de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
10348de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
10353aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
1036aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1037047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
1038047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
10398de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
10403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
1041aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1042aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1043567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1044567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1045567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1046567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1047567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL || process == NULL || target == NULL)
10483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
10503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1053aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
10543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
10563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1059567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP object_ptr_var = FindVariableInScope (*frame,
1060696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
1061696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
10623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10633c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
10643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
10663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1069aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
10703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
1071aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
10723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
10743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
10763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
107950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
10803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
108150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
108250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
108350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
108450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
10853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
108650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1087567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
108850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
108950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
109050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
109150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
109250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
109350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
109450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
109550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
109650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
1097567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
1098c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
109950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
110050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
110150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
1102c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
110350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
11043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
110550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
11063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
110750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
110850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
110950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
111050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
111150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
111250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
111350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
111450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
111550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1116061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
111750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1118061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
111950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
112050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
112150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
112250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
112350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1124061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
112550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1126061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
112750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
1128061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
112950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
113050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
113150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1132061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
113350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1134061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
113550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
113650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
11373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
11383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
11403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11413c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
11428de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
11438de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1144aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1145427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
11460ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
11470ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
11488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11498de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1150f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
11510ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
1152aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1153aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
1154aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
1155aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1156aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
1157aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
1158aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1159aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
1160aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
1161aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1162aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
1163aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
1164aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1165aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
1166aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1167aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
1168aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1169aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
1170aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1171aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
1172aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
1173f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1174f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
117532824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
11768de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
11778de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1178aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
11798de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
11808de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11818de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
118232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
1183aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1184aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
1185aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1186aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
118732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
118832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
118932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
119032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
1191567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1192567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1193567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!process)
119432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
119532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
119632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
119732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
119832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1199567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1200567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!target)
120132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
120232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
120332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
120432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
120532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
12063371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
12073371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
12083371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
12093371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
12103371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
12113371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
1212c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
121332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
121432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
1215567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (process->ReadMemory (m_material_vars->m_materialized_location,
1216c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
1217c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
121832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
121932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
122032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
122132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
122232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1223567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
122432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1225427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
1227427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
122832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
1229427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
123032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
1233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
12358c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
12378c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
12388c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
1240427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
1241427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
1242427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
1243427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
1244427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
1245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
1246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
1247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
124832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
124932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
125032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
125132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
125232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
125332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
125432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1255f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12568de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
12578de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
1259aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
12600ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
12610ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
1262427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
12638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12648de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1265810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
1266427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
1267427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
1268427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1269aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1270aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1271e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
127282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1273aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
1274810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1275810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
127657067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
1277810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1278810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1279567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1280567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame)
128145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
128245839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
128357067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
128445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
1285567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
128645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
1287567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
1288aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1289aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
1290e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
1291e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
1292e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1293e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
12949b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        m_material_vars->m_allocated_area = NULL;
1295e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1296e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
1297e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
1298e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1299567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
1300810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1301f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
1302f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1303567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx.GetProcessPtr();
1304aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1305f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
1306567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            process->DeallocateMemory(m_material_vars->m_materialized_location);
1307aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1308f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1309810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
13107a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
13117a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
13127a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
1313567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
1314aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1315aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
1316f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1317f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
1318f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
1319f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1320aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
1321f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1322810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1323aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
1324810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1325aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1326aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
1327810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
13298c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
13308c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1331810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1332427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
13334d0b110715d321d366dec1dc690300f713b63236Sean Callanan
1334a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
1335336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
1336a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
1337427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
13381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
13391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
13401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1341aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
13421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
13441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1346427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
1347427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
1348427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
1349427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
1350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1351427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
13551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
1356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
13571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1359427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
1360427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
13616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
13626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
1363427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1364427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13678c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1368a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
13698c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
1370a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
1371a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
1372a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
137345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
13746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1375a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
1376a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1377a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1378a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
13796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1380a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1381a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
13826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1383a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1384a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1385a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
13866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
1387a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
13880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
13890ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
13900ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1391a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1392a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1393f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1394a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1395a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1396a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
13978c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1398a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
13998c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1400810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1401810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1402f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1403f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1404f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1405a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
14068de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
14078de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
14088de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
14098de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
14118de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
14120ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
14130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
14148de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
14158de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1416aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
14176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
14186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1419427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1420a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1421427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1422a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1423a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1424a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1425427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1426a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1427427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1428427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
1429a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
1430a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1431a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1432567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1433567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
14346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
14356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1436a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1437a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
14386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
14396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
14406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
14426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
14436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
14446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
14456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1447567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->ReadPointerFromMemory (addr, read_error);
14486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
14506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
14526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
14566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
14576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
14596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
14606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
146147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
146247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
146347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
146447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
146547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
146647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
146747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
14686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
14716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
14736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1476b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
14796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
148297678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
148397678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
14846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
14866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
14896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
14910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
14926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
1493567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
14946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
14966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14990ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
15000ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
15010ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
15020ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
15030ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
15040ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
15050ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
15060ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
15070ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
15080ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
15090ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
15100ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
15110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
15120ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
15136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
15146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
15176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
15186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
15206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
15216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
15226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
15236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
15246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1525567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error deallocate_error = process->DeallocateMemory(mem);
15266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
15286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
15296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
15306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
15316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
15326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
15336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
15356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1536a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
15376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1538a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1539a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1540a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1541a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1542a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
15446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
15456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
15476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
15496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
15516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1552567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->AllocateMemory(pvar_byte_size,
15536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
15546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  allocate_error);
15556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
15576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
15596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
15646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
15666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
156747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
156847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
156947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
157047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
157147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
157247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
157347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
15746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
15766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
15786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
15796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
15816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1582567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
15836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
15856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
15886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
15906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
15916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
15936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1594567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!process->WriteScalarToMemory (addr,
1595c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       var_sp->m_live_sp->GetValue().GetScalar(),
1596567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                       process->GetAddressByteSize(),
1597c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       write_error))
15986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1604c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
16056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1606696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1607a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
16086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1609a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1610a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1611a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1612a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1613a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1614a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1615a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1616f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
16178de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
16188de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
16198de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
16208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
16218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
16226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
16238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
16248de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
16258de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1626f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1627e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1628567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1629567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1630567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1631567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
16326d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
1633cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
1634cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
16356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
16366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
16386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
16396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1640567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, name, &type);
16410eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan
16420eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    ModuleSP module;
16430eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan
16440eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    Symbol *sym = FindGlobalDataSymbol(*target, module, name, NULL);
1645f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1646819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
1647819749647b1605f75753f625050cb240292c08b0Sean Callanan
1648819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1649819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1650819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(GetVariableValue(exe_ctx,
1651819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              var,
1652819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1653819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1654819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
1655ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    {
1656819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(new Value);
1657819749647b1605f75753f625050cb240292c08b0Sean Callanan
1658567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        addr_t location_load_addr = GetSymbolAddress(*target, name);
1659819749647b1605f75753f625050cb240292c08b0Sean Callanan
1660cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1661819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1662819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1663c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1664c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1665819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1666819749647b1605f75753f625050cb240292c08b0Sean Callanan
1667819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1668819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1669819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1670819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1671f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1672c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1673c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1674f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1675f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1676f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1677841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1678fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1679fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1680fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1681fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1682fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1683fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1684fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1685c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1686c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1687c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1688c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1689fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1690f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1691f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1692f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
16938de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1694f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1695f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
169617c6a05cb96f7110332342326a90692d9505982eSean Callanan
169717c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1698f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
16996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
17006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
170117c6a05cb96f7110332342326a90692d9505982eSean Callanan
170217c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
170317c6a05cb96f7110332342326a90692d9505982eSean Callanan
170417c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1705f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
170617c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1707f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
170817c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
170917c6a05cb96f7110332342326a90692d9505982eSean Callanan
171017c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
171117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1712c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1713c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1714c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
171517c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1716f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
171717c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
171817c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1719f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
17206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
172117c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1722c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
17236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1724567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
1725c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           location_value->GetScalar(),
1726567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                           process->GetAddressByteSize(),
1727c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
17286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1729c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1730c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1731c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
17326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
173417c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1735f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
173617c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
173717c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1738f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
17396916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
174017c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
174117c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
174217c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
174317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1744c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1745c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1746c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
174717c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
174817c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
174917c6a05cb96f7110332342326a90692d9505982eSean Callanan
1750061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
175117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1752061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
175317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1754c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1755c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
175617c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
175717c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
175817c6a05cb96f7110332342326a90692d9505982eSean Callanan
1759061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1760061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1761061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1762061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1763061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
176417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1765c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1766c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1767c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
176817c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
176917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
177017c6a05cb96f7110332342326a90692d9505982eSean Callanan
1771061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
177217c6a05cb96f7110332342326a90692d9505982eSean Callanan
177317c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
177417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
17756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
17766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
17786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1783b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
17846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
17866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1789c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
179017c6a05cb96f7110332342326a90692d9505982eSean Callanan
1791c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1792c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
1793c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
1794c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
1795061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
179617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
1797061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1798061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
179917c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1800c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1801c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1802c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
180317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
180417c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
18056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
18076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1808567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
18096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
18116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1812c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1813c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1814c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
18156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
181917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
182017c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
182117c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
18236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
18246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
18266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1827567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Scalar reg_addr (process->AllocateMemory (value_byte_size,
1828c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1829c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  allocate_error));
18306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1831c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
18326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1833c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1834c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1835c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
18366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
18406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
184147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
184247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
184347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
184447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
1845c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
184647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
184747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
18486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
18506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error write_error;
1852c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
1853567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
1854c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr,
1855567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                           process->GetAddressByteSize(),
1856c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
18576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1858c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1859c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1860c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
18616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
186517c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1866c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
1867c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1868c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
186917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
187017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
1871061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1872061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                RegisterValue reg_value;
1873061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1874061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
187517c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1876c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1877c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1878c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
187917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
188017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
188117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1882c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1883c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
1884c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
1885c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
1886061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
188717c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
188817c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1889f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1890f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1891f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1892f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1893810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
1894810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
18951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
18961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
18971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
18981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
18991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
19001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
1901b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
19021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
19031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
19041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
19051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
19061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
1907061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
19081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
19091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
1910061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1911061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
19121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1913bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
19141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
19151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1917061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
19181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1919061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
19201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
19211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
19231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
19241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
19251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1926061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
19271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1928061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
19291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
19301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1932061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1933061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
19341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
193595b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
19361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
19371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
19391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
19411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
19421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1943696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
19448de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
19458de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
19468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
19478de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
19488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
19498de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1950aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1951e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1952cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1953f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    ValueObjectSP valobj;
1954f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    VariableSP var_sp;
1955f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    Error err;
1956f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan
1957f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
1958f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     eNoDynamicValues,
1959f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     StackFrame::eExpressionPathOptionCheckPtrVsMember,
1960f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     var_sp,
1961f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     err);
19623bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1963f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    if (!err.Success() ||
1964f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan        !var_sp ||
1965ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
1966ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
1967ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
19683bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
19693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
19703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
19713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
19723bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
197304c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
1974696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                return lldb::VariableSP();
19753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
19763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
19773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
19783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
19793bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
1980696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan            return lldb::VariableSP();
19813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
19823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
19833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1984696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return var_sp;
1985cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
1986336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1987819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
1988819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
1989819749647b1605f75753f625050cb240292c08b0Sean Callanan(
1990819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
19910eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    ModuleSP &module,
19920eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    const ConstString &name,
19930eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    ClangNamespaceDecl *namespace_decl
1994819749647b1605f75753f625050cb240292c08b0Sean Callanan)
1995819749647b1605f75753f625050cb240292c08b0Sean Callanan{
1996819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
1997819749647b1605f75753f625050cb240292c08b0Sean Callanan
19980eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    if (module && namespace_decl)
19990eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan        module->FindSymbolsWithNameAndType(name,
20000eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                           namespace_decl,
20010eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                           eSymbolTypeData,
20020eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                           sc_list);
20030eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan    else
20040eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan        target.GetImages().FindSymbolsWithNameAndType(name,
20050eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                                      eSymbolTypeData,
20060eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan                                                      sc_list);
2007819749647b1605f75753f625050cb240292c08b0Sean Callanan
2008819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
2009819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2010819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
2011819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
2012819749647b1605f75753f625050cb240292c08b0Sean Callanan
2013819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
2014819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2015819749647b1605f75753f625050cb240292c08b0Sean Callanan
2016819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
2017819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2018819749647b1605f75753f625050cb240292c08b0Sean Callanan
201947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// This is a callback used with Variable::GetValuesForVariableExpressionPath
202047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
202147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic uint32_t GetVariableCallback (void *baton,
202247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const char *name,
202347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     VariableList &variable_list)
202447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
202547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target *target = static_cast<Target *>(baton);
202647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (target)
202747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
202847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return target->GetImages().FindGlobalVariables (ConstString(name),
202947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                        true,
203047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                        UINT32_MAX,
203147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                        variable_list);
203247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
203347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return 0;
203447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
203547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
203647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
203747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
203847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
203947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
204094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
204194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
204294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
204347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
204447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
204547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
204647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
204747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ValueObjectList valobjs;
204847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
204994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
205094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
205194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
205294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
205347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
205447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
205547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
205647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
205747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
205847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
205947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
206047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
206147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
206247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
206347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                {
206447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
206547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        return var_sp;
206647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                }
206747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
206847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
206947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
207047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
207147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
207247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
207347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
207447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
207547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
207647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
207747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
207824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
207947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
208016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
208116b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name)
208224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2083e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
208424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2085aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_ignore_lookups)
2086ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
2087ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
2088ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
2089ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
2090ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
2091e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
209216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
209316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
209416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
209516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalVisibleDecls for '%s' in a NULL DeclContext", name.GetCString());
209616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
209716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalVisibleDecls for '%s' in '%s'", name.GetCString(), context_named_decl->getNameAsString().c_str());
209816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
209916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalVisibleDecls for '%s' in a '%s'", name.GetCString(), context.m_decl_context->getDeclKindName());
210016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
210116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
210216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
210316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
210416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->m_ast_importer->GetNamespaceMap(namespace_context);
210516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
210616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
210716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
210816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
210916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
211016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
211116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                log->Printf("  Searching namespace '%s' in file '%s'",
211216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
211316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
211416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
211516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            //FindExternalVisibleDecls(context,
211616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            //                         i->first,
211716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            //                         i->second,
211816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            //                         name);
211916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
212016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
212116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else if (!isa<TranslationUnitDecl>(context.m_decl_context))
212216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
212316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        // we shouldn't be getting FindExternalVisibleDecls calls for these
212416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return;
212516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
212616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else
212716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
212816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
212916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
213016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
213194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            log->Printf("  Searching the root namespace");
213216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
213316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
213416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
213516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
213616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 name);
213716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
213816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
213916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
214016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
214116b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
214238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                                  lldb::ModuleSP module_sp,
214303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
214416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                                  const ConstString &name)
214516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
214616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    assert (m_struct_vars.get());
214716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    assert (m_parser_vars.get());
214816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
214916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2150e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2151e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
215224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21533bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
21543bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21553bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
21563bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
21573bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
21598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
2160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
216203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
21633cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
216457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
216547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
216657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
216757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
216857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
216957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2170567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
217147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
217247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2173567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
217457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
217557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
217657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
217757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
217857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
217957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
218075a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!this_var ||
2181567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->IsInScope(frame) ||
2182567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->LocationIsValidForFrame (frame))
218357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
218457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
218557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
218657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
218757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
218857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
218957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
21902403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            if (log)
21912403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
21922403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString ("Type for \"this\" is: ");
21932403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
21942403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
21952403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
21962403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
219703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
219804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser this_user_type(this_type->GetClangFullType(),
219957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
220057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2201aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
220257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
220358baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
220457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
220557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
220657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
220757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
220857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2209c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2210c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2211c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            if (pointer_target_qual_type.isConstQualified())
2212c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                pointer_target_qual_type.removeLocalConst();
2213c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2214c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
221557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
221603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22173aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
22183aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
22193aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
22203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
22213aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
22223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
22233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
22243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
222557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            AddOneType(context, class_user_type, true);
222657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
222757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
222857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
222957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
22303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
22313aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
22323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
22333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
22343aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2235567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
223647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
223747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2238567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
223903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
22413aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
224203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
224403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
224575a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!self_var ||
2246567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->IsInScope(frame) ||
2247567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->LocationIsValidForFrame (frame))
22483aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
224903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22503aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
22513aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22523aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
22533aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
225403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
225504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser self_user_type(self_type->GetClangFullType(),
22563aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
22573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22583aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
225903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
226058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
226103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22623aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
226327a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham                                                &pointer_target_type)
226419c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton                || pointer_target_type == NULL)
22653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
226603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
22683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
22693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
22713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
22723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
22733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
22743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
22753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
22763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
22773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            AddOneType(context, class_user_type, false);
22793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22803aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
22813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
2282c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
2283c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
2284c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2285c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
228603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
22882431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
2289567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
22902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2292567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
22932431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
22952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22972431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
22982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22992431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
23002431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
230303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
23052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
23082431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
23102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23112431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
23132431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23142431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
23152431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23162431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23172431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
23182431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                log->Printf("Found persistent type %s", name.GetCString());
23192431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23202431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
23212431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
23222431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
232403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2325427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
23261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            AddOneVariable(context, pvar_sp);
23281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
23291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
23301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
23311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
23321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2333aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
23341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2335b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
23361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
23371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
23381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                AddOneRegister(context, reg_info);
23391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
23408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
234103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
234203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
234303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
234403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
234503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
234603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
234703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
234803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
234903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
235003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
235103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember,
235203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
235303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
235403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
235503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
235603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (err.Success() && var != NULL)
235703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
235803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                AddOneVariable(context, var);
235916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
236003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
236103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
236203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        else if (target)
236303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
236494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
236538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                      module_sp,
236694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
236794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
236803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
236903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
237003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
237103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
237203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                AddOneVariable(context, var);
237316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
237403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
237503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
237603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
237716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan        if (!context.m_found.variable)
237803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
237903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool include_symbols = true;
238003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
2381a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
238238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            if (namespace_decl && module_sp)
2383a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
238438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                module_sp->FindFunctions(name,
238538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         &namespace_decl,
238638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         eFunctionNameTypeBase,
238738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         include_symbols,
238838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         append,
238938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         sc_list);
2390a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2391a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            else
2392a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
2393a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
2394a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  eFunctionNameTypeBase,
2395a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
2396a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
2397a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
2398a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2399a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
240003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
240103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
240203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
240303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
240403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
240503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
240603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
240703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
240803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
240903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
241003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
241103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
241203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
241303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
241403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
241503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // overloaded
241616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        if (!context.m_found.function_with_type_info)
241703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            AddOneFunction(context, sym_ctx.function, NULL);
241816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function_with_type_info = true;
241916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
242003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
242103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
242203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
242303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
242403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
242503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
242603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
242703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
242803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
242903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
243016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                if (!context.m_found.function_with_type_info)
243103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
243203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
243303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
243403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        AddOneFunction (context, NULL, generic_symbol);
243516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
243603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
243703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
243803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
243903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        AddOneFunction (context, NULL, non_extern_symbol);
244016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
244103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
244203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
244303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
244403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
244516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan            if (!context.m_found.variable)
244603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
244716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
244803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
244903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
245038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                Symbol *data_symbol = FindGlobalDataSymbol(*target, module_sp, name, &namespace_decl);
245103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
245203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
245303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
245403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    AddOneGenericVariable(context, *data_symbol);
245516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                    context.m_found.variable = true;
245603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
245703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
245803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
245903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
246003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages();
246103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
246203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ClangASTImporter::NamespaceMapSP namespace_decls(new ClangASTImporter::NamespaceMap);
246303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
246403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        for (uint32_t i = 0, e = images.GetSize();
246503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan             i != e;
246603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan             ++i)
246703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
246803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            ModuleSP image = images.GetModuleAtIndex(i);
246903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (!image)
247103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                continue;
247203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            ClangNamespaceDecl namespace_decl;
247403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            SymbolVendor *symbol_vendor = image->GetSymbolVendor();
247603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (!symbol_vendor)
247803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                continue;
247903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
248003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            SymbolContext null_sc;
248103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
248203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            namespace_decl = symbol_vendor->FindNamespace(null_sc, name);
248303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
248403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (namespace_decl)
248503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
248603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                (*namespace_decls)[image] = namespace_decl;
248703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
248803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (log)
248903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
249003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    std::string s;
249103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    llvm::raw_string_ostream os(s);
249203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    namespace_decl.GetNamespaceDecl()->print(os);
249303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    os.flush();
249403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
249503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    log->Printf("Found namespace %s in file %s", s.c_str(), image->GetFileSpec().GetFilename().GetCString());
249603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
249703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
249803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
250003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (!namespace_decls->empty())
250103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
250203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decls);
250303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
250403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (clang_namespace_decl)
250503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                clang_namespace_decl->setHasExternalVisibleStorage();
250603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
250703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    }
2508a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
250938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    TypeList types;
251038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    SymbolContext null_sc;
251138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
251238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    if (module_sp && namespace_decl)
251338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        module_sp->FindTypes(null_sc, name, &namespace_decl, true, 1, types);
251438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    else
251538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        target->GetImages().FindTypes (null_sc, name, true, 1, types);
251638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
251738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    if (types.GetSize())
2518ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
251938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        TypeSP type_sp = types.GetTypeAtIndex(0);
252038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
2521ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
25226df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
252338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            log->Printf("Matching type found for \"%s\": ", name.GetCString());
2524ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            StreamString strm;
2525ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            type_sp->Dump(&strm, true);
2526ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->PutCString (strm.GetData());
2527ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        }
25282403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
252938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        TypeFromUser user_type(type_sp->GetClangFullType(),
253038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                               type_sp->GetClangAST());
25316df0840c87be29724055716db951aa6d494ddabcSean Callanan
2532ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        AddOneType(context, user_type, false);
25336df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
253424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2535e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananclang::ExternalLoadResult
25379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context,
25389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  bool (*predicate)(Decl::Kind),
25399b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  llvm::SmallVectorImpl<Decl*> &decls)
2540e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{
25419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
25429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2543e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
25449b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25459b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const Decl *context_decl = dyn_cast<Decl>(decl_context);
25469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25479b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!context_decl)
25489b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25499b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25509b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast_context = &context_decl->getASTContext();
25519b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25529b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (log)
255316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
255416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
255516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalLexicalDecls in '%s' (a %s) with %s predicate",
255616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_named_decl->getNameAsString().c_str(),
255716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_decl->getDeclKindName(),
255816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
255916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if(context_decl)
256016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalLexicalDecls in a %s with %s predicate",
256116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_decl->getDeclKindName(),
256216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
256316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
256416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            log->Printf("FindExternalLexicalDecls in a NULL context with %s predicate",
256516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
256616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
25679b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25689b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *original_decl = NULL;
25699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *original_ctx = NULL;
25709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context);
25729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer)
25749b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
25779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2579e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (log)
2580e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
25819b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        std::string decl_print_string;
25829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        llvm::raw_string_ostream decl_print_stream(decl_print_string);
25839b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        original_decl->print(decl_print_stream);
25849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        decl_print_stream.flush();
25859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        log->Printf("Original decl:\n%s", decl_print_string.c_str());
25869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    }
25879b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
25899b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    {
25909b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        ExternalASTSource *external_source = original_ctx->getExternalSource();
2591336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2592c613971c0016484053b60db95d01648a3f6ea849Sean Callanan        if (external_source)
2593c613971c0016484053b60db95d01648a3f6ea849Sean Callanan            external_source->CompleteType (original_tag_decl);
2594e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2595e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25969b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
2597e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!original_decl_context)
25999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
2600e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
26029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         iter != original_decl_context->decls_end();
26039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         ++iter)
2604e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
26059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        Decl *decl = *iter;
2606e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!predicate || predicate(decl->getKind()))
2608e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
26099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            if (log)
26109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            {
26119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                std::string decl_print_string;
26129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                llvm::raw_string_ostream decl_print_stream(decl_print_string);
26139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                decl->print(decl_print_stream);
26149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                decl_print_stream.flush();
26159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                log->Printf("  Adding lexical decl %s", decl_print_string.c_str());
26169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            }
26179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl);
2619e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            decls.push_back(copied_decl);
2621e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
2622e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2623e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return ELR_AlreadyLoaded;
26259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
26269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
26289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
26299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
26309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
26319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl);
26339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
26349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
26369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
26379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
26389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
26399b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl);
2641e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton}
2642e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2643336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
26448de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
26458de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
26468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
2647696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP var,
26489b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
26498de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
26508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
26518de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2653e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
26546184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2659810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2660810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
2661336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
266404c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2668810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2669810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
2670336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
267124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2675b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2677810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2678810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
2679336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2682336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
2683336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2686178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2687178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
2688567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
2689567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2690178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
2691178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
2692178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
2693178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
2694567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
2695178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2698bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2700810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2701810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
2702336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
270324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2704b01000fd063629facd45044f137446fb748ee179Greg Clayton
270558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
2706336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2707f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
2708f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
2709b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
2710f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
27114b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
27124b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
27134b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
27144b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
27154b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
27164b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
27174b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
27184b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
2719f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
2720f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2721f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2722336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
2723336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
27266916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
2732336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
2734336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
273624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
2739336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
2740336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2743567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
274547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
274647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
274747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->GetScalar() = load_addr;
274847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->SetValueType(Value::eValueTypeLoadAddress);
274947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2752f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
2753b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
2754336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2755336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
2756336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
2757336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2758336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
2759696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var)
2760336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
2761aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2762aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2763e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
276447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2765f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
2766f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
2767336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2768aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
27698de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
27708de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
27718de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
27728de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
2773336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
27744b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
27754b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
27764b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
27776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
27788de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2779427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
2780fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2781fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      entity_name,
2782427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      ut,
278347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
278447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2785427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2786427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2787427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2788427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2789427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2790427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2791696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
279224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2793810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
27948de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2795a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2796a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2797a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2798a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2799a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2800a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
28016e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan
28029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //if (log->GetVerbose())
28039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //{
28049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    StreamString var_decl_dump_string;
28059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
28069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    log->Printf("%s\n", var_decl_dump_string.GetData());
28079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //}
28088de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
28098f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
28108f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
28118f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
2812a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
2813427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                       ClangExpressionVariableSP &pvar_sp)
2814a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
2815e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
281645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
2818a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2820427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
2821427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
2822427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
2823a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
28246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
28258c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2826427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
2827427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
2828427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
2829427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
2830427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
283145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
283245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
2833a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
2834a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2835a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2836a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2837a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2838a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2839427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
2840a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
2841a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
2842a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
28431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
2844819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
2845819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              Symbol &symbol)
2846819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2847819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
2848819749647b1605f75753f625050cb240292c08b0Sean Callanan
2849819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2850819749647b1605f75753f625050cb240292c08b0Sean Callanan
2851567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2852567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2853567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
2854567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
2855567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2856567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2857819749647b1605f75753f625050cb240292c08b0Sean Callanan
2858fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
2859819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
2860819749647b1605f75753f625050cb240292c08b0Sean Callanan
2861fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
2862819749647b1605f75753f625050cb240292c08b0Sean Callanan                                context.GetASTContext());
2863819749647b1605f75753f625050cb240292c08b0Sean Callanan
2864fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2865819749647b1605f75753f625050cb240292c08b0Sean Callanan
2866819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2867819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
2868819749647b1605f75753f625050cb240292c08b0Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2869819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
2870819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
287147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
287247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2873819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
2874819749647b1605f75753f625050cb240292c08b0Sean Callanan
2875819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
2876819749647b1605f75753f625050cb240292c08b0Sean Callanan
2877819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddressRange &symbol_range = symbol.GetAddressRangeRef();
2878819749647b1605f75753f625050cb240292c08b0Sean Callanan    Address &symbol_address = symbol_range.GetBaseAddress();
2879567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
2880819749647b1605f75753f625050cb240292c08b0Sean Callanan
2881819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2882819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
2883819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2884819749647b1605f75753f625050cb240292c08b0Sean Callanan
2885fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    entity->EnableParserVars();
2886819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
2887819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
2888819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
2889819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
2890819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
2891fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //entity->m_flags                      |= ClangExpressionVariable::EVUnknownType;
2892819749647b1605f75753f625050cb240292c08b0Sean Callanan
2893819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
2894819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2895819749647b1605f75753f625050cb240292c08b0Sean Callanan        std::string var_decl_print_string;
2896819749647b1605f75753f625050cb240292c08b0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2897819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl->print(var_decl_print_stream);
2898819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl_print_stream.flush();
2899819749647b1605f75753f625050cb240292c08b0Sean Callanan
2900819749647b1605f75753f625050cb240292c08b0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
2901819749647b1605f75753f625050cb240292c08b0Sean Callanan
29029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //if (log->GetVerbose())
29039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //{
29049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    StreamString var_decl_dump_string;
29059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
29069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    log->Printf("%s\n", var_decl_dump_string.GetData());
29079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //}
2908819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2909819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2910819749647b1605f75753f625050cb240292c08b0Sean Callanan
2911fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
2912fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
2913fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
2914fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2915567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2917567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2918fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2919fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
2920fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
2921fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
2922fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
2923fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2924fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2925fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2926fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
2927fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2928fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2929fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2930fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
2931fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2932fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
2933fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
2934fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
2935fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2936fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2937fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
2938fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2939fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                std::string var_decl_print_string;
2940fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2941fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                var_decl->print(var_decl_print_stream);
2942fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                var_decl_print_stream.flush();
2943fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2944fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str());
2945fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2946fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2947fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
2948fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2949fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2950fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2951fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2952fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
2953fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2954fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2955fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_parser_type = parser_type;
2956fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2957fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
2958fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
2959fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2960fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2961fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
2962fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
2963fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2964fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
2965fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
2966fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2967819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
2968427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
2969427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        const RegisterInfo *reg_info)
29701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
29711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
29721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
29741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
29751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
29761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
29781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2979122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
2980122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen            log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
29811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
29821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
29831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2984427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
2985427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
29861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
29881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2989fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
299047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
299147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2992427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
29931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2997427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
2998427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2999427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3000427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
30011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
30021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (log)
30031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
30041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        std::string var_decl_print_string;
30051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
30061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl->print(var_decl_print_stream);
30071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl_print_stream.flush();
30081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
30091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
30101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
30111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
30121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
30139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananNamespaceDecl *
301416b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls)
30156916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
301616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (namespace_decls.empty())
301716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return NULL;
301816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
30206916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
3021e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    assert (m_parser_vars.get());
3022e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
302316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second;
302416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
302616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                                                                         namespace_decl.GetNamespaceDecl());
302716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
302816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl);
302916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
303016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
303116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return dyn_cast<NamespaceDecl>(copied_decl);
30336916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
30346916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
3035a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
3036da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3037da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
3038da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Symbol* symbol)
30398f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
3040aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3041aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3042e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
30438f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
304458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
30450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
304658baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
30478f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
30490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
30509b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
30518f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
30530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
30550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30560fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
30570fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
30590fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no type");
30600fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
306304c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
30640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
30660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
30680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no Clang type");
30690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
30730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
3074b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
3075ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
30760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
30780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
30800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
30820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30830fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
30840fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30850fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
30868f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
3087810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
30880fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            log->PutCString("AddOneFunction called with no function and no symbol");
30898f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
30908f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
30918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3092567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3093567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3094567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
30958f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
30968f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
30978f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3098fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
309947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
310047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
31028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
3103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
3104427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
3105427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
3106427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3107427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
3108427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
3109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3110427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
31118c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3112810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
31138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3114a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string fun_decl_print_string;
3115a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
3116a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl->print(fun_decl_print_stream);
3117a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl_print_stream.flush();
3118a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
3119a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
31208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
312124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
312293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
312393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
312493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
31253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
31263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
312793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
31289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context = context.GetASTContext();
31299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
31303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3131ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
31323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
313493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
31353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
31363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
31373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
31383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
31403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
31423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
31433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
31443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
31453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
31463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
314730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31481d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
31491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
31501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
315130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
315230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
31541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
31558de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
31561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
31571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
31581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
31591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
316030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
316130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
31623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
316393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
316493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
316593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
3166ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3167ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid *
3168ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
3169ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         ASTContext *source_context,
3170ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         void *clang_type)
3171ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{
3172aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3173aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = true;
3175ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3176e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context);
3177e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
3178e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    QualType ret_qual_type = importer->CopyType (source_context,
3179e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                                 QualType::getFromOpaquePtr(clang_type));
3180e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
3181e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    void *ret = ret_qual_type.getAsOpaquePtr();
3182ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3183aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = false;
3184ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3185ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    return ret;
3186ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan}
3187