ClangExpressionDeclMap.cpp revision 31903318116cbd66801cd2a526cc5e5873d20e4c
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
1606dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan#include "clang/AST/ASTContext.h"
1747a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h"
18a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
21810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h"
226184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
24061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h"
2505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h"
26f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan#include "lldb/Core/ValueObjectVariable.h"
276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
29a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
30cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
326916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
42f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
43d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan#include "lldb/Target/ObjCLanguageRuntime.h"
44810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
4517c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
47f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4878b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
503bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5473b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
5573b520f4f60dca58e58e446c9504d45384ee677bSean Callanan    ClangASTSource (exe_ctx.GetTargetSP()),
568de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
58dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_keep_result_in_memory (keep_result_in_memory),
59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
60dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_struct_vars ()
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
66aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    // Note: The model is now that the parser's AST context and all associated
686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   data does not vanish until the expression has been executed.  This means
696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   that valuable lookup data (like namespaces) doesn't vanish, but
706d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
716d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    DidParse();
72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
75aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
76166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool
77427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
788c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
79aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
80dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    m_parser_vars->m_exe_ctx = exe_ctx;
81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx.GetFramePtr())
84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetThreadPtr())
86567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
87567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetProcessPtr())
88987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
89987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
92567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (target)
93987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
94987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
96987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
9797ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan
98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
101166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!target->GetScratchClangASTContext())
103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            return false;
104567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
105166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
10647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    m_parser_vars->m_target_info = GetTargetInfo();
10747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
108166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    return true;
109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
110c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
111427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
112427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
118aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
1216f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            if (var_sp)
1226f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            {
12331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
12431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
12531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                if (parser_vars && parser_vars->m_lldb_value)
12631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                    delete parser_vars->m_lldb_value;
127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
12831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                var_sp->DisableParserVars(GetParserID());
1296f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            }
130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
136427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
137427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
13831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                pvar_sp->DisableParserVars(GetParserID());
139aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
140aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
141aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1427a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo
14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo()
14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
15247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo ret;
15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
154dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
155dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
156dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = exe_ctx.GetProcessPtr();
157dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (process)
15847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
159dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        ret.byte_order = process->GetByteOrder();
160dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        ret.address_byte_size = process->GetAddressByteSize();
161dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    }
162dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    else
163dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    {
164dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        Target *target = exe_ctx.GetTargetPtr();
165dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        if (target)
166567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
167dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            ret.byte_order = target->GetArchitecture().GetByteOrder();
168dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
169567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
171dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
17247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return ret;
17347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
17447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1758de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1768de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
17782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
178aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
179aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
180aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
182427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
183427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
184427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
185427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
186aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
18782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
18882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
19105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
19205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
19305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
19405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
195166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
196dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
197dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
198dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
199dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
200dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!target)
201dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        return ClangExpressionVariableSP();
202567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
203567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
20405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2055a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    TypeFromUser user_type(m_ast_importer->CopyType(context,
2065a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetASTContext(),
2075a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetOpaqueQualType()),
20805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
20947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
210dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!user_type.GetOpaqueQualType())
211dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
212dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
213dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
214dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
215dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
216dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
217dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return lldb::ClangExpressionVariableSP();
218dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
219dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
220dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
221fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
22347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
22447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
2250e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
2260e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2270e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
2280e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2290e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
2300e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2320e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
2330e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
2340e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
24005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
24105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
24205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
24305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
24405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2452bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen    for (size_t byte_idx = 0;
24605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
24805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
24905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
25005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
25105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
25205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
25347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (m_parser_vars->m_target_info.byte_order)
25405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
2550e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
2560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
2610e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2620e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
2630e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
2640e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
2650e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2660e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
2670e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
26805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
26905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
2706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
272696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
273696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2740e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2750e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
27605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
27705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP
279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
2809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                           VarDecl *decl,
281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           lldb_private::TypeFromParser type)
282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{
283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    assert (m_parser_vars.get());
284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
287dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
288dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
289567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
290567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
291567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
292567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
29431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID()));
295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
29731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID());
298696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
299696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return ClangExpressionVariableSP();
301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
3025a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    TypeFromUser user_type(m_ast_importer->CopyType(context,
3035a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetASTContext(),
3045a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetOpaqueQualType()),
305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                           context);
306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
307dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!user_type.GetOpaqueQualType())
308bf41e19c78f0c84671d21eadec3954ab6db550c1Jason Molenda    {
309dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
310dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
311dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
312dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return lldb::ClangExpressionVariableSP();
313dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
314dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser var_type = var_sp->GetTypeFromUser();
316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
317dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = exe_ctx.GetFramePtr();
318567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL)
319567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
320567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
321567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var)
324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
326567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_valobj)
329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_casted_valobj)
334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (log)
337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    {
338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        StreamString my_stream_string;
339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
341696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           var_type.GetOpaqueQualType(),
342696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           &my_stream_string);
343696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
344696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
345696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
346696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    }
347696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
348696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
349696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
350696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!pvar_sp)
351696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
352696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
353696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
354696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
355696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
356696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
357696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
358696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
359696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
360696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return pvar_sp;
361696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan}
362696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name)
36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                lldb_private::Value &value,
37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                const ConstString &name,
375a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                lldb_private::TypeFromParser type,
376557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                                                bool transient,
377557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                                                bool maybe_make_load)
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!pvar_sp)
38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
385557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
386557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    if (maybe_make_load &&
387557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        value.GetValueType() == Value::eValueTypeFileAddress &&
388dd1dcfdbad297562951169ad621f895daf32b382Sean 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
402dd1dcfdbad297562951169ad621f895daf32b382Sean 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));
452dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
453dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
456567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
458a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
4590539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan    TypeFromUser user_type(m_ast_importer->DeportType(context,
4600539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan                                                      parser_type.GetASTContext(),
4610539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan                                                      parser_type.GetOpaqueQualType()),
46297678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
4635a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
4645a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    if (!user_type.GetOpaqueQualType())
4655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
4665a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        if (log)
4675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            log->Printf("Persistent variable's type wasn't copied successfully");
4685a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        return false;
4695a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
47147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
473a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
474dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
475fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
476427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
47747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
47847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
4798c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan
481427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan
483427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4848c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan
486bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan    var_sp->m_frozen_sp->SetHasCompleteType();
487bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean 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
50631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    var_sp->EnableParserVars(GetParserID());
50731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
50831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
5098c12720c108cd5e7ed792596749218d8400f647eSean Callanan
51031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl = decl;
51131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = parser_type;
5128c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5138c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
514a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
515a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
516a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
5178de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
5188de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
5208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
5218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
5228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
5238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
5248de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
526aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
527aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
528aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
529e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
53045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
531aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
5328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
53331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    if (m_struct_members.GetVariable(decl, GetParserID()))
5348c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
5358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
53631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID()));
5378c12720c108cd5e7ed792596749218d8400f647eSean Callanan
538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
53931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID());
5408c12720c108cd5e7ed792596749218d8400f647eSean Callanan
541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
5428c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
5438c12720c108cd5e7ed792596749218d8400f647eSean Callanan
54445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
5455a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
54645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
5478de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
548427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
54945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
5508c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
5518c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
5528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
55331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
55431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
55531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value = value;
55631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
55731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    var_sp->EnableJITVars(GetParserID());
55831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
55931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
56031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
56131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    jit_vars->m_alignment = alignment;
56231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    jit_vars->m_size = size;
5638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
564427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
5718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
572aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
573aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
574aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
5758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
5768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
5788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
579aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
5818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
582427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
5838c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5848c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
5858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
588427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
58931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
59031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
59231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        if (!jit_vars)
5938c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5958c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
59631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            m_struct_vars->m_struct_alignment = jit_vars->m_alignment;
5978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
59831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        if (cursor % jit_vars->m_alignment)
59931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            cursor += (jit_vars->m_alignment - (cursor % jit_vars->m_alignment));
6008c12720c108cd5e7ed792596749218d8400f647eSean Callanan
60131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        jit_vars->m_offset = cursor;
60231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        cursor += jit_vars->m_size;
6038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
6048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
605aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
6068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
607aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
6088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6118de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
6128de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
6148de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
6158de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
6168de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
6178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
618aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
619aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
620aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
6218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
623427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
624aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
625aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
6268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
6318de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
6328de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
6348de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
6358de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
6368de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
6378de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
6388de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
6398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
640aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
641aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
642aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
6438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
6468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
6498c12720c108cd5e7ed792596749218d8400f647eSean Callanan
65031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    if (!member_sp)
65131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        return false;
65231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
65331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = member_sp->GetParserVars(GetParserID());
65431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
65531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
65631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    if (!parser_vars ||
65731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        !jit_vars ||
65853a5a9986e2a201717ea723f67ae32571be95b32Sean Callanan        !member_sp->GetValueObject())
6598c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
6608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
66131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    decl = parser_vars->m_named_decl;
66231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    value = parser_vars->m_llvm_value;
66331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    offset = jit_vars->m_offset;
664427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
66902fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
6708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
6718de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
6738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
6748de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
675ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
67631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl, GetParserID()));
6778c12720c108cd5e7ed792596749218d8400f647eSean Callanan
678427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
6798c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
680ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
6818c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
6828c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
683ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
68431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = entity_sp->GetParserVars(GetParserID());
68531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
68631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ptr = parser_vars->m_lldb_value->GetScalar().ULongLong();
6878c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6888c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
689ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
690ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
691ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
692ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
693ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
694ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
695ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
696ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
697ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
698ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
699ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
700aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan       sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
701ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
702ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (!sc_list.GetSize())
703ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
704ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
705ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
706f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
7078de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
7088de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
7098de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
710da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
7118de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
712f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
713aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
714aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
715aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
716dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
717dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
718f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
719567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
72078b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
72178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
722f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
723f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
724e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
725f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
726ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
727ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
728e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
729aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
730aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
731aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
732aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
7330eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan        if (!strncmp(name.GetCString(), "_ZN", 3) &&
7340eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            strncmp(name.GetCString(), "_ZNK", 4))
735aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
7360eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            std::string fixed_scratch("_ZNK");
7370eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            fixed_scratch.append(name.GetCString() + 3);
7380eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            ConstString fixed_name(fixed_scratch.c_str());
739aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
740aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
7410eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan                log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
7420eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan
7430eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
744aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
745aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
746aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
747aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
748f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
749f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
750f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
751e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
752f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
753da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
754f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
755f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
756da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
757f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
7580c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        func_so_addr = &sym_ctx.symbol->GetAddress();
759f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
760f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
761f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
762ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
763ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
764ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
765567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (target);
766da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
767f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
768f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
769f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
770cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
771d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, Process *process, const ConstString &name, lldb::SymbolType symbol_type)
772c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
773c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
774c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
77521ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
776c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
777cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
778cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
779cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
78021ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++)
781cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
782cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
783cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
784c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
7850c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddress();
786ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
787ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
788ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
789ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
790cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
791cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
792cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
793cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
794cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
795cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
796cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
797cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
798cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
799cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
800cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
801cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
802cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
803cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
804cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
805cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
806cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
807cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
808cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
809cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
810cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
811cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
812cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
813cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
814cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
815cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
816cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
817cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
818cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
819cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
820cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
8213f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCClass:
8223f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCMetaClass:
8233f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCIVar:
824cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
825cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
826cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
827cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
828cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
829c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
830d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    if (symbol_load_addr == LLDB_INVALID_ADDRESS && process)
831d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    {
832d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
833d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan
834d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        if (runtime)
835d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        {
836d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan            symbol_load_addr = runtime->LookupRuntimeSymbol(name);
837d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        }
838d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    }
839d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan
840cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
841c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
842c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
843cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
84421ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
845819749647b1605f75753f625050cb240292c08b0Sean Callanan{
846819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
847819749647b1605f75753f625050cb240292c08b0Sean Callanan
848dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
849819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
850819749647b1605f75753f625050cb240292c08b0Sean Callanan
851d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), m_parser_vars->m_exe_ctx.GetProcessPtr(), name, symbol_type);
852819749647b1605f75753f625050cb240292c08b0Sean Callanan}
853819749647b1605f75753f625050cb240292c08b0Sean Callanan
85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter
85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
856557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue
857557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
858557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{
859557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    Value ret;
860557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
861557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ret.SetContext(Value::eContextTypeInvalid, NULL);
862557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
863dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (m_parser_vars->m_exe_ctx.GetProcessPtr())
864557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        ret.SetValueType(Value::eValueTypeLoadAddress);
865557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    else
866557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        ret.SetValueType(Value::eValueTypeFileAddress);
867557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
868557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ret.GetScalar() = (unsigned long long)addr;
869557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
870557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    return ret;
871557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan}
872557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const uint8_t *data,
87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     size_t length)
87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
880dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
882dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = exe_ctx.GetProcessPtr();
88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
885567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
888dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return reg_ctx->WriteRegister(reg_info, reg_value);
90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        default:
90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeFileAddress:
90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
910567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
913dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                Target *target = exe_ctx.GetTargetPtr();
91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
919567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
922567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory(load_addr, data, length, err);
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeLoadAddress:
92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeHostAddress:
937e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            {
938e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                if (value.GetScalar().ULongLong() == 0 || data == NULL)
939e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                    return false;
940e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                memcpy ((void *)value.GetScalar().ULongLong(), data, length);
941e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                return true;
942e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            }
94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeScalar:
94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data,
95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    lldb_private::Value &value,
95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    size_t length)
95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
956dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
957567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
958dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = exe_ctx.GetProcessPtr();
959567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
962567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
965dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx->ReadRegister(reg_info, reg_value))
97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
977567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
97847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
98247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
98347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            default:
98447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
98547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeFileAddress:
98647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
987dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                Target *target = exe_ctx.GetTargetPtr();
988567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (target == NULL)
98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
99147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
993567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
997b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                target->ReadMemory(file_addr, false, data, length, err);
99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeLoadAddress:
100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
1003567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
100547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
1007567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
100847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
101147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeHostAddress:
10125a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            {
10135a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                void *host_addr = (void*)value.GetScalar().ULongLong();
10145a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
10155a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                if (!host_addr)
10165a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                    return false;
10175a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
10185a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                memcpy (data, host_addr, length);
101947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return true;
10205a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            }
102147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeScalar:
102247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
102347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
102447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
102547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
102647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
102747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value
102852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags)
102947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
103047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
1031dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
103231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl, GetParserID()));
103331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID()));
10341c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
103547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (expr_var_sp)
103647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
103752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        flags = expr_var_sp->m_flags;
103852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
103931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        ClangExpressionVariable::ParserVars *parser_vars = expr_var_sp->GetParserVars(GetParserID());
104031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
104131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        if (!parser_vars)
10426d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan            return Value();
10436d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
10441c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
1045b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
104631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        if (parser_vars->m_lldb_var)
10471c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        {
104831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            std::auto_ptr<Value> value(GetVariableValue(parser_vars->m_lldb_var, NULL));
10491c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
1050b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1051b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            {
1052dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1053b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1054b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                if (!process)
1055b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                    return Value();
1056b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1057b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                lldb::addr_t value_addr = value->GetScalar().ULongLong();
1058b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                Error read_error;
1059b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
1060b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1061b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                if (!read_error.Success())
1062b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                    return Value();
1063b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1064b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                value->GetScalar() = (unsigned long long)ref_value;
1065b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            }
1066b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1067b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            if (value.get())
1068b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                return *value;
1069b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            else
10701c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan                return Value();
1071b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        }
107231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        else if (parser_vars->m_lldb_sym)
1073b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        {
107431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            const Address sym_address = parser_vars->m_lldb_sym->GetAddress();
10751c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
1076b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            if (!sym_address.IsValid())
10771c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan                return Value();
1078b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1079b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            Value ret;
1080b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
10816cdedde154e8b95758596775463a086352baee63Sean Callanan            ProcessSP process_sp (m_parser_vars->m_exe_ctx.GetProcessSP());
10826cdedde154e8b95758596775463a086352baee63Sean Callanan
10836cdedde154e8b95758596775463a086352baee63Sean Callanan            if (process_sp)
10846cdedde154e8b95758596775463a086352baee63Sean Callanan            {
10856cdedde154e8b95758596775463a086352baee63Sean Callanan                uint64_t symbol_load_addr = sym_address.GetLoadAddress(&process_sp->GetTarget());
10866cdedde154e8b95758596775463a086352baee63Sean Callanan
10876cdedde154e8b95758596775463a086352baee63Sean Callanan                ret.GetScalar() = symbol_load_addr;
10886cdedde154e8b95758596775463a086352baee63Sean Callanan                ret.SetValueType(Value::eValueTypeLoadAddress);
10896cdedde154e8b95758596775463a086352baee63Sean Callanan            }
10906cdedde154e8b95758596775463a086352baee63Sean Callanan            else
10916cdedde154e8b95758596775463a086352baee63Sean Callanan            {
10926cdedde154e8b95758596775463a086352baee63Sean Callanan                uint64_t symbol_file_addr = sym_address.GetFileAddress();
10936cdedde154e8b95758596775463a086352baee63Sean Callanan
10946cdedde154e8b95758596775463a086352baee63Sean Callanan                ret.GetScalar() = symbol_file_addr;
10956cdedde154e8b95758596775463a086352baee63Sean Callanan                ret.SetValueType(Value::eValueTypeFileAddress);
10966cdedde154e8b95758596775463a086352baee63Sean Callanan            }
10971c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
1098b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            return ret;
10991c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        }
110052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo())
110152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        {
110252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
110352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
110452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            if (!frame)
110552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan                return Value();
110652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
110752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            RegisterContextSP reg_context_sp(frame->GetRegisterContextSP());
110852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
110952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            RegisterValue reg_value;
111052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
111152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            if (!reg_context_sp->ReadRegister(reg_info, reg_value))
111252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan                return Value();
111352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
111452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            Value ret;
111552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
111652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            ret.SetContext(Value::eContextTypeRegisterInfo, reg_info);
11177c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            if (reg_info->encoding == eEncodingVector)
11187c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton			{
11197c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                if (ret.SetVectorBytes((uint8_t *)reg_value.GetBytes(), reg_value.GetByteSize(), reg_value.GetByteOrder()))
11207c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton                    ret.SetScalarFromVector();
11217c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            }
11227c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton            else if (!reg_value.GetScalarValue(ret.GetScalar()))
11237c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton				return Value();
112452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
112552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            return ret;
112652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        }
11274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        else
1128b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        {
11294b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return Value();
1130b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        }
113147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
113247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else if (persistent_var_sp)
113347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
113452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        flags = persistent_var_sp->m_flags;
113552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
1136a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1137a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan             persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
113886a07da76f615533a06a797dc4539566951b58d3Sean Callanan            persistent_var_sp->m_live_sp &&
1139f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan            ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress &&
1140dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan              m_parser_vars->m_exe_ctx.GetProcessSP() &&
1141dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan              m_parser_vars->m_exe_ctx.GetProcessSP()->IsAlive()) ||
1142f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan             (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress)))
1143a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
11444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return persistent_var_sp->m_live_sp->GetValue();
1145a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
1146a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        else
1147a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
1148a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            lldb_private::Value ret;
1149a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetValueType(Value::eValueTypeHostAddress);
1150a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetContext(Value::eContextTypeInvalid, NULL);
1151a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1152a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return ret;
1153a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
115447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
115547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
115647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
115747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
115847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
115947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
116047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
11614b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue
11624b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
11634b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{
11644b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    assert(m_parser_vars.get());
11654b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
1166dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
11674b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11684b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!frame)
11694b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
11704b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11714b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    VariableList *vars = frame->GetVariableList(false);
11724b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11734b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!vars)
11744b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
11754b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11764b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    lldb::VariableSP var = vars->FindVariable(name);
11774b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11784b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!var ||
11794b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        !var->IsInScope(frame) ||
11804b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        !var->LocationIsValidForFrame (frame))
11814b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
11824b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
1183dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    std::auto_ptr<Value> value(GetVariableValue(var, NULL));
11844b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
118541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
118641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    {
1187dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
118841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
118941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        if (!process)
119041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan            return Value();
119141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
119241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        lldb::addr_t value_addr = value->GetScalar().ULongLong();
119341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        Error read_error;
119441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
119541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
119641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        if (!read_error.Success())
119741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan            return Value();
119841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
119941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        value->GetScalar() = (unsigned long long)ptr_value;
120041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    }
120141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
12024b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (value.get())
12034b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return *value;
12044b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    else
12054b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
12064b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan}
12074b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
1208810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
1209f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1210f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12118de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
12128de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
12148de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12158de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1216f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1217dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars.get())
1218dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        return false;
1219dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
1220aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
1221aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1222dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    m_material_vars->m_process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1223aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
12240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
12250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
12260ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
12270ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
12280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
1229f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1230f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
1231aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
1232f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1233f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
1234f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1235f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1236f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12378de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
12388de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
12403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
1241047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
1242047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
12438de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
12443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
1245aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1246aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1247dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1248dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1249dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1250567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1251567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL || process == NULL || target == NULL)
12523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1253e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
12543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
12553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1257aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
12583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1259e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
12603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
12613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
126339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan    const bool object_pointer = true;
126470c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan
1265567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP object_ptr_var = FindVariableInScope (*frame,
1266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
126770c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type),
126839d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                                                     object_pointer);
12693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
12713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1272e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
12733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
12743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1276dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(object_ptr_var,
1277aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
12783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
12803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
12813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
12823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
12833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
128550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
12863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
128750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
128850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
128950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
129050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
12913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
129250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1293567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
129450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
129550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
129650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
129750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
129850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
129950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
130050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
130150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
130250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
1303567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
1304c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
130550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
130650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
130750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
1308c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
130950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
13103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
131150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
13123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
131350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
131450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
131550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
131650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
131750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
131850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
131950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
132050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
132150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1322061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
132350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1324061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
132550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
132650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
132750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
132850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
132950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1330dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
133150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1332061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
133350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
1334061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
133550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
133650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
133750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1338061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
133950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1340061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
134150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
134250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
13433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
13443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
13453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
13463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
13473c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
13488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
13498de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
13510ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
13520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
13538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
13548de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1355f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1356dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    return DoMaterialize(true, stack_frame_top, stack_frame_bottom, &result_sp, err);
1357aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1358aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
1359aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
1360aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1361aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
1362aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
1363aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1364aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
1365aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
1366aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1367aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
1368aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
1369aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1370aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
1371aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1372aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
1373aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1374aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
1375aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1376aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
1377aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
1378f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1379f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
138032824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
13818de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
13828de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
13838de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
13848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
13858de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
138632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
1387aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1388aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
1389aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1390aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
139132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
139232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
139332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
139432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
1395dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1396567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1397567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!process)
139832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
139932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
140032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
140132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
140232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1403dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1404567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!target)
140532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
140632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
140732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
140832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
140932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
14103371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
14113371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
14123371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
14133371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
14143371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
14153371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
1416c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
141732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
141832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
1419567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (process->ReadMemory (m_material_vars->m_materialized_location,
1420c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
1421c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
142232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
142332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
142432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
142532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
142632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1427567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
142832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1429427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1430427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
1431427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
143232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
1433427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
143432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1435427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
1436427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
1437427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1438427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
14398c12720c108cd5e7ed792596749218d8400f647eSean Callanan
144031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
144131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
144231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        if (!jit_vars)
14438c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
14448c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1445427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
144631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                        jit_vars->m_offset,                                                          // offset
1447427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
1448427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
144931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                        jit_vars->m_size,                                                            // number of entries
1450427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
145131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                        m_material_vars->m_materialized_location + jit_vars->m_offset,               // address to print
1452427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
1453427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
145432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
145532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
145632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
145732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
145832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
145932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
146032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1461f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
14628de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
14638de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
14648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
14650ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
14660ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
1467427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
14688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
14698de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1470810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
1471427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
1472427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
1473427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1476e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
147782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1478aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
1479810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1480810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
148157067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
1482810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1483810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1484dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1485567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame)
148645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
148745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
148857067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
148945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
1490dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
149145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
1492567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
1493aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1494aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
1495e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
1496e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
1497e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1498e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1499f99355834bee84e48e2b6205ed13d307faa74405Filipe Cabecinhas        m_material_vars->m_allocated_area = 0UL;
1500e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1501e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
1502e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
1503e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1504567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
1505810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1506f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
1507f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1508dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1509aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1510f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
1511567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            process->DeallocateMemory(m_material_vars->m_materialized_location);
1512aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1513f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1514810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
15157a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
15167a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
15177a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
1518567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
15195a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                   lldb::ePermissionsReadable | lldb::ePermissionsWritable,
15205a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                   err);
1521f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1522f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
15235a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        {
15245f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
15255a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                         (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
1526f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
15275a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        }
15285a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
1529aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
1530f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1531810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1532aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
1533810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1534aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1535aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
1536810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
15388c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
15398c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1540810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
15424d0b110715d321d366dec1dc690300f713b63236Sean Callanan
154331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
154431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
154531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        if (!jit_vars)
154631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        {
154731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            err.SetErrorString("Variable being materialized doesn't have JIT state");
154831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            return false;
154931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        }
155031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
1551a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
1552336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
155325db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan            if (!member_sp->GetValueObject())
155425db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan            {
155525db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan                err.SetErrorString("Variable being materialized doesn't have a frozen version");
155625db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan                return false;
155725db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan            }
155825db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan
1559a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
1560427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
15611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
15621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
15631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1564dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
15651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
15675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                {
15685a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                    err.SetErrorString("Couldn't get register context");
15691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
15705a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                }
15715a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
1572427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
1573427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
1574427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
157531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                                               m_material_vars->m_materialized_location + jit_vars->m_offset,
1576427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
15771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
15781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
15791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
158031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            {
1581427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
15826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
15836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
158431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                                               m_material_vars->m_materialized_location + jit_vars->m_offset,
1585427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
15861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
15871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
15888c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1589a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
15908c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
1591a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
1592a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
1593a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
159445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
15956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1596a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
1597a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1598a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1599a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1601a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1602a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1604a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1605a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1606a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
1607a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
160831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                                                         m_material_vars->m_materialized_location + jit_vars->m_offset,
16090ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
16100ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1611a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1612a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1613f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1614a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1615a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1616a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
16178c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1618a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
16198c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1620810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1621810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1622f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1623f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1624f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1625a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
16268de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
16278de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
16288de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
1629427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
16308de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
16310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
16320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
16338de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
16348de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1635aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
16366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
16376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1639a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1640427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1641a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1642a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1643a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1645a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
16485a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
16495a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        err.SetErrorString("Persistent variable being materialized contains no data");
1650a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
16515a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
1652a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1653a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1654dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1655567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
16566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
16576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1658a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1659a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
16626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
16646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
16656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
16666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
16676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1669567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->ReadPointerFromMemory (addr, read_error);
16706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
16726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
16746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
16786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
16796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
16816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
16826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1683dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
168447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
168547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
168647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
168747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
168847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
168947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
16906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
16936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
16956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1698b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
16996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
17016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
17026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
170497678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
170597678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
17066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
17086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
17105f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    log->Printf("Dematerializing %s from 0x%" PRIx64 " (size = %u)", var_sp->GetName().GetCString(), (uint64_t)mem, (unsigned)pvar_byte_size);
17116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
17130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
17146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
1715567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
17166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
17186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17210ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
17220ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
17230ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
17240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
17250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
17260ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
17270ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
17280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
17290ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
17300ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
17310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
17320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
17330ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
17340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
17356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
17366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
17396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
17406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
17446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
17466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1747567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error deallocate_error = process->DeallocateMemory(mem);
17486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
17506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
17516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
17526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
17536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
17546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
17576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1758a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
17596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1760a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1761a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1762a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1763a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1764a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
17656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
17666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
17736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1774567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->AllocateMemory(pvar_byte_size,
17754b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                          lldb::ePermissionsReadable | lldb::ePermissionsWritable,
17764b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                          allocate_error);
17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
17796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
17816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
17826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
17855f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                log->Printf("Allocated %s (0x%" PRIx64 ") sucessfully", var_sp->GetName().GetCString(), mem);
17866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
17886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1789dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
179047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
179147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
179247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
179347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
179447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
179547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
17966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
17986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
18006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
18016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
18036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1804567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
18056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
18066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
18076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
18086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
18096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
18126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
18136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
18146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
18156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1816567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!process->WriteScalarToMemory (addr,
18174b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               var_sp->m_live_sp->GetValue().GetScalar(),
18184b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               process->GetAddressByteSize(),
18194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               write_error))
18206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
18216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
18236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
18246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1826c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
18276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1828696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1829a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
18306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1831a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1832a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1833a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1834a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1835a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1836a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1837a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1838f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
18398de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
18408de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
18418de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
18428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
18436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
18448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
18458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
18468de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1847f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1848e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1849dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1850dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1851dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
185231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
185331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *var_parser_vars = expr_var->GetParserVars(GetParserID());
1854567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
185531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    if (!frame || !process || !target || !m_parser_vars.get() || !var_parser_vars)
18565a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
18575a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        err.SetErrorString("Necessary state for variable materialization isn't present");
1858cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
18595a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
1860cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
18616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
18626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
18646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
18656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
186631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    VariableSP &var(var_parser_vars->m_lldb_var);
186731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    const lldb_private::Symbol *symbol = var_parser_vars->m_lldb_sym;
1868f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
18696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
18706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
1871819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
18724a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1873819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1874819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1875dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        location_value.reset(GetVariableValue(var,
1876819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1877819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
187801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    else if (symbol)
18794a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    {
1880d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        addr_t location_load_addr = GetSymbolAddress(*target, process, name, lldb::eSymbolTypeAny);
1881819749647b1605f75753f625050cb240292c08b0Sean Callanan
1882cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1883819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1884819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1885c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1886c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1887819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1888819749647b1605f75753f625050cb240292c08b0Sean Callanan
18894a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        location_value.reset(new Value);
18904a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1891819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1892819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1893819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1894819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1895f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1896c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1897c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1898f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1899f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1900f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1901841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1902fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1903fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1904fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1905fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1906fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1907fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1908fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1909c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1910c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1911c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1912c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1913fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1914f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1915f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1916f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
19178de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1918f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1919f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
192017c6a05cb96f7110332342326a90692d9505982eSean Callanan
192117c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1922f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
19236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
19246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
192517c6a05cb96f7110332342326a90692d9505982eSean Callanan
192617c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
192717c6a05cb96f7110332342326a90692d9505982eSean Callanan
192817c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1929f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
193017c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1931f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
193217c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
193317c6a05cb96f7110332342326a90692d9505982eSean Callanan
193417c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
193517c6a05cb96f7110332342326a90692d9505982eSean Callanan
1936c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1937c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1938c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
193917c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1940f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
194117c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
194217c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1943f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
19446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
194517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1946c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
19476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19486f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
19496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
19506f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    Error read_error;
19516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
19536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19546f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!read_error.Success())
19556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
19566f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
19576f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
19586f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      read_error.AsCString());
19596f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
19606f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
19616f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19626f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!process->WritePointerToMemory(addr,
19636f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       ref_value,
19646f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       write_error))
19656f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
19666f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
19676f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
19686f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
19696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
19706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
19716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
19726f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                else
19736f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
19746f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!process->WriteScalarToMemory (addr,
19756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       location_value->GetScalar(),
19766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       process->GetAddressByteSize(),
19776f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       write_error))
19786f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
19796f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
19806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
19816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
19826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
19836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
19846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
198517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1986f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
198717c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
198817c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1989f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
19906916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
199117c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
199217c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
199317c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
199417c6a05cb96f7110332342326a90692d9505982eSean Callanan
1995c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1996c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1997c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
199817c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
199917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
200017c6a05cb96f7110332342326a90692d9505982eSean Callanan
2001061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
200217c6a05cb96f7110332342326a90692d9505982eSean Callanan
2003061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
200417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
2005c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
2006c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
200717c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
200817c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
200917c6a05cb96f7110332342326a90692d9505982eSean Callanan
2010061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
2011061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
2012dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
2013061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
2014061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
201517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
2016c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
2017c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
2018c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
201917c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
202017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
202117c6a05cb96f7110332342326a90692d9505982eSean Callanan
2022061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
202317c6a05cb96f7110332342326a90692d9505982eSean Callanan
202417c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
202517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
20266f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
20276f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return true; // reference types don't need demateralizing
20286f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
20306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
20326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
20336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
20346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
20356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
20366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2037b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
20386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
20396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
20406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
20416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
20426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2043c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
204417c6a05cb96f7110332342326a90692d9505982eSean Callanan
2045c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
2046c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
2047c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
2048c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
2049061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
205017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
2051061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
2052061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
205317c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
2054c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
2055c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2056c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
205717c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
205817c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
20596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
20616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2062567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
20636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
20656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
2066c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
2067c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2068c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
20696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
20706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
20716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
207317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
207417c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
207517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
20766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                Error write_error;
20776f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20786f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                RegisterValue reg_value;
20796f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (!reg_ctx->ReadRegister (reg_info, reg_value))
20816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
20826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
20836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                  name.GetCString(),
20846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                  reg_info->name);
20856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return false;
20866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
20876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
20896f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
20906f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
20916f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      addr,
20926f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      process->GetAddressByteSize(),
20936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      reg_value);
20946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!write_error.Success())
20966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
20976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
20986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
20996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      reg_info->name,
21006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
21016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
21026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
21036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
21046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return true;
21056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
21066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
21076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
21086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
21096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
21106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
21116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2112567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Scalar reg_addr (process->AllocateMemory (value_byte_size,
21136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                          lldb::ePermissionsReadable | lldb::ePermissionsWritable,
21146f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                          allocate_error));
21156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2116c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
21176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
2118c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2119c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2120c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
21216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
21226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
21236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
21246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
21256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2126dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                expr_var->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
212747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
212847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
212947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
2130c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
213147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
213247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
21336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
21346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
21356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
2136567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
21376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   reg_addr,
21386f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   process->GetAddressByteSize(),
21396f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   write_error))
21406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
2141c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2142c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2143c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
21446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
21456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
21466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
21476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
214817c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
2149c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
2150c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2151c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
215217c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
215317c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
2154061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
2155061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
215617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
2157c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2158c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2159c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
216017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
216117c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
216217c6a05cb96f7110332342326a90692d9505982eSean Callanan
2163c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2164c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
2165c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
2166c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
2167061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
216817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
216917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
2170f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
2171f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2172f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
2173f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
2174810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
2175810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
21761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
21771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
21781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
21791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
21801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
2181b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
21821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
21831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
21841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
21851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
21861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
2187061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
21881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
21891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2190061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2191061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
21921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2193bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
21941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2197061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
21981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2199061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
22001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
22011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
22021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
22031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
22041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
22051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2206061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
22071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2208061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
22091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
22101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
22111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2212061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2213061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
22141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
221595b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
22161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
22171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
22181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
22191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
22201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
22211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
22221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2223696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
22248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
22258de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
22268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
22278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
222870c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan    TypeFromUser *type,
222939d1af981f6a76603356fd84b2e9372a9172297cSean Callanan    bool object_pointer
22308de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2231aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
2232e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2233cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
2234f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    ValueObjectSP valobj;
2235f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    VariableSP var_sp;
2236f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    Error err;
2237f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan
2238f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2239f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     eNoDynamicValues,
2240f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     StackFrame::eExpressionPathOptionCheckPtrVsMember,
2241f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     var_sp,
2242f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     err);
22433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
2244f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    if (!err.Success() ||
2245f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan        !var_sp ||
2246ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
2247ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
2248ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
22493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
22504207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan    if (var_sp)
22513bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
22524207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan        if (!type)
22534207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            return var_sp;
22544207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
225539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        TypeFromUser candidate_type(var_sp->GetType()->GetClangFullType(),
225639d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                                    var_sp->GetType()->GetClangAST());
225739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
225839d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        if (candidate_type.GetASTContext() != type->GetASTContext())
22593bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
226039d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            if (log)
226139d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                log->PutCString("Skipping a candidate variable because of different AST contexts");
226239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            return lldb::VariableSP();
226339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        }
226439d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
226539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        if (object_pointer)
226639d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        {
226739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            clang::QualType desired_qual_type = clang::QualType::getFromOpaquePtr(type->GetOpaqueQualType());
226839d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            clang::QualType candidate_qual_type = clang::QualType::getFromOpaquePtr(candidate_type.GetOpaqueQualType());
226939d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
22704207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            const clang::ObjCObjectPointerType *desired_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
22714207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            const clang::ObjCObjectPointerType *candidate_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
22724207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
22734207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            if (desired_objc_ptr_type && candidate_objc_ptr_type) {
22744207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                clang::QualType desired_target_type = desired_objc_ptr_type->getPointeeType().getUnqualifiedType();
22754207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                clang::QualType candidate_target_type = candidate_objc_ptr_type->getPointeeType().getUnqualifiedType();
22764207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
22774207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                if (ClangASTContext::AreTypesSame(type->GetASTContext(),
22784207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                                                  desired_target_type.getAsOpaquePtr(),
22794207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                                                  candidate_target_type.getAsOpaquePtr()))
22804207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                    return var_sp;
22814207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            }
22824207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
228339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            const clang::PointerType *desired_ptr_type = desired_qual_type->getAs<clang::PointerType>();
228439d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            const clang::PointerType *candidate_ptr_type = candidate_qual_type->getAs<clang::PointerType>();
228539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
22864207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            if (desired_ptr_type && candidate_ptr_type) {
22874207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                clang::QualType desired_target_type = desired_ptr_type->getPointeeType().getUnqualifiedType();
22884207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                clang::QualType candidate_target_type = candidate_ptr_type->getPointeeType().getUnqualifiedType();
22894207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
22904207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                if (ClangASTContext::AreTypesSame(type->GetASTContext(),
22914207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                                                  desired_target_type.getAsOpaquePtr(),
22924207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                                                  candidate_target_type.getAsOpaquePtr()))
22934207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                    return var_sp;
22944207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            }
229539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
22964207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            return lldb::VariableSP();
22973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
22983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
22993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
23004207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            if (ClangASTContext::AreTypesSame(type->GetASTContext(),
230139d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                                               type->GetOpaqueQualType(),
230239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                                               var_sp->GetType()->GetClangFullType()))
23034207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                return var_sp;
23043bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
23053bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
23063bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
23074207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan    return lldb::VariableSP();
2308cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
2309336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
231001e6a58b057676d5dc434876dbb2d54871bb962eGreg Claytonconst Symbol *
231101e6a58b057676d5dc434876dbb2d54871bb962eGreg ClaytonClangExpressionDeclMap::FindGlobalDataSymbol (Target &target,
231201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                              const ConstString &name)
2313819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2314819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
2315819749647b1605f75753f625050cb240292c08b0Sean Callanan
231601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
2317819749647b1605f75753f625050cb240292c08b0Sean Callanan
231801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    const uint32_t matches = sc_list.GetSize();
231901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    for (uint32_t i=0; i<matches; ++i)
2320819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2321819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
232201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
232301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        if (sym_ctx.symbol)
232401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        {
232501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            const Symbol *symbol = sym_ctx.symbol;
232601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            const Address *sym_address = &symbol->GetAddress();
232701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton
232801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            if (sym_address && sym_address->IsValid())
232901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            {
233001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                switch (symbol->GetType())
233101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                {
233201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeData:
233301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeRuntime:
233401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeAbsolute:
233501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeObjCClass:
233601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeObjCMetaClass:
233701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeObjCIVar:
233801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        if (symbol->GetDemangledNameIsSynthesized())
233901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        {
234001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                            // If the demangled name was synthesized, then don't use it
234101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                            // for expressions. Only let the symbol match if the mangled
234201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                            // named matches for these symbols.
234301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                            if (symbol->GetMangled().GetMangledName() != name)
234401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                break;
234501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        }
234601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        return symbol;
234701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton
234801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeCode: // We already lookup functions elsewhere
234901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeVariable:
235001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeLocal:
235101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeParam:
235201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeTrampoline:
235301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeInvalid:
235401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeException:
235501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeSourceFile:
235601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeHeaderFile:
235701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeObjectFile:
235801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeCommonBlock:
235901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeBlock:
236001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeVariableType:
236101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeLineEntry:
236201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeLineHeader:
236301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeScopeBegin:
236401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeScopeEnd:
236501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeAdditional:
236601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeCompiler:
236701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeInstrumentation:
236801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeUndefined:
236901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        break;
237001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                }
237101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            }
237201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        }
2373819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2374819749647b1605f75753f625050cb240292c08b0Sean Callanan
2375819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
2376819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2377819749647b1605f75753f625050cb240292c08b0Sean Callanan
237847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
237947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
238047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
238147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
238294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
238394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
238494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
238547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
238647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
238747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
238847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
238947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
239094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
239194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
239294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
239394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
239447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
239547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
239647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
239747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
239847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
239947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
240047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
240147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
240247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
240347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
240447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                {
240547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
240647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        return var_sp;
240747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                }
240847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
240947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
241047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
241147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
241247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
241347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
241447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
241547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
241647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
241747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
241847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
242047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
242116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
2422f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2424f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
2425f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
2426f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
2427f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
2428e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24309394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (GetImportInProgress())
2431ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
243267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
2433ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
2434ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
2435ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
2436e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
243767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    static unsigned int invocation_id = 0;
243867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    unsigned int current_id = invocation_id++;
243967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
244016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
244116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
244216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
24439394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
244416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
24459394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
244616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
24479394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
244816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
24499394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
245016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
245116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
245273b520f4f60dca58e58e446c9504d45384ee677bSean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
2453a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
245467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
24555a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            log->Printf("  CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
245667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
245767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        namespace_map.get(),
245867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)namespace_map->size());
2459a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2460a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        if (!namespace_map)
2461a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            return;
2462a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan
246316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
246416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
246516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
246616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
246716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
24689394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Searching namespace %s in module %s",
246967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            current_id,
247016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
247116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
247216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
2473c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan            FindExternalVisibleDecls(context,
2474c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->first,
2475c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->second,
247667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     current_id);
247716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
247816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2479e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan    else if (isa<TranslationUnitDecl>(context.m_decl_context))
248016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
248116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
248216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
248316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
24849394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("  CEDM::FEVD[%u] Searching the root namespace", current_id);
248516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
248616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
248716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
248816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
248967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 current_id);
249016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2491a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
24929394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (!context.m_found.variable)
24939394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        ClangASTSource::FindExternalVisibleDecls(context);
249416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
249516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
249616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
249716b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
249838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                                  lldb::ModuleSP module_sp,
249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
250067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  unsigned int current_id)
250116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
2502f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
250316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
250416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
25059394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
2506e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25089394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
25099394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
25103bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
25113bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
25123bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
25133bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
25149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
25158f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    static ConstString id_name("id");
25168f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    static ConstString Class_name("Class");
25178f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
25188f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    if (name == id_name || name == Class_name)
25198f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        return;
25208f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
25218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
25228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
2523dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2524dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
252503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
25263cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
252757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
252847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
252957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
253057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
253157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
253275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
253375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (frame == NULL)
253447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
253547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
253675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
253757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
253875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (!sym_ctx.function)
253957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
254057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2541b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // Get the block that defines the function
2542b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            Block *function_block = sym_ctx.GetFunctionBlock();
2543b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2544b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (!function_block)
2545b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                return;
2546b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2547b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            clang::DeclContext *decl_context = function_block->GetClangDeclContext();
254857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
254975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (!decl_context)
255057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
255157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
255275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
255357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2554c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham            if (method_decl)
25553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
255657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2557c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                clang::CXXRecordDecl *class_decl = method_decl->getParent();
2558c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2559c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                QualType class_qual_type(class_decl->getTypeForDecl(), 0);
2560c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2561c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
2562c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                              &class_decl->getASTContext());
2563c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2564c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (log)
2565c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
2566c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    ASTDumper ast_dumper(class_qual_type);
2567c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    log->Printf("  CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
2568c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
2569c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2570c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                AddOneType(context, class_user_type, current_id, true);
2571c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2572c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (method_decl->isInstance())
2573c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
2574c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    // self is a pointer to the object
2575c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2576c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
2577c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2578c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2579c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                &method_decl->getASTContext());
2580c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2581c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    m_struct_vars->m_object_pointer_type = self_user_type;
2582c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
2583c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham            }
2584c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham            else
2585bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan            {
2586c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // This branch will get hit if we are executing code in the context of a function that
2587c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
2588c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // method of the class.  In that case, just look up the "this" variable in the the current
2589c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // scope and use its type.
2590c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer
2591c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // for C++ so it hasn't actually been tested.
2592bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
2593c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                VariableList *vars = frame->GetVariableList(false);
2594bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
2595c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
2596bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
2597c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (this_var &&
2598c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    this_var->IsInScope(frame) &&
2599c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    this_var->LocationIsValidForFrame (frame))
2600c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
2601c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    Type *this_type = this_var->GetType();
2602c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2603c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    if (!this_type)
2604c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        return;
2605c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2606c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    QualType this_qual_type = QualType::getFromOpaquePtr(this_type->GetClangFullType());
2607c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    const PointerType *class_pointer_type = this_qual_type->getAs<PointerType>();
2608c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2609c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    if (class_pointer_type)
2610c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    {
2611c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        QualType class_type = class_pointer_type->getPointeeType();
2612c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2613c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        if (log)
2614c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        {
2615c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                            ASTDumper ast_dumper(this_type->GetClangFullType());
2616c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                            log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2617c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        }
2618c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2619c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        TypeFromUser class_user_type (class_type.getAsOpaquePtr(),
2620c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                        this_type->GetClangAST());
2621c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        AddOneType(context, class_user_type, current_id, false);
2622c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2623c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2624c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        TypeFromUser this_user_type(this_type->GetClangFullType(),
2625c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                    this_type->GetClangAST());
2626c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2627c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        m_struct_vars->m_object_pointer_type = this_user_type;
2628c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        return;
2629c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    }
2630c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
2631bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan            }
2632bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
263357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
263457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
263557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
26363aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
26373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
26383aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
26393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
26403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2641567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
264247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
2643e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2644e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
264547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2646e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!sym_ctx.function)
2647e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                return;
264803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2649b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // Get the block that defines the function
2650b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            Block *function_block = sym_ctx.GetFunctionBlock();
2651e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2652b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (!function_block)
2653b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                return;
2654b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2655b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            clang::DeclContext *decl_context = function_block->GetClangDeclContext();
2656e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2657e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!decl_context)
26583aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
265903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2660e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2661e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2662c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham            if (method_decl)
2663e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            {
2664c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2665c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
266675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
2667c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (!self_interface)
266875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                    return;
266975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
2670c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                const clang::Type *interface_type = self_interface->getTypeForDecl();
2671c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2672c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2673c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                             &method_decl->getASTContext());
267475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
2675c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (log)
2676c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
2677c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    ASTDumper ast_dumper(interface_type);
2678c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2679c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
2680c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2681c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                AddOneType(context, class_user_type, current_id, false);
2682c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2683c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (method_decl->isInstanceMethod())
2684c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
2685c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    // self is a pointer to the object
2686c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2687c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
2688c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2689c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2690c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                &method_decl->getASTContext());
2691c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2692c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    m_struct_vars->m_object_pointer_type = self_user_type;
2693c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
2694c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                else
2695c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
2696c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    // self is a Class pointer
2697c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    QualType class_type = method_decl->getASTContext().getObjCClassType();
2698c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2699c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
2700c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                &method_decl->getASTContext());
2701c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2702c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    m_struct_vars->m_object_pointer_type = self_user_type;
2703c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
2704c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2705c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                return;
270675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            }
270775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            else
270875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            {
2709c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // This branch will get hit if we are executing code in the context of a function that
2710c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
2711c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // method of the class.  In that case, just look up the "self" variable in the the current
2712c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // scope and use its type.
2713c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2714c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                VariableList *vars = frame->GetVariableList(false);
271575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
2716c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
271775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
2718c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (self_var &&
2719c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    self_var->IsInScope(frame) &&
2720c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    self_var->LocationIsValidForFrame (frame))
2721c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
2722c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    Type *self_type = self_var->GetType();
2723c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2724c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    if (!self_type)
2725c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        return;
2726c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2727c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    QualType self_qual_type = QualType::getFromOpaquePtr(self_type->GetClangFullType());
2728c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    const ObjCObjectPointerType *class_pointer_type = self_qual_type->getAs<ObjCObjectPointerType>();
2729c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2730c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    if (class_pointer_type)
2731c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    {
2732c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        QualType class_type = class_pointer_type->getPointeeType();
2733c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2734c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        if (log)
2735c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        {
2736c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                            ASTDumper ast_dumper(self_type->GetClangFullType());
2737c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                            log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2738c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        }
2739c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2740c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        TypeFromUser class_user_type (class_type.getAsOpaquePtr(),
2741c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                        self_type->GetClangAST());
2742c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        AddOneType(context, class_user_type, current_id, false);
2743c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2744c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2745c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        TypeFromUser self_user_type(self_type->GetClangFullType(),
2746c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                    self_type->GetClangAST());
2747c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
2748c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        m_struct_vars->m_object_pointer_type = self_user_type;
2749c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        return;
2750c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    }
2751c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
275275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            }
275375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
27543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
27553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
2756c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
2757c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
2758c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2759c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
276003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
27612431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
27622431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
2763567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
27642431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
27652431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2766567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
27672431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27682431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
27692431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
27702431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27712431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
27722431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27732431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
27742431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
27752431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27762431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
277703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
27782431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
27792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
27802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2781e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
27822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27832431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
27842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
27852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
27872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27882431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
27892431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
27902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
27929394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
27932431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
27942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
27952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
27962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2797427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
279803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2799427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
28001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
280167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            AddOneVariable(context, pvar_sp, current_id);
28021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
28031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
28041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
28051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
28061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2807dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        if (m_parser_vars->m_exe_ctx.GetRegisterContext())
28081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2809dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
28109394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
28111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
2812e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            {
2813e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                if (log)
28149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                    log->Printf("  CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
2815e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan
281667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneRegister(context, reg_info, current_id);
2817e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            }
28181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
28198de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
282003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
282103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
282203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
282303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
282403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
282503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
282603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
282703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
282803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
282903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
2830a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember
2831a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                                                              | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
283203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
283303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
283403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
283503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
2836b386d82334b65fb984348f2027b1cb7714de993fSean Callanan            if (err.Success() && var)
283703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
283889e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                AddOneVariable(context, var, valobj, current_id);
283916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
28403a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan                return;
284103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
284203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
28431c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan
28441c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan        if (target)
284503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
284694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
284738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                      module_sp,
284894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
284994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
285003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
285103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
285203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
285303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
2854f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan                valobj = ValueObjectVariable::Create(target, var);
285589e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                AddOneVariable(context, var, valobj, current_id);
285616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
28571c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan                return;
285803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
285903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
286003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
286116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan        if (!context.m_found.variable)
286203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
2863302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan            const bool include_inlines = false;
286403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
2865a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
286638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            if (namespace_decl && module_sp)
2867a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
286851cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan                const bool include_symbols = false;
286951cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan
287038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                module_sp->FindFunctions(name,
287138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         &namespace_decl,
287238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         eFunctionNameTypeBase,
287338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         include_symbols,
2874302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                                         include_inlines,
287538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         append,
287638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         sc_list);
2877a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
28786f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            else if (target && !namespace_decl)
2879a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
288051cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan                const bool include_symbols = true;
288151cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan
28822975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                // TODO Fix FindFunctions so that it doesn't return
28832975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                //   instance methods for eFunctionNameTypeBase.
28842975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
2885a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
2886a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  eFunctionNameTypeBase,
2887a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
2888302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                                                  include_inlines,
2889a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
2890a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
2891a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2892a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
289303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
289403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
289503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
289603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
289703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
289803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
289903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
290003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
290103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
290203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
290303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
290403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
290503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
290603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
29072975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
29082975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
29092975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        // Filter out class/instance methods.
29102975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
29112975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                            continue;
29122975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
29132975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                            continue;
29142975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
291503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
291603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // overloaded
291716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        if (!context.m_found.function_with_type_info)
291867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            AddOneFunction(context, sym_ctx.function, NULL, current_id);
291916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function_with_type_info = true;
292016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
292103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
292203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
292303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
292403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
292503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
292603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
292703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
292803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
292903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
293003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
293116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                if (!context.m_found.function_with_type_info)
293203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
293303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
293403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
293567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, generic_symbol, current_id);
293616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
293703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
293803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
293903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
294067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, non_extern_symbol, current_id);
294116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
294203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
294303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
294403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
294503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2946647fefd71c4364342aa116e45418592667fb8265Sean Callanan            if (!context.m_found.variable && !namespace_decl)
294703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
294816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
294903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
295003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
295101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
295203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
295303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
295403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
295567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    AddOneGenericVariable(context, *data_symbol, current_id);
295616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                    context.m_found.variable = true;
295703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
295803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
295903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
2960b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan    }
296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2962e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
296369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callananstatic clang_type_t
296469716a233f3240978bdbd7a8b682b31e7e07e498Sean CallananMaybePromoteToBlockPointerType
296569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan(
296669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    ASTContext *ast_context,
296769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    clang_type_t candidate_type
296869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan)
296969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan{
297069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!candidate_type)
297169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
297269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
297369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
297469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
297569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
297669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
297769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!candidate_pointer_type)
297869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
297969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
298069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
298169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
298269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
298369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
298469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_type)
298569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
298669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
298769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
298869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
298969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_decl->isRecord())
299069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
299169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
299269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
299369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
299469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
299569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
299669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
299769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
299869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    return block_pointer_type.getAsOpaquePtr();
299969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan}
300069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
3001336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
30028de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
30038de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
30044a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var,
30059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
30068de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
30078de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
30088de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3010e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
30116184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3016810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
3017810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
3018336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3025810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
3026810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
3027336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3032b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3034810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
3035810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
3036336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
303869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
30393418bfeeafef91b67a62f536d0ff4bbdb4d0d440Enrico Granata    // commented out because of <rdar://problem/11024417>
30403418bfeeafef91b67a62f536d0ff4bbdb4d0d440Enrico Granata    //var_opaque_type = MaybePromoteToBlockPointerType (ast, var_opaque_type);
304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3042336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
3043336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3046178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
3047178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
3048dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
3049567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3050178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
3051178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
3052178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
3053178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
3054567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
3055178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3058dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!var_location_expr.Evaluate(&m_parser_vars->m_exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3060810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
3061810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
3062336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3064b01000fd063629facd45044f137446fb748ee179Greg Clayton
306558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
3066336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
3067f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
3068f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
3069b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
3070f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
30714b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
30724b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
30734b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
30744b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
30754b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
30764b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
30774b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
30784b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
3079f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
3080f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
3081f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
3082336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
3083336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
30866916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
308724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
3092336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
3094336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
3099336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
3100336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
310547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
310647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
310747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->GetScalar() = load_addr;
310847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->SetValueType(Value::eValueTypeLoadAddress);
310947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3112f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
3113b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
3114336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
3115336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
3116336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
3117336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
3118336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
311989e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
3120336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
3121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3123e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
312447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
3125f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
3126f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
3127336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
3128dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Value *var_location = GetVariableValue (var,
3129f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                            m_ast_context,
31308de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
31318de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
3132336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
3133e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
3134e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan
313530a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan    if (parser_opaque_type.isNull())
313630a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan        return;
313730a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan
3138e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
3139e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    {
3140e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan        if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
3141e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan            CompleteType(tag_type->getDecl());
3142e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    }
3143e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan
31444b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
31454b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
31464b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
31476f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    NamedDecl *var_decl;
31486f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
31496f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
31506f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
31516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
31526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
31536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    else
31546f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
31556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
31568de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
3157427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
315889e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
315989e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan
3160427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
316131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    entity->EnableParserVars(GetParserID());
316231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
316331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = pt;
316431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl  = var_decl;
316531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value  = NULL;
316631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_value  = var_location;
316731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_var    = var;
316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
31706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
31716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
3172810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
31738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3174aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan        ASTDumper orig_dumper(ut.GetOpaqueQualType());
3175a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
3176aa56141b061ca23a447d48c27bf1f35017405376Sean 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());
31778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
31788f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
31798f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
31808f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
3181a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
318267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       ClangExpressionVariableSP &pvar_sp,
318367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       unsigned int current_id)
3184a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
3185e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
318645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
3187427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
3188a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
3189f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    TypeFromParser parser_type (GuardedCopyType(m_ast_context,
3190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
3191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
3192f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
3193a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
3194dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!parser_type.GetOpaqueQualType())
3195dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
3196dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
3197dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("  CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
3198dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return;
3199dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
3200dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
32016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
32028c12720c108cd5e7ed792596749218d8400f647eSean Callanan
320331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    pvar_sp->EnableParserVars(GetParserID());
320431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID());
320531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = parser_type;
320631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl  = var_decl;
320731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value  = NULL;
320831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_value  = NULL;
320945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
321045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
3211a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
3212a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
32139394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
3214a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
3215a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
3216a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
32171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
3218819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
321901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                              const Symbol &symbol,
322067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              unsigned int current_id)
3221819749647b1605f75753f625050cb240292c08b0Sean Callanan{
3222819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
3223819749647b1605f75753f625050cb240292c08b0Sean Callanan
3224819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3225819749647b1605f75753f625050cb240292c08b0Sean Callanan
3226dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
3227567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3228567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
3229567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
3230567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3231567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
3232819749647b1605f75753f625050cb240292c08b0Sean Callanan
323343a5fb4ba2d20b6b63aea4fa794540c711a8ec72Greg Clayton    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, false)),
3234819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
3235819749647b1605f75753f625050cb240292c08b0Sean Callanan
323643a5fb4ba2d20b6b63aea4fa794540c711a8ec72Greg Clayton    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(m_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, false)),
3237f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
3238819749647b1605f75753f625050cb240292c08b0Sean Callanan
3239fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
3240819749647b1605f75753f625050cb240292c08b0Sean Callanan
3241819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
3242819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
3243dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
3244819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
3245819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
324647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
324747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3248819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
3249819749647b1605f75753f625050cb240292c08b0Sean Callanan
3250819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
3251819749647b1605f75753f625050cb240292c08b0Sean Callanan
325201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    const Address &symbol_address = symbol.GetAddress();
3253567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
3254819749647b1605f75753f625050cb240292c08b0Sean Callanan
3255819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3256819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
3257819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
3258819749647b1605f75753f625050cb240292c08b0Sean Callanan
325931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    entity->EnableParserVars(GetParserID());
326031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
326131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = parser_type;
326231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl  = var_decl;
326331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value  = NULL;
326431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_value  = symbol_location.release();
326531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_sym    = &symbol;
3266819749647b1605f75753f625050cb240292c08b0Sean Callanan
3267819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
3268819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
3269a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
3270819749647b1605f75753f625050cb240292c08b0Sean Callanan
32719394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
3272819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
3273819749647b1605f75753f625050cb240292c08b0Sean Callanan}
3274819749647b1605f75753f625050cb240292c08b0Sean Callanan
3275fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
3276fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
3277fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
3278fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3279dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
3280567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3281567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
3282fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3283fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
3284fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
3285fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
3286fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
3287fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
3288fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
328931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
329031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
3291fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
3292fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
329331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            const NamedDecl *named_decl = parser_vars->m_named_decl;
3294fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
3295fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3296fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
3297fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
3298fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
3299fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
3300fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
3301fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
3302fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3303fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
3304fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
3305a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
3306a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
3307fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
3308fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3309fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
3310fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
3311fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
33125a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
3313fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3314dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            if (!copied_type)
3315dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            {
3316dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                if (log)
3317dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                    log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
3318dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
33199880efacdd3a5e855b405d89433a01170422a889Jim Ingham                return (bool) lldb::ClangExpressionVariableSP();
3320dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            }
3321dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3322fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
3323fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
332431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
332531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            parser_vars->m_parser_type = parser_type;
3326fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3327fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
3328fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
3329fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3330fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
3331fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
3332fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
3333fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3334fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
3335fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
3336fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3337819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
3338427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
333967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        const RegisterInfo *reg_info,
334067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
33411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
33421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
33431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3344f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
33451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
33461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
33471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
33481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
33491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
3350122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
335167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
33521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
33531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
33541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
3356f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
33571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
33581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
33591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3360dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
336147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
336247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3363427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
33641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
3365427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
3366427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
336731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    entity->EnableParserVars(GetParserID());
336831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
336931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = parser_type;
337031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl  = var_decl;
337131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value  = NULL;
337231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_value  = NULL;
337352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan    entity->m_flags |= ClangExpressionVariable::EVBareRegister;
33741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
337552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan    if (log)
33761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
3377a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
33789394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
33791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
33801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
33811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3382a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
3383da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3384da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
338567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        Symbol* symbol,
338667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
33878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
3388aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3389aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3390e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
33918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
339258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
33930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
339458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
33958f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
33960fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
33970fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
33989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
33998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
34000fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
34010fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
34020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
34030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
34040fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
34050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
34060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
340767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no type");
34080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
34090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
34100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
341104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
34120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
34130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
34140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
34150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
341667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no Clang type");
34170fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
34180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
34190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
34200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
34210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
3422b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
3423f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan        void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
3424a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        if (copied_type)
3425a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
3426a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            fun_decl = context.AddFunDecl(copied_type);
3427a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
3428a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        else
3429a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
3430a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            // We failed to copy the type we found
3431a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            if (log)
3432a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            {
34335f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                log->Printf ("  Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt",
3434a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetName().GetCString(),
3435a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetID());
3436a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            }
343716089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan
343816089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan            return;
3439a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
34400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
34410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
34420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
34430c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        fun_address = &symbol->GetAddress();
34440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
34450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
34460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
34478f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
3448810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
344967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->PutCString("  AddOneFunction called with no function and no symbol");
34508f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
34518f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
34528f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3453dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
3454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
34568f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
34578f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
34588f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3459dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
346047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
346147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3462427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
34638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
3464427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
3465427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
3466427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
3467427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
346831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    entity->EnableParserVars(GetParserID());
346931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
347031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl  = fun_decl;
347131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value  = NULL;
347231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_value  = fun_location.release();
34738c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3474810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
34758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3476a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(fun_decl);
3477a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
34782975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        StreamString ss;
34792975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
34802975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
34812975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
34822975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
348367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    current_id,
348467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    (fun ? "specific" : "generic"),
34852975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                    decl_name.c_str(),
34862975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                    ss.GetData(),
3487a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                    ast_dumper.GetCString());
34888de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
349093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
349193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
349293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
34933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
349467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                   unsigned int current_id,
34953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
349693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
3497f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    ASTContext *parser_ast_context = m_ast_context;
34989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
34993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3500ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
3501dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3502dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!copied_type)
3503dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
3504dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3505dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3506dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
3507dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3508dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3509dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return;
3510dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
35119394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
35123356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton    if (add_method && ClangASTContext::IsAggregateType(copied_type) && ClangASTContext::GetCompleteType (parser_ast_context, copied_type))
35133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
35143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
35153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
35163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
35173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3518716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan        clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3519716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        ClangASTContext::GetBuiltInType_void(parser_ast_context),
3520716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        args,
3521716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        1,
3522716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        false,
3523716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        ClangASTContext::GetTypeQualifiers(copied_type));
3524716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan
35251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
35261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
35271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
352830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
352928ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan        const bool is_attr_used = true;
35302581dbf7292c6272bb771fe396ab30921385d669Sean Callanan        const bool is_artificial = false;
353130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
35321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
35331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
35348de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
35351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
35361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
35371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
35381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
353930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
3540716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                   is_explicit,
35412581dbf7292c6272bb771fe396ab30921385d669Sean Callanan                                                   is_attr_used,
35422581dbf7292c6272bb771fe396ab30921385d669Sean Callanan                                                   is_artificial);
35433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
354493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
354593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
354693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
3547