ClangExpressionDeclMap.cpp revision 1c38d10238fe7edc342a10799acc65f8f5dceb90
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"
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
473bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5173b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
5273b520f4f60dca58e58e446c9504d45384ee677bSean Callanan    ClangASTSource (exe_ctx.GetTargetSP()),
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,
354557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                                                bool transient,
355557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                                                bool maybe_make_load)
35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!pvar_sp)
36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
363557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
364557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    if (maybe_make_load &&
365557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        value.GetValueType() == Value::eValueTypeFileAddress &&
366557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        m_parser_vars->m_exe_ctx &&
367557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        m_parser_vars->m_exe_ctx->GetProcessPtr())
368557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    {
369557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        value.SetValueType(Value::eValueTypeLoadAddress);
370557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    }
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
373a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !pvar_sp->m_live_sp &&
374a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !transient)
37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        // The reference comes from the program.  We need to set up a live SP for it.
37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetASTContext(),
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetName(),
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetScalar().ULongLong(),
38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetValueAddressType(),
38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetByteSize());
38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->ValueUpdated();
39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const size_t pvar_byte_size = pvar_sp->GetByteSize();
39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        uint8_t *pvar_data = pvar_sp->GetValueBytes();
39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!ReadTarget(pvar_data, value, pvar_byte_size))
39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
39847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
39947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
40047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    valobj = pvar_sp;
40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return true;
40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
4058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
4068de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
4078de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4098de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
4116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
4126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
4138de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
414a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
415aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
416aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
4176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
418fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
419567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
420567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
421567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
422567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
423567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
424567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
425567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
426a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
427a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
42882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
42982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
43097678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
43147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
43247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
43347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
434a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
435fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
436fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
437427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
43847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
43947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
4408c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4418c12720c108cd5e7ed792596749218d8400f647eSean Callanan
442427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
4438c12720c108cd5e7ed792596749218d8400f647eSean Callanan
444427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4458c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4468c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
4516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
4536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
4556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
4596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
4606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
4636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
4646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
465427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
4668c12720c108cd5e7ed792596749218d8400f647eSean Callanan
467427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
468427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
4698c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
471a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
472a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
473a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
4748de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
4758de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4788de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
4798de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
4808de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
4818de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
483aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
484aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
485aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
486e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
48745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
488aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
4898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
4918c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
4928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
493427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
4948c12720c108cd5e7ed792596749218d8400f647eSean Callanan
495427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
496427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
4978c12720c108cd5e7ed792596749218d8400f647eSean Callanan
498427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4998c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
5008c12720c108cd5e7ed792596749218d8400f647eSean Callanan
50145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
50245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
50345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
5048de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
505427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
50645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
5078c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
5088c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
509427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
5108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
511427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
512427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
513427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
5148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
515427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
5168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
5228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
523aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
525aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
5268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
5278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
5298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
530aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
531aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
5328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
533427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
5348c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
5368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
539427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
540427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
5428c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5448c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
545427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
5468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
547427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
548427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
5498c12720c108cd5e7ed792596749218d8400f647eSean Callanan
550427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
551427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
5528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
5538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
554aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
5558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
556aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5608de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
5618de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5628de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
5638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
5648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
5658de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
567aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
568aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
569aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
572427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
573aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
574aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
5758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5808de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
5818de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
5838de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
5848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
5858de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
5868de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
5878de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
589aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
590aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
591aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
594427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
5958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
597427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
5988c12720c108cd5e7ed792596749218d8400f647eSean Callanan
599427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
600427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
601427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_jit_vars.get())
6028c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
6038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
604427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
605427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
606427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
607427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
6088c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
61202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
6138de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
6148de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
6168de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
6178de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
618ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
619427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
6208c12720c108cd5e7ed792596749218d8400f647eSean Callanan
621427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
6228c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
623ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
6248c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
6258c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
626ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
627427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
6288c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6298c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
630ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
631ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
632ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
633ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
634ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
635ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
636ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
637ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
638ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
639ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
640ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
641aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan       sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
642ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
643ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (!sc_list.GetSize())
644ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
645ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
646ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
647f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
6488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
6498de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
651da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
6528de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
653f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
654aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
655aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
656aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
657567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
658567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
659567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
660567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
661f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
662567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
66378b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
66478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
665f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
666f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
667e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
668f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
669ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
670ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
671e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
672aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
673aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
674aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
675aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
6760eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan        if (!strncmp(name.GetCString(), "_ZN", 3) &&
6770eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            strncmp(name.GetCString(), "_ZNK", 4))
678aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
6790eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            std::string fixed_scratch("_ZNK");
6800eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            fixed_scratch.append(name.GetCString() + 3);
6810eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            ConstString fixed_name(fixed_scratch.c_str());
682aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
683aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
6840eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan                log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
6850eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan
6860eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
687aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
688aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
689aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
690aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
691f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
692f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
693f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
694e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
696da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
697f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
698f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
699da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
700f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
701da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
702f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
703f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
704f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
705ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
706ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
707ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
708567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (target);
709da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
710f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
711f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
712f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
713cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
714cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
715c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
716c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
717c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
718819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
719c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
720cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
721cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
722cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
723cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
724cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
725cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
726cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
727c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
728cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
729ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
730ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
731ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
732ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
733cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
734cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
735cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
736cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
737cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
738cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
739cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
740cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
741cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
742cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
743cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
744cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
745cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
746cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
748cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
749cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeExtern:
750cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
752cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
753cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
757cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
765cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
766cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
768cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
769cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
770c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
771cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
772c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
773c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
774cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
775cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
776819749647b1605f75753f625050cb240292c08b0Sean Callanan{
777819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
778819749647b1605f75753f625050cb240292c08b0Sean Callanan
779819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (!m_parser_vars->m_exe_ctx ||
780567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        !m_parser_vars->m_exe_ctx->GetTargetPtr())
781819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
782819749647b1605f75753f625050cb240292c08b0Sean Callanan
783567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name);
784819749647b1605f75753f625050cb240292c08b0Sean Callanan}
785819749647b1605f75753f625050cb240292c08b0Sean Callanan
78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter
78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
788557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue
789557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
790557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{
791557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    Value ret;
792557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
793557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ret.SetContext(Value::eContextTypeInvalid, NULL);
794557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
795557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    if (m_parser_vars->m_exe_ctx && m_parser_vars->m_exe_ctx->GetProcessPtr())
796557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        ret.SetValueType(Value::eValueTypeLoadAddress);
797557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    else
798557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        ret.SetValueType(Value::eValueTypeFileAddress);
799557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
800557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ret.GetScalar() = (unsigned long long)addr;
801557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
802557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    return ret;
803557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan}
804557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const uint8_t *data,
80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     size_t length)
80947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
81047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
814567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
817567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
81847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
82347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
82447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
829567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return reg_ctx->WriteRegister(reg_info, reg_value);
83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        default:
83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeFileAddress:
84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
842567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
845567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
848567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
851567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
854567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory(load_addr, data, length, err);
85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeLoadAddress:
85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
860567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
864567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeHostAddress:
86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            memcpy ((void *)value.GetScalar().ULongLong(), data, length);
87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return true;
87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeScalar:
87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data,
87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    lldb_private::Value &value,
88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    size_t length)
88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
885567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
886567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
887567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
890567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx->ReadRegister(reg_info, reg_value))
90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
905567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            default:
91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeFileAddress:
91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
915567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (target == NULL)
91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
921567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
925567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                target->ReadMemory(file_addr, true, data, length, err);
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeLoadAddress:
93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
931567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
935567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeHostAddress:
94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                memcpy (data, (const void *)value.GetScalar().ULongLong(), length);
94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return true;
94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeScalar:
94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value
94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
9571c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (expr_var_sp)
95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
9604a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var)
9616d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan            return Value();
9626d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
9631c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
9641c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
9654b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        std::auto_ptr<Value> value(GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL));
9664b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
9671c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
9681c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        {
9691c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
9701c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
9711c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            if (!process)
9721c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan                return Value();
9731c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
9741c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            lldb::addr_t value_addr = value->GetScalar().ULongLong();
9751c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            Error read_error;
9761c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
9771c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
9781c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            if (!read_error.Success())
9791c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan                return Value();
9801c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
9811c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            value->GetScalar() = (unsigned long long)ref_value;
9821c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        }
9831c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
9844b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        if (value.get())
9854b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return *value;
9864b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        else
9874b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return Value();
98847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else if (persistent_var_sp)
99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
991a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
992a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan             persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
99386a07da76f615533a06a797dc4539566951b58d3Sean Callanan            persistent_var_sp->m_live_sp &&
99486a07da76f615533a06a797dc4539566951b58d3Sean Callanan            m_parser_vars->m_exe_ctx->GetProcessSP() &&
99586a07da76f615533a06a797dc4539566951b58d3Sean Callanan            m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive())
996a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
9974b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return persistent_var_sp->m_live_sp->GetValue();
998a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
999a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        else
1000a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
1001a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            lldb_private::Value ret;
1002a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetValueType(Value::eValueTypeHostAddress);
1003a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetContext(Value::eContextTypeInvalid, NULL);
1004a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1005a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return ret;
1006a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
100847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
101147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
101247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
101347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
10144b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue
10154b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
10164b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{
10174b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    assert(m_parser_vars.get());
10184b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!m_parser_vars->m_exe_ctx)
10204b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10214b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10224b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
10234b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10244b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!frame)
10254b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10264b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    VariableList *vars = frame->GetVariableList(false);
10284b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10294b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!vars)
10304b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10314b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10324b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    lldb::VariableSP var = vars->FindVariable(name);
10334b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10344b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!var ||
10354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        !var->IsInScope(frame) ||
10364b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        !var->LocationIsValidForFrame (frame))
10374b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    std::auto_ptr<Value> value(GetVariableValue(*m_parser_vars->m_exe_ctx, var, NULL));
10404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10414b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (value.get())
10424b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return *value;
10434b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    else
10444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10454b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan}
10464b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
1047810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
1048f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1049f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
10508de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
10518de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1052aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
10538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
10548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
10558de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1056f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1057aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
1058aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1059567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    m_material_vars->m_process = exe_ctx.GetProcessPtr();
1060aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
10610ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
10620ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                exe_ctx,
10630ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
10640ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
10650ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
10660ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
1067f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1068f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
1069aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
1070f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1071f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
1072f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1073f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1074f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
10758de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
10768de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
10778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
10783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
1079aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1080047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
1081047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
10828de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
10833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
1084aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1085aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1086567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1087567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1088567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1090567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL || process == NULL || target == NULL)
10913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
10933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1096aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
10973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
10993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
11003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP object_ptr_var = FindVariableInScope (*frame,
1103696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
1104696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
11053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
11073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
11083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
11093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
11103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
11133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
1114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
11153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
11173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
11183aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
11193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
11203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
112250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
11233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
112450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
112550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
112650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
112750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
11283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
112950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1130567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
113150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
113250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
113350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
113450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
113550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
113650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
113750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
113850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
113950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
1140567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
1141c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
114250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
114350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
114450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
1145c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
114650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
11473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
114850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
11493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
115050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
115150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
115250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
115350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
115450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
115550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
115650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
115750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
115850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1159061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
116050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1161061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
116250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
116350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
116450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
116550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
116650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1167061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
116850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1169061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
117050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
1171061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
117250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
117350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
117450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1175061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
117650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1177061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
117850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
117950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
11803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
11813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
11833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11843c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
11858de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
11868de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1188427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
11890ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
11900ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
11918de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11928de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1193f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
11940ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
1195aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1196aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
1197aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
1198aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1199aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
1200aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
1201aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1202aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
1203aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
1204aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1205aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
1206aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
1207aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1208aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
1209aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1210aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
1211aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1212aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
1213aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1214aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
1215aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
1216f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1217f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
121832824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
12198de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
12208de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1221aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
12238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12248de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
122532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
1226aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1227aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
1228aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1229aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
123032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
123132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
123232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
123332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
1234567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1235567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1236567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!process)
123732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
123832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
123932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
124032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
124132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1242567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1243567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!target)
124432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
124532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
124632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
124732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
124832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
12493371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
12503371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
12513371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
12523371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
12533371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
12543371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
1255c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
125632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
125732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
1258567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (process->ReadMemory (m_material_vars->m_materialized_location,
1259c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
1260c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
126132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
126232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
126332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
126432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
126532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1266567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
126732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1268427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1269427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
1270427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
127132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
1272427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
127332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1274427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
1275427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
1276427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1277427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
12788c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1279427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
12808c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
12818c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1282427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
1283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
1284427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
1285427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
1286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
1287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
1288427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
1289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
1290427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
129132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
129232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
129332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
129432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
129532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
129632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
129732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1298f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
13008de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
13018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
1302aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
13030ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
13040ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
1305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
13068de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
13078de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1308810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
1309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
1310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
1311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1312aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1313aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1314e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
131582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1316aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
1317810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1318810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
131957067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
1320810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1321810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1322567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1323567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame)
132445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
132545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
132657067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
132745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
1328567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
132945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
1330567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
1331aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1332aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
1333e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
1334e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
1335e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1336e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
13379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        m_material_vars->m_allocated_area = NULL;
1338e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1339e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
1340e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
1341e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1342567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
1343810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1344f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
1345f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1346567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx.GetProcessPtr();
1347aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1348f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
1349567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            process->DeallocateMemory(m_material_vars->m_materialized_location);
1350aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1351f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1352810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
13537a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
13547a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
13557a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
1356567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
1357aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1358aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
1359f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1360f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
1361f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
1362f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1363aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
1364f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1365810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1366aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
1367810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1368aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1369aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
1370810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1371427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
13728c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
13738c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1374810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1375427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
13764d0b110715d321d366dec1dc690300f713b63236Sean Callanan
1377a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
1378336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
1379a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
1380427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
13811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
13821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
13831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1384aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
13851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
13871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
1390427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
1391427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
1392427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
1393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1394427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
13981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
1399427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
14001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
14011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
1403427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
14056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
1406427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1407427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
14081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
14091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
14108c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1411a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
14128c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
1413a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
1414a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
1415a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
141645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
14176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1418a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
1419a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1420a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1421a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1423a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1424a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
14256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1426a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1427a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1428a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
14296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
1430a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
14310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
14320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
14330ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1434a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1435a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1436f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1437a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1438a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1439a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
14408c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1441a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
14428c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1443810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1444810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1445f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1446f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1447f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1448a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
14498de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
14508de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
14518de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
14528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1453427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
14548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
14550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
14560ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
14578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
14588de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1459aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
14606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
14616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1462427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1463a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1464427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1465a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1466a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1467a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1468427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1469a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1470427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1471427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
1472a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
1473a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1474a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1475567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1476567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1479a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1480a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
14816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
14826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
14836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
14856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
14866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1490567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->ReadPointerFromMemory (addr, read_error);
14916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
14936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
14956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
14996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
15006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
15026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
15036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
150447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
150547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
150647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
150747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
150847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
150947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
151047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
15116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
15146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
15166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1519b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
15206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
15226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
152597678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
152697678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
15276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
15296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
15316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
15326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
15340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
15356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
1536567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
15376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
15386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
15396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
15406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
15416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15420ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
15430ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
15440ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
15450ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
15460ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
15470ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
15480ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
15490ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
15500ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
15510ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
15520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
15530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
15540ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
15550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
15566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
15576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
15606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
15616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
15646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
15656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
15666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1568567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error deallocate_error = process->DeallocateMemory(mem);
15696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
15716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
15726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
15736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
15746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
15756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
15766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
15786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1579a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
15806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1581a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1582a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1583a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1584a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1585a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
15866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
15876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
15886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
15906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
15926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
15946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1595567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->AllocateMemory(pvar_byte_size,
15964b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                          lldb::ePermissionsReadable | lldb::ePermissionsWritable,
15974b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                          allocate_error);
15986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
16026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
16066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
16076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
16096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
161047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
161147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
161247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
161347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
161447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
161547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
161647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
16176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
16196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
16216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
16226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
16246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1625567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
16266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
16286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
16316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
16336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
16346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
16356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
16366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1637567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!process->WriteScalarToMemory (addr,
16384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               var_sp->m_live_sp->GetValue().GetScalar(),
16394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               process->GetAddressByteSize(),
16404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               write_error))
16416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
16436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1647c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
16486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1649696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1650a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
16516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1652a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1653a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1654a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1655a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1656a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1657a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1658a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1659f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
16608de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
16618de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
16628de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
16638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
16648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
16656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
16668de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
16678de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
16688de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1669f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1670e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1671567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1672567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1673567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1674567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
16756d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
1676cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
1677cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
16786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
16796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
16816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
16826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16834a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
16844a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
1685f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
16866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
16876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
1688819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
16894a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1690819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1691819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1692819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(GetVariableValue(exe_ctx,
1693819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              var,
1694819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1695819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1696819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
16974a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    {
1698567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        addr_t location_load_addr = GetSymbolAddress(*target, name);
1699819749647b1605f75753f625050cb240292c08b0Sean Callanan
1700cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1701819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1702819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1703c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1704c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1705819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1706819749647b1605f75753f625050cb240292c08b0Sean Callanan
17074a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        location_value.reset(new Value);
17084a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1709819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1710819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1711819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1712819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1713f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1714c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1715c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1716f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1717f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1718f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1719841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1720fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1721fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1722fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1723fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1724fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1725fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1726fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1727c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1728c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1729c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1730c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1731fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1732f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1733f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1734f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
17358de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1736f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1737f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
173817c6a05cb96f7110332342326a90692d9505982eSean Callanan
173917c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1740f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
174317c6a05cb96f7110332342326a90692d9505982eSean Callanan
174417c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
174517c6a05cb96f7110332342326a90692d9505982eSean Callanan
174617c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1747f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
174817c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1749f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
175017c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
175117c6a05cb96f7110332342326a90692d9505982eSean Callanan
175217c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
175317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1754c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1755c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1756c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
175717c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1758f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
175917c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
176017c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1761f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
17626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
176317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1764c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
17656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17666f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17686f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    Error read_error;
17696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
17706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
17716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
17726f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!read_error.Success())
17736f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
17746f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
17756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
17766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      read_error.AsCString());
17776f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
17786f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
17796f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
17806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!process->WritePointerToMemory(addr,
17816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       ref_value,
17826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       write_error))
17836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
17846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
17856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
17866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
17876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
17886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
17896f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
17906f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                else
17916f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
17926f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!process->WriteScalarToMemory (addr,
17936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       location_value->GetScalar(),
17946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       process->GetAddressByteSize(),
17956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       write_error))
17966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
17976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
17986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
17996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
18006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
18016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
18026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
180317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1804f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
180517c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
180617c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
18086916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
180917c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
181017c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
181117c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
181217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1813c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1814c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1815c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
181617c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
181717c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
181817c6a05cb96f7110332342326a90692d9505982eSean Callanan
1819061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
182017c6a05cb96f7110332342326a90692d9505982eSean Callanan
1821061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
182217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1823c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1824c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
182517c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
182617c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
182717c6a05cb96f7110332342326a90692d9505982eSean Callanan
1828061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1829061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1830061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1831061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1832061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
183317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1834c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1835c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1836c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
183717c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
183817c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
183917c6a05cb96f7110332342326a90692d9505982eSean Callanan
1840061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
184117c6a05cb96f7110332342326a90692d9505982eSean Callanan
184217c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
184317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
18446f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
18456f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return true; // reference types don't need demateralizing
18466f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
18476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
18486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
18506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
18516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
18526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1855b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
18566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
18576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
18586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1861c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
186217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1863c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1864c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
1865c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
1866c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
1867061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
186817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
1869061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1870061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
187117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1872c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1873c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1874c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
187517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
187617c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
18776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
18796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1880567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
18816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
18836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1884c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1885c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1886c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
18876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
189117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
189217c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
189317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
18946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                Error write_error;
18956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
18966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                RegisterValue reg_value;
18976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
18986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (!reg_ctx->ReadRegister (reg_info, reg_value))
18996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
19006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
19016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                  name.GetCString(),
19026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                  reg_info->name);
19036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return false;
19046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
19056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
19076f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
19086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
19096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      addr,
19106f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      process->GetAddressByteSize(),
19116f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      reg_value);
19126f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!write_error.Success())
19146f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
19156f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
19166f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
19176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      reg_info->name,
19186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
19196f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
19206f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
19216f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19226f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return true;
19236f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
19246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
19266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
19276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
19296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Scalar reg_addr (process->AllocateMemory (value_byte_size,
19316f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                          lldb::ePermissionsReadable | lldb::ePermissionsWritable,
19326f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                          allocate_error));
19336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1934c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
19356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1936c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1937c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1938c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
19396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
19406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
19416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
19436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
194447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
194547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
194647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
194747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
1948c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
194947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
195047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
19516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
19536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
1954567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
19556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   reg_addr,
19566f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   process->GetAddressByteSize(),
19576f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   write_error))
19586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1959c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1960c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1961c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
19626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
19636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
19646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
196617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1967c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
1968c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1969c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
197017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
197117c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
1972061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1973061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
197417c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1975c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1976c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1977c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
197817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
197917c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
198017c6a05cb96f7110332342326a90692d9505982eSean Callanan
1981c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1982c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
1983c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
1984c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
1985061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
198617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
198717c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1988f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1989f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1990f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1991f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1992810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
1993810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
19941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
19951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
19961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
19971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
19981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
19991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
2000b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
20011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
20021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
20031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
20041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
20051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
2006061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
20071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
20081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2009061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2010061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
20111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2012bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
20131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
20141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
20151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2016061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
20171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2018061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
20191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
20201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
20211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
20221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
20231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
20241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2025061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
20261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2027061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
20281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
20291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
20301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2031061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2032061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
20331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
203495b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
20351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
20361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
20371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
20381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
20391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
20401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
20411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2042696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
20438de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
20448de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
20458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
20468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
20478de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
20488de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2049aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
2050e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2051cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
2052f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    ValueObjectSP valobj;
2053f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    VariableSP var_sp;
2054f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    Error err;
2055f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan
2056f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2057f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     eNoDynamicValues,
2058f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     StackFrame::eExpressionPathOptionCheckPtrVsMember,
2059f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     var_sp,
2060f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     err);
20613bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
2062f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    if (!err.Success() ||
2063f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan        !var_sp ||
2064ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
2065ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
2066ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
20673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
20683bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
20693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
20703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
20713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
207204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2073696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                return lldb::VariableSP();
20743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
20753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
20763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
20773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
20783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
2079696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan            return lldb::VariableSP();
20803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
20813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
20823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
2083696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return var_sp;
2084cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
2085336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2086819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
2087819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
2088819749647b1605f75753f625050cb240292c08b0Sean Callanan(
2089819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
2090aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    const ConstString &name
2091819749647b1605f75753f625050cb240292c08b0Sean Callanan)
2092819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2093819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
2094819749647b1605f75753f625050cb240292c08b0Sean Callanan
2095aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name,
2096aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  eSymbolTypeData,
2097aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  sc_list);
2098819749647b1605f75753f625050cb240292c08b0Sean Callanan
2099819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
2100819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2101819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
2102819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
2103819749647b1605f75753f625050cb240292c08b0Sean Callanan
2104819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
2105819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2106819749647b1605f75753f625050cb240292c08b0Sean Callanan
2107819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
2108819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2109819749647b1605f75753f625050cb240292c08b0Sean Callanan
211047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
211147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
211247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
211347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
211494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
211594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
211694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
211747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
211847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
211947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
212047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
212147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
212294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
212394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
212494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
212594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
212647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
212747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
212847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
212947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
213047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
213147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
213247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
213347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
213447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
213547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
213647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                {
213747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
213847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        return var_sp;
213947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                }
214047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
214147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
214247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
214347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
214447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
214547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
214647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
214747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
214847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
214947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
215047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
215247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
215316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
2154f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2156f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
2157f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
2158f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
2159f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
2160e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21629394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (GetImportInProgress())
2163ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
216467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
2165ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
2166ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
2167ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
2168e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
216967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    static unsigned int invocation_id = 0;
217067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    unsigned int current_id = invocation_id++;
217167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
217216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
217316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
217416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
21759394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
217616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
21779394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
217816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
21799394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
218016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
21819394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
218216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
218316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
218473b520f4f60dca58e58e446c9504d45384ee677bSean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
2185a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
218667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
21879394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("  CEDM::FEVD[%u] Inspecting namespace map %p (%d entries)",
218867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
218967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        namespace_map.get(),
219067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)namespace_map->size());
2191a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2192a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        if (!namespace_map)
2193a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            return;
2194a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan
219516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
219616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
219716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
219816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
219916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
22009394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Searching namespace %s in module %s",
220167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            current_id,
220216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
220316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
220416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
2205c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan            FindExternalVisibleDecls(context,
2206c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->first,
2207c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->second,
220867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     current_id);
220916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
221016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
221116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else if (!isa<TranslationUnitDecl>(context.m_decl_context))
221216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
221316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        // we shouldn't be getting FindExternalVisibleDecls calls for these
221416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return;
221516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
221616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else
221716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
221816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
221916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
222016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
22219394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("  CEDM::FEVD[%u] Searching the root namespace", current_id);
222216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
222316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
222416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
222516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
222667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 current_id);
222716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2228a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
22299394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (!context.m_found.variable)
22309394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        ClangASTSource::FindExternalVisibleDecls(context);
223116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
223216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
223316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
223416b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
223538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                                  lldb::ModuleSP module_sp,
223603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
223767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  unsigned int current_id)
223816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
2239f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
224016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
224116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
22429394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
2243e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22459394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
22469394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
22473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
22483bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
22493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
22503bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
22519394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
22528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
22538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
2254567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2255567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
225603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
22573cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
225857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
225947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
226057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
226157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
226257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
226357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2264567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
226547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
226647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2267567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
226857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
226957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
227057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
227157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
227257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
227357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
227475a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!this_var ||
2275567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->IsInScope(frame) ||
2276567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->LocationIsValidForFrame (frame))
227757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
227857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
227957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
228057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
228157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
228257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
228357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
228467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            if (log && log->GetVerbose())
22852403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
22869394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf ("  CEDM::FEVD[%u] Type for \"this\" is: ", current_id);
22872403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
22882403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
22892403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
22902403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
229103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
229204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser this_user_type(this_type->GetClangFullType(),
229357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
229457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2295aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
229657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
229758baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
229857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
229957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
230057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
230157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
230257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2303c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2304c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2305c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            if (pointer_target_qual_type.isConstQualified())
2306c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                pointer_target_qual_type.removeLocalConst();
2307c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2308c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
230957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
231003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
23123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
2313a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(pointer_target_qual_type);
23149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
23153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
23163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2317e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            AddOneType(context, class_user_type, current_id, true);
231857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
231957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
232057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
232157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
23223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
23233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
23243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
23253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
23263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2327567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
232847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
232947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2330567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
233103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
23333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
233403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23353aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
233603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
233775a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!self_var ||
2338567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->IsInScope(frame) ||
2339567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->LocationIsValidForFrame (frame))
23403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
234103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23423aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
23433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
23443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
23453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
234603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
234704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser self_user_type(self_type->GetClangFullType(),
23483aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
23493aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
23503aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
235103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
235258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
235303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
235527a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham                                                &pointer_target_type)
235619c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton                || pointer_target_type == NULL)
23573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
235803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23593aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
23603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
23613aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
23623aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
23633aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
2364a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(pointer_target_type);
2365a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
23663aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
23673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2368e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            AddOneType(context, class_user_type, current_id, false);
23693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
23703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
23713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
2372c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
2373c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
2374c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2375c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
237603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23772431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
23782431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
2379567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
23802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23812431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2382567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
23832431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
23852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
23882431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23892431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
23902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23922431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
239303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
23942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
23952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
23962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2397f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan            Decl *parser_ptype_decl = ClangASTContext::CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
23982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
23992431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
24002431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
24012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
24022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
24032431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
24042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
24052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
24062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
24072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
24089394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
24092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
24102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
24112431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
24122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
241403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2415427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
24161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
241767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            AddOneVariable(context, pvar_sp, current_id);
24181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
24191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
24201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
24211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
24221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2423aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
24241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2425b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
24269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
24271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
2428e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            {
2429e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                if (log)
24309394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                    log->Printf("  CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
2431e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan
243267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneRegister(context, reg_info, current_id);
2433e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            }
24341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
24358de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
243603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
243703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
243803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
243903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
244003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
244103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
244203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
244303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
244403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
244503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
244603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember,
244703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
244803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
244903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
245003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
245103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (err.Success() && var != NULL)
245203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
245367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneVariable(context, var, current_id);
245416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
24553a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan                return;
245603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
245703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
245803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        else if (target)
245903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
246094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
246138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                      module_sp,
246294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
246394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
246403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
246503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
246603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
246703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
246867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneVariable(context, var, current_id);
246916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
247003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
247103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
247203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan        if (!context.m_found.variable)
247403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
247503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool include_symbols = true;
247603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
2477a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
247838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            if (namespace_decl && module_sp)
2479a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
248038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                module_sp->FindFunctions(name,
248138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         &namespace_decl,
248238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         eFunctionNameTypeBase,
248338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         include_symbols,
248438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         append,
248538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         sc_list);
2486a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2487a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            else
2488a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
2489a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
2490a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  eFunctionNameTypeBase,
2491a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
2492a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
2493a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
2494a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2495a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
249603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
249703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
249803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
250003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
250103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
250203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
250303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
250403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
250503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
250603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
250703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
250803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
250903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
251003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
251103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // overloaded
251216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        if (!context.m_found.function_with_type_info)
251367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            AddOneFunction(context, sym_ctx.function, NULL, current_id);
251416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function_with_type_info = true;
251516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
251603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
251703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
251803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
251903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
252003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
252103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
252203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
252303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
252403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
252503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
252616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                if (!context.m_found.function_with_type_info)
252703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
252803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
252903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
253067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, generic_symbol, current_id);
253116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
253203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
253303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
253403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
253567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, non_extern_symbol, current_id);
253616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
253703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
253803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
253903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
254003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
254116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan            if (!context.m_found.variable)
254203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
254316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
254403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
254503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2546aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
254703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
254803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
254903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
255067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    AddOneGenericVariable(context, *data_symbol, current_id);
255116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                    context.m_found.variable = true;
255203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
255303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
255403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
2555b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan    }
255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2557e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2558336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
25598de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
25608de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
25618de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
25624a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var,
25639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
25648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
25658de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
25668de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2568e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
25696184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2574810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2575810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
2576336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
257904c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2583810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2584810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
2585336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2590b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2592810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2593810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
2594336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2597336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
2598336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2601178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2602178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
2603567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
2604567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2605178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
2606178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
2607178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
2608178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
2609567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
2610178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2613bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2615810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2616810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
2617336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2619b01000fd063629facd45044f137446fb748ee179Greg Clayton
262058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
2621336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2622f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
2623f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
2624b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
2625f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
26264b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
26274b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
26284b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
26294b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
26304b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
26314b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
26324b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
26334b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
2634f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
2635f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2636f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2637336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
2638336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
26416916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
2647336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
2649336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
2654336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
2655336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2658567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
266047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
266147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
266247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->GetScalar() = load_addr;
266347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->SetValueType(Value::eValueTypeLoadAddress);
266447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
2668b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
2669336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2670336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
2671336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
2672336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2673336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
267467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, unsigned int current_id)
2675336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
2676aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2677aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2678e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
267947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2680f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
2681f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
2682336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2683aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
26848de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
2685f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                            m_ast_context,
26868de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
26878de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
2688336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
26894b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
26904b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
26914b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
26926f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    NamedDecl *var_decl;
26936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
26946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
26956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
26966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
26976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
26986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    else
26996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
27006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
27018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2702427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
2703fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2704fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      entity_name,
2705427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      ut,
270647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
270747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2708427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2709427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2710427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2711427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2712427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2713427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2714696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27166f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
27176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
27186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
2719810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
27208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2721a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
27229394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
27238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
27248f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
27258f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
27268f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
2727a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
272867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       ClangExpressionVariableSP &pvar_sp,
272967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       unsigned int current_id)
2730a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
2731e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
273245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2733427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
2734a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2735f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    TypeFromParser parser_type (GuardedCopyType(m_ast_context,
2736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
2737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
2738f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
2739a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
27406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
27418c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2742427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
2743427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
2744427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
2745427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
2746427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
274745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
274845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
2749a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
2750a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
27519394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
2752a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
2753a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
2754a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
27551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
2756819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
275767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              Symbol &symbol,
275867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              unsigned int current_id)
2759819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2760819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
2761819749647b1605f75753f625050cb240292c08b0Sean Callanan
2762819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2763819749647b1605f75753f625050cb240292c08b0Sean Callanan
2764567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2765567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2766567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
2767567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
2768567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2769567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2770819749647b1605f75753f625050cb240292c08b0Sean Callanan
2771fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
2772819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
2773819749647b1605f75753f625050cb240292c08b0Sean Callanan
2774f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
2775f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
2776819749647b1605f75753f625050cb240292c08b0Sean Callanan
2777fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2778819749647b1605f75753f625050cb240292c08b0Sean Callanan
2779819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2780819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
2781819749647b1605f75753f625050cb240292c08b0Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2782819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
2783819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
278447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
278547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2786819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
2787819749647b1605f75753f625050cb240292c08b0Sean Callanan
2788819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
2789819749647b1605f75753f625050cb240292c08b0Sean Callanan
2790819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddressRange &symbol_range = symbol.GetAddressRangeRef();
2791819749647b1605f75753f625050cb240292c08b0Sean Callanan    Address &symbol_address = symbol_range.GetBaseAddress();
2792567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
2793819749647b1605f75753f625050cb240292c08b0Sean Callanan
2794819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2795819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
2796819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2797819749647b1605f75753f625050cb240292c08b0Sean Callanan
2798fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    entity->EnableParserVars();
2799819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
2800819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
2801819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
2802819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
2803819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
2804819749647b1605f75753f625050cb240292c08b0Sean Callanan
2805819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
2806819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2807a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
2808819749647b1605f75753f625050cb240292c08b0Sean Callanan
28099394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
2810819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2811819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2812819749647b1605f75753f625050cb240292c08b0Sean Callanan
2813fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
2814fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
2815fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
2816fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2817567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2818567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2819567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2820fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2821fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
2822fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
2823fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
2824fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
2825fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2826fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2827fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2828fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
2829fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2830fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2831fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2832fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
2833fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2834fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
2835fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
2836fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
2837fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2838fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2839fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
2840fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2841a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
2842a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
2843fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2844fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2845fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
2846fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2847fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2848fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2849fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2850fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
2851fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2852fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2853fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_parser_type = parser_type;
2854fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2855fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
2856fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
2857fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2858fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2859fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
2860fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
2861fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2862fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
2863fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
2864fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2865819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
2866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
286767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        const RegisterInfo *reg_info,
286867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
28691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
28701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
28711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2872f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
28731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
28741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
28751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
28761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
28771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2878122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
287967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
28801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
28811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
28821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
2884f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
28851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
28861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
28871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2888fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
288947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
289047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2891427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
28921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
2894427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
2895427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
2897427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2898427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2899427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
29001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
290167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    if (log && log->GetVerbose())
29021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2903a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
29049394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
29051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
29061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
29071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2908a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
2909da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
2910da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
291167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        Symbol* symbol,
291267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
29138f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
2914aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2915aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2916e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
29178f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
291858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
29190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
292058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
29218f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
29220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
29230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
29249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
29258f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
29260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
29270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
29280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
29290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
29300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
29310fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
29320fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
293367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no type");
29340fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
29350fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
29360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
293704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
29380fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
29390fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
29400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
29410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
294267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no Clang type");
29430fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
29440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
29450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
29460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
29470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
2948b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
2949f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan        void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
2950a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        if (copied_type)
2951a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
2952a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            fun_decl = context.AddFunDecl(copied_type);
2953a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
2954a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        else
2955a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
2956a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            // We failed to copy the type we found
2957a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            if (log)
2958a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            {
2959a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf ("  Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
2960a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetName().GetCString(),
2961a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetID());
2962a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            }
2963a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
29640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
29650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
29660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
29670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
29680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
29690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
29700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
29710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
29728f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
2973810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
297467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->PutCString("  AddOneFunction called with no function and no symbol");
29758f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
29768f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
29778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
2978567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2979567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2980567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
29818f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
29828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
29838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
2984fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
298547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
298647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2987427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
29888de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2989427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
2990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
2991427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
2992427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
29978c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2998810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
29998de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3000a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(fun_decl);
3001a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
30029394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found %s function %s, returned %s",
300367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    current_id,
300467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    (fun ? "specific" : "generic"),
300567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    decl_name.c_str(),
3006a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                    ast_dumper.GetCString());
30078de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
300993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
301093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
301193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
30123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
301367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                   unsigned int current_id,
30143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
301593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
3016f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    ASTContext *parser_ast_context = m_ast_context;
30179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
30183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3019ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
30209394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
30213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
30223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
30233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
30243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
30253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
30263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3027716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan        clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3028716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        ClangASTContext::GetBuiltInType_void(parser_ast_context),
3029716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        args,
3030716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        1,
3031716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        false,
3032716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        ClangASTContext::GetTypeQualifiers(copied_type));
3033716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan
30341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
30351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
30361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
303730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
303828ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan        const bool is_attr_used = true;
30392581dbf7292c6272bb771fe396ab30921385d669Sean Callanan        const bool is_artificial = false;
304030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
30411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
30421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
30438de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
30441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
30451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
30461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
30471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
304830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
3049716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                   is_explicit,
30502581dbf7292c6272bb771fe396ab30921385d669Sean Callanan                                                   is_attr_used,
30512581dbf7292c6272bb771fe396ab30921385d669Sean Callanan                                                   is_artificial);
30523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
305393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
305493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
305593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
3056