ClangExpressionDeclMap.cpp revision 8f2e392e8937aaf66f91201dc5f4190d61902c67
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"
25f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan#include "lldb/Core/ValueObjectVariable.h"
266e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
28a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
29cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
316916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
41f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
42810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
4317c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
45f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
483bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5273b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
5373b520f4f60dca58e58e446c9504d45384ee677bSean Callanan    ClangASTSource (exe_ctx.GetTargetSP()),
548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
56dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_keep_result_in_memory (keep_result_in_memory),
57aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
58dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_struct_vars ()
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
656d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    // Note: The model is now that the parser's AST context and all associated
666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   data does not vanish until the expression has been executed.  This means
676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   that valuable lookup data (like namespaces) doesn't vanish, but
686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    DidParse();
70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
74166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool
75427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
768c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
78aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_exe_ctx = &exe_ctx;
79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx.GetFramePtr())
82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetThreadPtr())
84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetProcessPtr())
86987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
87987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
88567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
89987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (target)
91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
92987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
93567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
94987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
9597ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan
96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
97567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
99166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!target->GetScratchClangASTContext())
101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            return false;
102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
103166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    m_parser_vars->m_target_info = GetTargetInfo();
10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
106166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    return true;
107aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
108c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
110427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
114427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp &&
120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars.get() &&
121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars->m_lldb_value)
122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                delete var_sp->m_parser_vars->m_lldb_value;
123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
124427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp->DisableParserVars();
125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
127427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
133427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                pvar_sp->DisableParserVars();
134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1377a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo
14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo()
14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo ret;
14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx)
15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx->GetProcessPtr();
153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (process)
154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.byte_order = process->GetByteOrder();
156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.address_byte_size = process->GetAddressByteSize();
157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        else
159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Target *target = exe_ctx->GetTargetPtr();
161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (target)
162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            {
163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.byte_order = target->GetArchitecture().GetByteOrder();
164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            }
166567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return ret;
17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
17147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1728de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1738de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
17482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
177aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
182427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
183aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
18482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
18582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
19105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
192166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
194567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
195567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
196567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
197567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
198567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
19905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2005a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    TypeFromUser user_type(m_ast_importer->CopyType(context,
2015a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetASTContext(),
2025a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetOpaqueQualType()),
20305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
20447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
205dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!user_type.GetOpaqueQualType())
206dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
207dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
208dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
209dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
210dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
211dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
212dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return lldb::ClangExpressionVariableSP();
213dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
214dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
215fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
2170e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
21847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
21947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
2200e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
2210e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
2230e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2240e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
2250e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2270e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
2280e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
2290e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
2340e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
23705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
23905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2402bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen    for (size_t byte_idx = 0;
24105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
24205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
24305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
24405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
24505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
24605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
24847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (m_parser_vars->m_target_info.byte_order)
24905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
2500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
2510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
2520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
2530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
2540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2550e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
2560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
2600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2610e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
2620e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
26305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
26405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
2656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2690e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2700e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
27105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
27205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
273696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP
274696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
2759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                           VarDecl *decl,
276696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           lldb_private::TypeFromParser type)
277696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{
278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    assert (m_parser_vars.get());
279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
283567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
284567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
285567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
286567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
287567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
288567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
289567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
294696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
297696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return ClangExpressionVariableSP();
298696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
2995a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    TypeFromUser user_type(m_ast_importer->CopyType(context,
3005a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetASTContext(),
3015a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetOpaqueQualType()),
302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                           context);
303696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
304dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!user_type.GetOpaqueQualType())
305dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
306dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
307dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
308dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
309dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
310dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
311dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return lldb::ClangExpressionVariableSP();
312dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
313dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser var_type = var_sp->GetTypeFromUser();
315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
316567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx->GetFramePtr();
317567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL)
318567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
319567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
320567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var)
323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
325567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_valobj)
328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_casted_valobj)
333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (log)
336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    {
337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        StreamString my_stream_string;
338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           var_type.GetOpaqueQualType(),
341696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           &my_stream_string);
342696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
343696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
344696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
345696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    }
346696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
347696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
348696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
349696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!pvar_sp)
350696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
351696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
352696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
353696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
354696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
355696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
356696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
357696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
358696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
359696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return pvar_sp;
360696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan}
361696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name)
36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                lldb_private::Value &value,
37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                const ConstString &name,
374a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                lldb_private::TypeFromParser type,
375557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                                                bool transient,
376557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                                                bool maybe_make_load)
37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!pvar_sp)
38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
384557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
385557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    if (maybe_make_load &&
386557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        value.GetValueType() == Value::eValueTypeFileAddress &&
387557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        m_parser_vars->m_exe_ctx &&
388557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        m_parser_vars->m_exe_ctx->GetProcessPtr())
389557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    {
390557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        value.SetValueType(Value::eValueTypeLoadAddress);
391557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    }
39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
394a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !pvar_sp->m_live_sp &&
395a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !transient)
39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
39747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        // The reference comes from the program.  We need to set up a live SP for it.
39847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
399dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen        unsigned long long address = value.GetScalar().ULongLong();
400dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen        AddressType address_type = value.GetValueAddressType();
401dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen
40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetASTContext(),
40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
40547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetName(),
406dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen                                                            address,
407dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen                                                            address_type,
40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetByteSize());
40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->ValueUpdated();
41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const size_t pvar_byte_size = pvar_sp->GetByteSize();
41647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        uint8_t *pvar_data = pvar_sp->GetValueBytes();
41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
4188f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        if (!ReadTarget(pvar_data, value, pvar_byte_size))
4198f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan            return false;
42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    valobj = pvar_sp;
42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return true;
42747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
42847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
4298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananvoid
4308f2e392e8937aaf66f91201dc5f4190d61902c67Sean CallananClangExpressionDeclMap::RemoveResultVariable
4318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan(
4328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    const ConstString &name
4338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan)
4348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan{
4358f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
4368f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    m_parser_vars->m_persistent_vars->RemovePersistentVariable(pvar_sp);
4378f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan}
4388f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
4398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
4408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
4418de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
4456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
4466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
4478de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
448a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
449aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
4516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
452fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
453567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
456567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
458567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
459567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
460a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
4610539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan    TypeFromUser user_type(m_ast_importer->DeportType(context,
4620539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan                                                      parser_type.GetASTContext(),
4630539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan                                                      parser_type.GetOpaqueQualType()),
46497678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
4655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
4665a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    if (!user_type.GetOpaqueQualType())
4675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
4685a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        if (log)
4695a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            log->Printf("Persistent variable's type wasn't copied successfully");
4705a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        return false;
4715a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
47347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
475a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
476fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
477fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
478427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
47947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
48047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan
483427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
4848c12720c108cd5e7ed792596749218d8400f647eSean Callanan
485427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4868c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4878c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
4896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
4906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
4926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
4946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
4966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
5006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
5016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
5026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
5036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
5046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
5056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
506427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
5078c12720c108cd5e7ed792596749218d8400f647eSean Callanan
508427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
509427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
5108c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5118c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
512a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
513a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
514a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
5158de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
5168de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
5188de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
5198de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
5208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
5218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
5228de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
525aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
526aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
527e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
52845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
529aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
5308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5318c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
5328c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
5338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
534427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan
536427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
5388c12720c108cd5e7ed792596749218d8400f647eSean Callanan
539427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
5408c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
5418c12720c108cd5e7ed792596749218d8400f647eSean Callanan
54245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
5435a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
54445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
5458de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
546427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
54745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
5488c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
5498c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
550427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
5518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
552427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
553427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
5558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
556427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
5638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
565aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
566aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
5708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
571aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
572aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
5738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
574427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
5758c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5768c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
5778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
578427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
579427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
580427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
581427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
582427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
5838c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5858c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
5878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
588427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
5908c12720c108cd5e7ed792596749218d8400f647eSean Callanan
591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
5938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
595aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
5968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
597aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
5988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6018de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
6028de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
6048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
6058de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
6068de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
6078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
608aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
609aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
610aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
6118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
613427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
614aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
615aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
6168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
6218de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
6228de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
6248de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
6258de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
6268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
6278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
6288de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
6298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
630aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
631aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
632aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
6338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
635427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
6368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
6398c12720c108cd5e7ed792596749218d8400f647eSean Callanan
640427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
641427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
642427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_jit_vars.get())
6438c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
6448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
6498c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
65302fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
6548de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
6558de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
6578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
6588de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
659ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
660427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
6618c12720c108cd5e7ed792596749218d8400f647eSean Callanan
662427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
6638c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
664ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
6668c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
667ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
668427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
6698c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
671ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
672ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
673ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
674ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
675ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
676ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
677ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
678ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
679ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
680ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
681ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
682aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan       sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
683ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
684ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (!sc_list.GetSize())
685ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
686ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
687ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
688f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
6898de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
6908de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6918de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
692da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
6938de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
694f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
695aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
696aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
697aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
698567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
699567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
700567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
701567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
702f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
703567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
70478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
70578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
706f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
707f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
708e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
709f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
710ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
711ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
712e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
713aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
714aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
715aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
716aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
7170eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan        if (!strncmp(name.GetCString(), "_ZN", 3) &&
7180eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            strncmp(name.GetCString(), "_ZNK", 4))
719aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
7200eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            std::string fixed_scratch("_ZNK");
7210eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            fixed_scratch.append(name.GetCString() + 3);
7220eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            ConstString fixed_name(fixed_scratch.c_str());
723aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
724aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
7250eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan                log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
7260eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan
7270eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
728aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
729aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
730aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
731aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
732f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
733f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
734f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
735e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
736f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
737da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
738f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
739f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
740da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
741f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
742da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
743f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
744f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
745f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
746ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
747ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
748ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
749567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (target);
750da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
751f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
752f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
753f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
75521ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type)
756c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
757c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
758c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
75921ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
760c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
76421ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++)
765cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
766cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
768c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
769cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
770ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
771ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
772ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
773ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
774cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
775cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
776cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
777cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
778cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
779cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
780cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
781cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
782cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
783cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
784cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
785cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
786cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
787cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
788cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
789cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
790cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
791cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
792cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
793cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
794cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
795cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
796cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
797cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
798cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
799cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
800cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
801cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
802cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
803cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
804cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
8053f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCClass:
8063f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCMetaClass:
8073f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCIVar:
808cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
809cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
810cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
811cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
812cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
813c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
814cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
815c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
816c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
817cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
81821ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
819819749647b1605f75753f625050cb240292c08b0Sean Callanan{
820819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
821819749647b1605f75753f625050cb240292c08b0Sean Callanan
822819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (!m_parser_vars->m_exe_ctx ||
823567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        !m_parser_vars->m_exe_ctx->GetTargetPtr())
824819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
825819749647b1605f75753f625050cb240292c08b0Sean Callanan
82621ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name, symbol_type);
827819749647b1605f75753f625050cb240292c08b0Sean Callanan}
828819749647b1605f75753f625050cb240292c08b0Sean Callanan
82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter
83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
831557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue
832557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
833557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{
834557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    Value ret;
835557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
836557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ret.SetContext(Value::eContextTypeInvalid, NULL);
837557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
838557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    if (m_parser_vars->m_exe_ctx && m_parser_vars->m_exe_ctx->GetProcessPtr())
839557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        ret.SetValueType(Value::eValueTypeLoadAddress);
840557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    else
841557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        ret.SetValueType(Value::eValueTypeFileAddress);
842557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
843557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ret.GetScalar() = (unsigned long long)addr;
844557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
845557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    return ret;
846557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan}
847557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const uint8_t *data,
85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     size_t length)
85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
857567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
860567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
872567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return reg_ctx->WriteRegister(reg_info, reg_value);
87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        default:
88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeFileAddress:
88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
885567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
888567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
891567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
894567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory(load_addr, data, length, err);
89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeLoadAddress:
90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
903567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
907567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeHostAddress:
912e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            {
913e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                if (value.GetScalar().ULongLong() == 0 || data == NULL)
914e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                    return false;
915e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                memcpy ((void *)value.GetScalar().ULongLong(), data, length);
916e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                return true;
917e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            }
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeScalar:
91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data,
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    lldb_private::Value &value,
92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    size_t length)
92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
934567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
937567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx->ReadRegister(reg_info, reg_value))
95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
952567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            default:
95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeFileAddress:
96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
962567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
963567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (target == NULL)
96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
968567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
972567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                target->ReadMemory(file_addr, true, data, length, err);
97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeLoadAddress:
97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
978567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
982567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
98347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
98447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
98547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
98647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeHostAddress:
9875a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            {
9885a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                void *host_addr = (void*)value.GetScalar().ULongLong();
9895a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
9905a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                if (!host_addr)
9915a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                    return false;
9925a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
9935a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                memcpy (data, host_addr, length);
99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return true;
9955a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            }
99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeScalar:
99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value
100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
100547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
100847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
10111c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
101247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (expr_var_sp)
101347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
10144a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var)
10156d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan            return Value();
10166d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
10171c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
10181c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
10194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        std::auto_ptr<Value> value(GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL));
10204b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10211c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
10221c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        {
10231c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
10241c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
10251c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            if (!process)
10261c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan                return Value();
10271c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
10281c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            lldb::addr_t value_addr = value->GetScalar().ULongLong();
10291c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            Error read_error;
10301c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
10311c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
10321c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            if (!read_error.Success())
10331c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan                return Value();
10341c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
10351c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan            value->GetScalar() = (unsigned long long)ref_value;
10361c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        }
10371c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
10384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        if (value.get())
10394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return *value;
10404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        else
10414b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return Value();
104247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
104347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else if (persistent_var_sp)
104447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
1045a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1046a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan             persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
104786a07da76f615533a06a797dc4539566951b58d3Sean Callanan            persistent_var_sp->m_live_sp &&
1048f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan            ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress &&
1049f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan              m_parser_vars->m_exe_ctx->GetProcessSP() &&
1050f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan              m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive()) ||
1051f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan             (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress)))
1052a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
10534b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return persistent_var_sp->m_live_sp->GetValue();
1054a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
1055a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        else
1056a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
1057a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            lldb_private::Value ret;
1058a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetValueType(Value::eValueTypeHostAddress);
1059a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetContext(Value::eContextTypeInvalid, NULL);
1060a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1061a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return ret;
1062a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
106347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
106447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
106547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
106647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
106747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
106847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
106947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
10704b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue
10714b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
10724b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{
10734b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    assert(m_parser_vars.get());
10744b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10754b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!m_parser_vars->m_exe_ctx)
10764b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10774b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10784b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
10794b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10804b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!frame)
10814b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10824b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10834b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    VariableList *vars = frame->GetVariableList(false);
10844b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10854b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!vars)
10864b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10874b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10884b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    lldb::VariableSP var = vars->FindVariable(name);
10894b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10904b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!var ||
10914b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        !var->IsInScope(frame) ||
10924b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        !var->LocationIsValidForFrame (frame))
10934b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
10944b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
10954b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    std::auto_ptr<Value> value(GetVariableValue(*m_parser_vars->m_exe_ctx, var, NULL));
10964b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
109741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
109841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    {
109941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr();
110041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
110141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        if (!process)
110241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan            return Value();
110341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
110441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        lldb::addr_t value_addr = value->GetScalar().ULongLong();
110541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        Error read_error;
110641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
110741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
110841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        if (!read_error.Success())
110941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan            return Value();
111041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
111141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        value->GetScalar() = (unsigned long long)ptr_value;
111241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    }
111341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
11144b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (value.get())
11154b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return *value;
11164b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    else
11174b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
11184b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan}
11194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
1120810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
1121f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1122f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
11238de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
11248de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
11268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
11278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11288de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1129f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
1131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1132567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    m_material_vars->m_process = exe_ctx.GetProcessPtr();
1133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
11340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
11350ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                exe_ctx,
11360ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
11370ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
11380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
11390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
1140f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1141f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
1142aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
1143f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1144f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
1145f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1146f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1147f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
11488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
11498de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
11508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
11513aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
1152aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1153047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
1154047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
11558de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
11563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
1157aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1158aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL || process == NULL || target == NULL)
11643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1165e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
11663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
11673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1169aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
11703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1171e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
11723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
11733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1175567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP object_ptr_var = FindVariableInScope (*frame,
1176696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
1177696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
11783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
11803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1181e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
11823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
11833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1185aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
11863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
1187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
11883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
11903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
11913aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
11923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
11933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
119550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
11963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
119750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
119850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
119950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
120050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
12013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
120250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1203567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
120450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
120550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
120650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
120750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
120850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
120950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
121050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
121150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
121250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
1213567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
1214c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
121550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
121650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
121750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
1218c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
121950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
12203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
122150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
12223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
122350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
122450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
122550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
122650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
122750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
122850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
122950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
123050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
123150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1232061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
123350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1234061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
123550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
123650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
123750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
123850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
123950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1240061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
124150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1242061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
124350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
1244061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
124550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
124650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
124750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1248061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
124950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1250061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
125150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
125250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
12533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
12543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
12563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12573c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
12588de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
12598de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1260aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1261427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
12620ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
12630ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
12648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12658de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1266f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
12670ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
1268aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1269aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
1270aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
1271aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1272aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
1273aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
1274aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1275aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
1276aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
1277aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1278aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
1279aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
1280aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1281aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
1282aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1283aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
1284aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1285aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
1286aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1287aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
1288aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
1289f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1290f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
129132824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
12928de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
12938de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1294aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
12958de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
12968de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12978de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
129832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
1299aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1300aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
1301aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1302aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
130332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
130432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
130532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
130632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
1307567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1308567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1309567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!process)
131032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
131132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
131232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
131332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
131432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1315567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1316567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!target)
131732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
131832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
131932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
132032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
132132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
13223371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
13233371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
13243371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
13253371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
13263371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
13273371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
1328c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
132932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
133032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
1331567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (process->ReadMemory (m_material_vars->m_materialized_location,
1332c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
1333c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
133432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
133532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
133632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
133732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
133832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1339567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
134032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1341427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1342427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
1343427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
134432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
1345427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
134632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1347427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
1348427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
1349427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
13518c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1352427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
13538c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
13548c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
1356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
1357427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
1358427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
1359427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
1360427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
1361427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
1362427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
1363427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
136432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
136532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
136632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
136732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
136832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
136932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
137032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1371f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
13728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
13738de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
13748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
1375aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
13760ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
13770ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
1378427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
13798de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
13808de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1381810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
1382427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
1383427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
1384427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1385aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1386aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1387e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
138882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1389aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
1390810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1391810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
139257067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
1393810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1394810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1395567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1396567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame)
139745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
139845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
139957067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
140045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
1401567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
140245839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
1403567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
1404aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1405aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
1406e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
1407e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
1408e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1409e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
14109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        m_material_vars->m_allocated_area = NULL;
1411e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1412e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
1413e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
1414e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1415567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
1416810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1417f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
1418f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1419567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx.GetProcessPtr();
1420aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1421f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
1422567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            process->DeallocateMemory(m_material_vars->m_materialized_location);
1423aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1424f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1425810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
14267a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
14277a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
14287a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
1429567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
14305a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                   lldb::ePermissionsReadable | lldb::ePermissionsWritable,
14315a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                   err);
1432f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1433f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
14345a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        {
14355a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
14365a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                         (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
1437f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
14385a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        }
14395a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
1440aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
1441f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1442810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1443aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
1444810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1445aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1446aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
1447810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1448427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
14498c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
14508c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1451810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1452427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
14534d0b110715d321d366dec1dc690300f713b63236Sean Callanan
1454a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
1455336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
1456a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
1457427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
14581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
14591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
14601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1461aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
14621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
14631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
14645a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                {
14655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                    err.SetErrorString("Couldn't get register context");
14661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
14675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                }
14685a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
1469427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
1470427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
1471427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
1472427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
1473427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1474427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
14751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
14761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
14771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
14781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
1479427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
14805a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                {
14815a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                    err.SetErrorString("Variable being materialized doesn't have necessary state");
14821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
14835a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                }
14841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1485427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
1486427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
1489427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1490427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
14911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
14921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
14938c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1494a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
14958c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
1496a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
1497a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
1498a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
149945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
15006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1501a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
1502a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1503a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1504a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
15056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1506a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1507a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
15086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1509a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1510a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1511a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
1513a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
15140ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
15150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
15160ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1517a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1518a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1519f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1520a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1521a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1522a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
15238c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1524a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
15258c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1526810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1527810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1528f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1529f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1530f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1531a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
15328de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
15338de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
15348de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
15358de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1536427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
15378de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
15380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
15390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
15408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
15418de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1542aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
15446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1545427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1546a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1547427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1548a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1549a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1550a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1551427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1552a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1553427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
15555a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
15565a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        err.SetErrorString("Persistent variable being materialized contains no data");
1557a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
15585a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
1559a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1560a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1561567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1562567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
15646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1565a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1566a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
15686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
15696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
15716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
15726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
15746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1576567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->ReadPointerFromMemory (addr, read_error);
15776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
15796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
15816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
15856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
15866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
15886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
15896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
159047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
159147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
159247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
159347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
159447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
159547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
159647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
15976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
16026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1605b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
16066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
16086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
161197678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
161297678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
16136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
16156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
16176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
16186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
16200ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
16216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
1622567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
16236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
16246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
16256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
16266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
16290ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
16300ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
16310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
16320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
16330ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
16340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
16350ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
16360ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
16370ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
16380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
16390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
16400ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
16410ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
16426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
16436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
16466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
16476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
16496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
16506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
16516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
16526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
16536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1654567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error deallocate_error = process->DeallocateMemory(mem);
16556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
16576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
16586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
16596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
16626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
16646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1665a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
16666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1667a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1668a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1669a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1670a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1671a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
16726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
16736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
16746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
16766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
16776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
16786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
16806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1681567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->AllocateMemory(pvar_byte_size,
16824b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                          lldb::ePermissionsReadable | lldb::ePermissionsWritable,
16834b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                          allocate_error);
16846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
16866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
16886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
16926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
16936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
16956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
169647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
169747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
169847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
169947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
170047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
170147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
170247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
17036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
17056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
17076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
17086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
17106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1711567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
17126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
17146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
17156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
17176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
17196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
17206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
17216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
17226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1723567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!process->WriteScalarToMemory (addr,
17244b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               var_sp->m_live_sp->GetValue().GetScalar(),
17254b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               process->GetAddressByteSize(),
17264b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               write_error))
17276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
17296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
17306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1733c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
17346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1735696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1736a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1738a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1739a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1740a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1741a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1742a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1743a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1744a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1745f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
17468de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
17478de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
17488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
17498de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
17508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
17516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
17528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
17538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
17548de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1755f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1756e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1757567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1758567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1759567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1760567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
17616d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
17625a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
17635a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        err.SetErrorString("Necessary state for variable materialization isn't present");
1764cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
17655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
1766cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17724a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
17734a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
1774f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
17756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
17766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
1777819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
17784a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1779819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1780819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1781819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(GetVariableValue(exe_ctx,
1782819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              var,
1783819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1784819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1785819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
17864a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    {
178721ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan        addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny);
1788819749647b1605f75753f625050cb240292c08b0Sean Callanan
1789cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1790819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1791819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1792c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1793c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1794819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1795819749647b1605f75753f625050cb240292c08b0Sean Callanan
17964a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        location_value.reset(new Value);
17974a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1798819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1799819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1800819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1801819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1802f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1803c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1804c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1805f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1806f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1808841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1809fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1810fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1811fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1812fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1813fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1814fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1815fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1816c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1817c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1818c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1819c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1820fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1821f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1822f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1823f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
18248de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1825f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1826f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
182717c6a05cb96f7110332342326a90692d9505982eSean Callanan
182817c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1829f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
18306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
18316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
183217c6a05cb96f7110332342326a90692d9505982eSean Callanan
183317c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
183417c6a05cb96f7110332342326a90692d9505982eSean Callanan
183517c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1836f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
183717c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1838f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
183917c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
184017c6a05cb96f7110332342326a90692d9505982eSean Callanan
184117c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
184217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1843c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1845c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
184617c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1847f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
184817c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
184917c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1850f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
18516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
185217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1853c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
18546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
18566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
18576f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    Error read_error;
18586f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
18596f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
18606f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
18616f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!read_error.Success())
18626f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
18636f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
18646f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
18656f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      read_error.AsCString());
18666f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
18676f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
18686f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
18696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!process->WritePointerToMemory(addr,
18706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       ref_value,
18716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       write_error))
18726f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
18736f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
18746f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
18756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
18766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
18776f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
18786f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
18796f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                else
18806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
18816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!process->WriteScalarToMemory (addr,
18826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       location_value->GetScalar(),
18836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       process->GetAddressByteSize(),
18846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       write_error))
18856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
18866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
18876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
18886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
18896f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
18906f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
18916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
189217c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1893f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
189417c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
189517c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1896f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
18976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
189817c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
189917c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
190017c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
190117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1902c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1903c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1904c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
190517c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
190617c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
190717c6a05cb96f7110332342326a90692d9505982eSean Callanan
1908061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
190917c6a05cb96f7110332342326a90692d9505982eSean Callanan
1910061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
191117c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1912c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1913c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
191417c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
191517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
191617c6a05cb96f7110332342326a90692d9505982eSean Callanan
1917061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1918061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1919061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1920061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1921061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
192217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1923c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1924c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1925c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
192617c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
192717c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
192817c6a05cb96f7110332342326a90692d9505982eSean Callanan
1929061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
193017c6a05cb96f7110332342326a90692d9505982eSean Callanan
193117c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
193217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
19336f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
19346f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return true; // reference types don't need demateralizing
19356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
19376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
19396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
19406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
19416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
19426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
19436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1944b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
19456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
19466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
19476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
19486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
19496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1950c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
195117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1952c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1953c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
1954c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
1955c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
1956061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
195717c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
1958061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1959061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
196017c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1961c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1962c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1963c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
196417c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
196517c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
19666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
19686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1969567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
19706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
19726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1973c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1974c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1975c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
19766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
19776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
19786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
198017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
198117c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
198217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
19836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                Error write_error;
19846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                RegisterValue reg_value;
19866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (!reg_ctx->ReadRegister (reg_info, reg_value))
19886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
19896f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
19906f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                  name.GetCString(),
19916f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                  reg_info->name);
19926f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return false;
19936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
19946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
19966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
19976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
19986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      addr,
19996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      process->GetAddressByteSize(),
20006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      reg_value);
20016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!write_error.Success())
20036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
20046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
20056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
20066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      reg_info->name,
20076f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
20086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
20096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
20106f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20116f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return true;
20126f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
20136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
20156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
20166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
20186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2019567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Scalar reg_addr (process->AllocateMemory (value_byte_size,
20206f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                          lldb::ePermissionsReadable | lldb::ePermissionsWritable,
20216f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                          allocate_error));
20226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2023c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
20246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
2025c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2026c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2027c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
20286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
20296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
20306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
20326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
203347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
203447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
203547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
203647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
2037c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
203847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
203947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
20406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
20426f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
2043567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
20446f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   reg_addr,
20456f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   process->GetAddressByteSize(),
20466f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   write_error))
20476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
2048c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2049c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2050c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
20516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
20526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
20536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
205517c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
2056c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
2057c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2058c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
205917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
206017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
2061061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
2062061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
206317c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
2064c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2065c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2066c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
206717c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
206817c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
206917c6a05cb96f7110332342326a90692d9505982eSean Callanan
2070c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2071c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
2072c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
2073c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
2074061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
207517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
207617c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
2077f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
2078f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2079f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
2080f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
2081810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
2082810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
20831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
20841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
20851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
20861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
20871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
20881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
2089b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
20901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
20911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
20921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
20931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
20941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
2095061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
20961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
20971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2098061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2099061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
21001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2101bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
21021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2105061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
21061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2107061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
21081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
21111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
21121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
21131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2114061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
21151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2116061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
21171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2120061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2121061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
21221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
212395b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
21241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
21271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
21281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
21291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
21301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2131696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
21328de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
21338de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
21348de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
21358de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
21368de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
21378de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2138aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
2139e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2140cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
2141f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    ValueObjectSP valobj;
2142f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    VariableSP var_sp;
2143f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    Error err;
2144f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan
2145f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2146f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     eNoDynamicValues,
2147f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     StackFrame::eExpressionPathOptionCheckPtrVsMember,
2148f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     var_sp,
2149f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     err);
21503bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
2151f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    if (!err.Success() ||
2152f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan        !var_sp ||
2153ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
2154ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
2155ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
21563bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21573bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
21583bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
21593bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
21603bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
216104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
2162696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                return lldb::VariableSP();
21633bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
21643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
21653bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
21663bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
21673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
2168696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan            return lldb::VariableSP();
21693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
21703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
21713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
2172696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return var_sp;
2173cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
2174336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2175819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
2176819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
2177819749647b1605f75753f625050cb240292c08b0Sean Callanan(
2178819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
2179aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    const ConstString &name
2180819749647b1605f75753f625050cb240292c08b0Sean Callanan)
2181819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2182819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
2183819749647b1605f75753f625050cb240292c08b0Sean Callanan
2184aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name,
2185aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  eSymbolTypeData,
2186aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  sc_list);
2187819749647b1605f75753f625050cb240292c08b0Sean Callanan
2188819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
2189819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2190819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
2191819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
2192819749647b1605f75753f625050cb240292c08b0Sean Callanan
2193819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
2194819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2195819749647b1605f75753f625050cb240292c08b0Sean Callanan
2196819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
2197819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2198819749647b1605f75753f625050cb240292c08b0Sean Callanan
219947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
220047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
220147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
220247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
220394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
220494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
220594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
220647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
220747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
220847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
220947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
221047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
221194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
221294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
221394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
221494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
221547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
221647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
221747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
221847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
221947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
222047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
222147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
222247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
222347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
222447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
222547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                {
222647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
222747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        return var_sp;
222847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                }
222947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
223047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
223147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
223247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
223347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
223447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
223547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
223647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
223747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
223847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
223947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
224147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
224216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
2243f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2245f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
2246f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
2247f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
2248f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
2249e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22519394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (GetImportInProgress())
2252ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
225367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
2254ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
2255ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
2256ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
2257e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
225867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    static unsigned int invocation_id = 0;
225967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    unsigned int current_id = invocation_id++;
226067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
226116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
226216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
226316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
22649394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
226516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
22669394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
226716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
22689394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
226916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
22709394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
227116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
227216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
227373b520f4f60dca58e58e446c9504d45384ee677bSean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
2274a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
227567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
22765a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            log->Printf("  CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
227767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
227867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        namespace_map.get(),
227967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)namespace_map->size());
2280a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2281a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        if (!namespace_map)
2282a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            return;
2283a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan
228416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
228516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
228616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
228716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
228816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
22899394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Searching namespace %s in module %s",
229067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            current_id,
229116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
229216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
229316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
2294c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan            FindExternalVisibleDecls(context,
2295c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->first,
2296c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->second,
229767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     current_id);
229816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
229916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2300e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan    else if (isa<TranslationUnitDecl>(context.m_decl_context))
230116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
230216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
230316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
230416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
23059394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("  CEDM::FEVD[%u] Searching the root namespace", current_id);
230616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
230716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
230816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
230916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
231067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 current_id);
231116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2312a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
23139394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (!context.m_found.variable)
23149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        ClangASTSource::FindExternalVisibleDecls(context);
231516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
231616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
231716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
231816b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
231938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                                  lldb::ModuleSP module_sp,
232003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
232167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  unsigned int current_id)
232216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
2323f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
232416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
232516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
23269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
2327e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23299394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
23309394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
23313bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
23323bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
23333bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
23343bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
23359394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
23368f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    static ConstString id_name("id");
23378f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    static ConstString Class_name("Class");
23388f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
23398f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    if (name == id_name || name == Class_name)
23408f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        return;
23418f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
23428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
23438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
2344567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2345567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
234603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
23473cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
234857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
234947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
235057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
235157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
235257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
235357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2354567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
235547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
235647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2357567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
235857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
235957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
236057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
236157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
236257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
236357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
236475a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!this_var ||
2365567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->IsInScope(frame) ||
2366567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->LocationIsValidForFrame (frame))
236757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
236857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
236957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
237057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
237157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
237257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
237357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
237467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            if (log && log->GetVerbose())
23752403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
23769394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf ("  CEDM::FEVD[%u] Type for \"this\" is: ", current_id);
23772403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
23782403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
23792403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
23802403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
238103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
238204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser this_user_type(this_type->GetClangFullType(),
238357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
238457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2385aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
238657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
238758baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
238857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
238957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
239057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
239157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
239257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2393c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2394c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2395c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            if (pointer_target_qual_type.isConstQualified())
2396c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                pointer_target_qual_type.removeLocalConst();
2397c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2398c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
239957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
240003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
24013aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
24023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
2403a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(pointer_target_qual_type);
24049394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
24053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
24063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2407e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            AddOneType(context, class_user_type, current_id, true);
240857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
240957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
241057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
241157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
24123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
24133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
24143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
24153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
24163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2417567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
241847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
2419e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2420e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
242147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2422e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!sym_ctx.function)
2423e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                return;
242403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2425e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            clang::DeclContext *decl_context;
2426e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2427e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (sym_ctx.block && sym_ctx.block->GetInlinedFunctionInfo())
2428e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                decl_context = sym_ctx.block->GetClangDeclContextForInlinedFunction();
2429e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            else
2430e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                decl_context = sym_ctx.function->GetClangDeclContext();
2431e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2432e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!decl_context)
24333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
243403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2435e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2436e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2437e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!method_decl)
2438e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                return;
2439e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2440e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
2441e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2442e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!self_interface)
2443e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                return;
2444e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2445e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            const clang::Type *interface_type = self_interface->getTypeForDecl();
2446e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2447e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2448e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                                         &method_decl->getASTContext());
2449e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2450e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (log)
2451e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            {
2452e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                ASTDumper ast_dumper(interface_type);
2453e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2454e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            }
2455e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2456e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            AddOneType(context, class_user_type, current_id, false);
2457e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2458e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            VariableList *vars = frame->GetVariableList(false);
2459e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
24603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
246103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
246275a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!self_var ||
2463567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->IsInScope(frame) ||
2464567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->LocationIsValidForFrame (frame))
24653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
246603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
24673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
24683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
24693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
24703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
247103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
247204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser self_user_type(self_type->GetClangFullType(),
24733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
24743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
24753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
24763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
24773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
2478c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
2479c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
2480c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2481c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
248203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
24832431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
24842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
2485567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
24862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
24872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2488567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
24892431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
24902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
24912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
24922431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
24932431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
24942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
24952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
24962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
24972431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
24982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
25002431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
25012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
25022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2503e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
25042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
25052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
25062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
25072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
25082431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
25092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
25102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
25112431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
25122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
25132431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
25149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
25152431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
25162431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
25172431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
25182431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2519427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
252003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2521427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
25221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
252367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            AddOneVariable(context, pvar_sp, current_id);
25241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
25251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
25261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
25271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
25281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2529aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
25301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2531b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
25329394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
25331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
2534e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            {
2535e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                if (log)
25369394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                    log->Printf("  CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
2537e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan
253867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneRegister(context, reg_info, current_id);
2539e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            }
25401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
25418de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
254203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
254303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
254403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
254503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
254603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
254703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
254803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
254903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
255003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
255103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
255203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember,
255303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
255403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
255503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
255603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
255703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (err.Success() && var != NULL)
255803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
255989e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                AddOneVariable(context, var, valobj, current_id);
256016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
25613a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan                return;
256203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
256303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
25641c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan
25651c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan        if (target)
256603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
256794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
256838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                      module_sp,
256994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
257094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
257103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
257203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
257303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
257403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
2575f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan                valobj = ValueObjectVariable::Create(target, var);
257689e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                AddOneVariable(context, var, valobj, current_id);
257716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
25781c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan                return;
257903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
258003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
258103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
258216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan        if (!context.m_found.variable)
258303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
258403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool include_symbols = true;
258503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
2586a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
258738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            if (namespace_decl && module_sp)
2588a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
258938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                module_sp->FindFunctions(name,
259038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         &namespace_decl,
259138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         eFunctionNameTypeBase,
259238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         include_symbols,
259338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         append,
259438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         sc_list);
2595a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2596a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            else
2597a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
2598a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
2599a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  eFunctionNameTypeBase,
2600a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
2601a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
2602a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
2603a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2604a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
260503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
260603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
260703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
260803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
260903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
261003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
261103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
261203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
261303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
261403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
261503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
261603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
261703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
261803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
261903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
262003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // overloaded
262116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        if (!context.m_found.function_with_type_info)
262267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            AddOneFunction(context, sym_ctx.function, NULL, current_id);
262316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function_with_type_info = true;
262416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
262503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
262603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
262703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
262803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
262903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
263003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
263103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
263203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
263303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
263403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
263516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                if (!context.m_found.function_with_type_info)
263603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
263703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
263803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
263967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, generic_symbol, current_id);
264016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
264103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
264203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
264303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
264467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, non_extern_symbol, current_id);
264516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
264603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
264703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
264803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
264903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
265016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan            if (!context.m_found.variable)
265103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
265216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
265303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
265403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2655aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
265603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
265703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
265803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
265967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    AddOneGenericVariable(context, *data_symbol, current_id);
266016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                    context.m_found.variable = true;
266103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
266203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
266303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
2664b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan    }
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2666e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2667336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
26688de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
26698de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
26708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
26714a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var,
26729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
26738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
26748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
26758de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2677e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
26786184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2683810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2684810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
2685336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2692810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2693810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
2694336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2699b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2701810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2702810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
2703336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2706336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
2707336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
270924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2710178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2711178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
2712567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
2713567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2714178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
2715178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
2716178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
2717178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
2718567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
2719178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2722bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2724810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2725810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
2726336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2728b01000fd063629facd45044f137446fb748ee179Greg Clayton
272958baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
2730336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2731f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
2732f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
2733b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
2734f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
27354b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
27364b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
27374b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
27384b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
27394b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
27404b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
27414b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
27424b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
2743f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
2744f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2745f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2746336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
2747336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
274824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
27506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
2756336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
2758336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
2763336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
2764336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2767567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
276947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
277047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
277147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->GetScalar() = load_addr;
277247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->SetValueType(Value::eValueTypeLoadAddress);
277347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2776f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
2777b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
2778336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2779336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
2780336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
2781336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2782336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
278389e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
2784336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
2785aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2786aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2787e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
278847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2789f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
2790f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
2791336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2792aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
27938de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
2794f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                            m_ast_context,
27958de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
27968de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
2797336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
27984b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
27994b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
28004b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
28016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    NamedDecl *var_decl;
28026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
28036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
28046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
28056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
28066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
28076f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    else
28086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
28096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
28108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2811427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
281289e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
281389e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan
2814427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2815427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2816427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2818427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2820696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28226f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
28236f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
28246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
2825810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
28268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2827aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan        ASTDumper orig_dumper(ut.GetOpaqueQualType());
2828a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
2829aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString());
28308de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
28318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
28328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
28338f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
2834a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
283567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       ClangExpressionVariableSP &pvar_sp,
283667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       unsigned int current_id)
2837a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
2838e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
283945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2840427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
2841a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2842f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    TypeFromParser parser_type (GuardedCopyType(m_ast_context,
2843427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
2844427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
2845f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
2846a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2847dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!parser_type.GetOpaqueQualType())
2848dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
2849dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
2850dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("  CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
2851dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return;
2852dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
2853dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
28546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
28558c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2856427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
2857427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
2858427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
2859427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
2860427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
286145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
286245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
2863a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
2864a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
28659394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
2866a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
2867a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
2868a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
28691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
2870819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
287167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              Symbol &symbol,
287267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              unsigned int current_id)
2873819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2874819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
2875819749647b1605f75753f625050cb240292c08b0Sean Callanan
2876819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2877819749647b1605f75753f625050cb240292c08b0Sean Callanan
2878567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2879567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2880567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
2881567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
2882567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2883567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2884819749647b1605f75753f625050cb240292c08b0Sean Callanan
2885fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
2886819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
2887819749647b1605f75753f625050cb240292c08b0Sean Callanan
2888f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
2889f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
2890819749647b1605f75753f625050cb240292c08b0Sean Callanan
2891fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2892819749647b1605f75753f625050cb240292c08b0Sean Callanan
2893819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2894819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
2895819749647b1605f75753f625050cb240292c08b0Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2896819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
2897819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
289847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
289947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2900819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
2901819749647b1605f75753f625050cb240292c08b0Sean Callanan
2902819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
2903819749647b1605f75753f625050cb240292c08b0Sean Callanan
2904819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddressRange &symbol_range = symbol.GetAddressRangeRef();
2905819749647b1605f75753f625050cb240292c08b0Sean Callanan    Address &symbol_address = symbol_range.GetBaseAddress();
2906567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
2907819749647b1605f75753f625050cb240292c08b0Sean Callanan
2908819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2909819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
2910819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2911819749647b1605f75753f625050cb240292c08b0Sean Callanan
2912fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    entity->EnableParserVars();
2913819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
2914819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
2915819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
2916819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
2917819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
2918819749647b1605f75753f625050cb240292c08b0Sean Callanan
2919819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
2920819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2921a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
2922819749647b1605f75753f625050cb240292c08b0Sean Callanan
29239394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
2924819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2925819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2926819749647b1605f75753f625050cb240292c08b0Sean Callanan
2927fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
2928fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
2929fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
2930fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2931567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2934fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2935fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
2936fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
2937fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
2938fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
2939fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2940fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2941fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2942fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
2943fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2944fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2945fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2946fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
2947fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2948fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
2949fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
2950fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
2951fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2952fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2953fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
2954fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2955a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
2956a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
2957fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2958fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2959fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
2960fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2961fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
29625a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2963fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2964dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            if (!copied_type)
2965dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            {
2966dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                if (log)
2967dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                    log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
2968dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
2969dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                return lldb::ClangExpressionVariableSP();
2970dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            }
2971dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
2972fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
2973fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2974fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2975fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_parser_type = parser_type;
2976fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2977fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
2978fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
2979fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2980fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2981fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
2982fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
2983fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2984fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
2985fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
2986fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2987819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
2988427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
298967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        const RegisterInfo *reg_info,
299067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
29911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
29921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
29931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2994f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
29951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
29961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
29971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
29991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
3000122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
300167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
30021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
30031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
30041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3005427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
3006f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
30071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
30081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
30091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3010fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
301147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
301247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3013427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
30141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
3015427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
3016427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
3017427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
3018427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
3019427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
3020427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3021427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
30221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
302367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    if (log && log->GetVerbose())
30241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
3025a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
30269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
30271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
30281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
30291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3030a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
3031da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3032da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
303367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        Symbol* symbol,
303467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
30358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
3036aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3037aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3038e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
30398f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
304058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
30410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
304258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
30438f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
30450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
30469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
30478f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
30490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
30510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
30530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
305567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no type");
30560fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30570fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
305904c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
30600fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
30620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
306467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no Clang type");
30650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
30690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
3070b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
3071f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan        void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
3072a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        if (copied_type)
3073a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
3074a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            fun_decl = context.AddFunDecl(copied_type);
3075a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
3076a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        else
3077a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
3078a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            // We failed to copy the type we found
3079a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            if (log)
3080a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            {
3081a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf ("  Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3082a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetName().GetCString(),
3083a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetID());
3084a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            }
308516089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan
308616089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan            return;
3087a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
30880fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
30900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
30920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
30940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
30968f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
3097810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
309867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->PutCString("  AddOneFunction called with no function and no symbol");
30998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
31008f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
31018f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3104567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
31058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
31068f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
31078f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
310947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
311047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3111427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
31128de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
3113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
3114427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
3115427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
3116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
3118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
3119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
31218c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3122810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
31238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3124a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(fun_decl);
3125a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
31269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found %s function %s, returned %s",
312767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    current_id,
312867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    (fun ? "specific" : "generic"),
312967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    decl_name.c_str(),
3130a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                    ast_dumper.GetCString());
31318de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
313393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
313493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
313593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
31363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
313767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                   unsigned int current_id,
31383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
313993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
3140f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    ASTContext *parser_ast_context = m_ast_context;
31419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
31423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3143ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
3144dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3145dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!copied_type)
3146dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
3147dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3148dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3149dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
3150dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3151dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3152dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return;
3153dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
31549394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
31553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
31563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
31573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
31583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
31603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3161716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan        clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3162716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        ClangASTContext::GetBuiltInType_void(parser_ast_context),
3163716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        args,
3164716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        1,
3165716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        false,
3166716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        ClangASTContext::GetTypeQualifiers(copied_type));
3167716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan
31681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
31691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
31701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
317130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
317228ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan        const bool is_attr_used = true;
31732581dbf7292c6272bb771fe396ab30921385d669Sean Callanan        const bool is_artificial = false;
317430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
31761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
31778de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
31781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
31791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
31801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
31811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
318230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
3183716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                   is_explicit,
31842581dbf7292c6272bb771fe396ab30921385d669Sean Callanan                                                   is_attr_used,
31852581dbf7292c6272bb771fe396ab30921385d669Sean Callanan                                                   is_artificial);
31863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
318793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
318893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
318993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
3190