ClangExpressionDeclMap.cpp revision 06dc17f8eb821d7256fd42e56f85c2779a29f689
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"
43810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
4417c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
46f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
493bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5373b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
5473b520f4f60dca58e58e446c9504d45384ee677bSean Callanan    ClangASTSource (exe_ctx.GetTargetSP()),
558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
568de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
57dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_keep_result_in_memory (keep_result_in_memory),
58aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
59dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_struct_vars ()
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
65aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    // Note: The model is now that the parser's AST context and all associated
676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   data does not vanish until the expression has been executed.  This means
686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   that valuable lookup data (like namespaces) doesn't vanish, but
696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
706d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    DidParse();
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
75166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool
76427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
778c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
78aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
79dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    m_parser_vars->m_exe_ctx = exe_ctx;
80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx.GetFramePtr())
83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetThreadPtr())
85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
86567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetProcessPtr())
87987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
88987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
89567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
90987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
91567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (target)
92987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
93987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
94567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
95987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
9697ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan
97567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
100166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!target->GetScratchClangASTContext())
102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            return false;
103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
104166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    m_parser_vars->m_target_info = GetTargetInfo();
10647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
107166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    return true;
108aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
109c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
110427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
111427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
115427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
118aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp &&
121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars.get() &&
122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars->m_lldb_value)
123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                delete var_sp->m_parser_vars->m_lldb_value;
124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp->DisableParserVars();
126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
128427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
133427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
134427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                pvar_sp->DisableParserVars();
135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
137aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1387a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo
14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo()
14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo ret;
14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
150dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
151dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
152dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = exe_ctx.GetProcessPtr();
153dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (process)
15447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
155dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        ret.byte_order = process->GetByteOrder();
156dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        ret.address_byte_size = process->GetAddressByteSize();
157dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    }
158dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    else
159dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    {
160dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        Target *target = exe_ctx.GetTargetPtr();
161dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        if (target)
162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
163dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            ret.byte_order = target->GetArchitecture().GetByteOrder();
164dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
167dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return ret;
16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1718de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
17382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
177427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
182aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
18382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
18482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
191166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
192dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
193dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
194dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
195dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
196dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!target)
197dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        return ClangExpressionVariableSP();
198567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
199567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
20005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2015a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    TypeFromUser user_type(m_ast_importer->CopyType(context,
2025a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetASTContext(),
2035a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetOpaqueQualType()),
20405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
20547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
206dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!user_type.GetOpaqueQualType())
207dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
208dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
209dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
210dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
211dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result");
212dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
213dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return lldb::ClangExpressionVariableSP();
214dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
215dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
216dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
217fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
2180e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
21947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
22047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
2210e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2230e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
2240e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2250e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
2260e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2280e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
2290e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
2300e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
23347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
23405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
2350e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
23905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
24005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2412bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen    for (size_t byte_idx = 0;
24205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
24305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
24405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
24505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
24605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
24805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
24947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (m_parser_vars->m_target_info.byte_order)
25005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
2510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
2520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
2530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
2540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
2550e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
2600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
2610e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2620e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
2630e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
26405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
26505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
2666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2700e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2710e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
27205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
27305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
274696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP
275696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
2769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                           VarDecl *decl,
277696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           lldb_private::TypeFromParser type)
278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{
279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    assert (m_parser_vars.get());
280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
283dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
284dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
285567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
286567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
287567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
288567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
294696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return ClangExpressionVariableSP();
297696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
2985a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    TypeFromUser user_type(m_ast_importer->CopyType(context,
2995a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetASTContext(),
3005a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                    type.GetOpaqueQualType()),
301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                           context);
302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
303dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!user_type.GetOpaqueQualType())
304dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
305dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
306dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
307dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
308dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result");
309dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
310dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return lldb::ClangExpressionVariableSP();
311dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
312dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser var_type = var_sp->GetTypeFromUser();
314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
315dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = exe_ctx.GetFramePtr();
316567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL)
317567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
318567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
319567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var)
322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
324567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_valobj)
327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_casted_valobj)
332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (log)
335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    {
336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        StreamString my_stream_string;
337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           var_type.GetOpaqueQualType(),
340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           &my_stream_string);
341696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
342696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
343696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
344696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    }
345696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
346696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
347696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
348696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!pvar_sp)
349696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
350696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
351696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
352696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
353696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
354696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
355696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
356696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
357696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
358696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return pvar_sp;
359696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan}
360696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name)
36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                lldb_private::Value &value,
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                const ConstString &name,
373a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                lldb_private::TypeFromParser type,
374557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                                                bool transient,
375557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan                                                bool maybe_make_load)
37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!pvar_sp)
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
383557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
384557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    if (maybe_make_load &&
385557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        value.GetValueType() == Value::eValueTypeFileAddress &&
386dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        m_parser_vars->m_exe_ctx.GetProcessPtr())
387557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    {
388557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        value.SetValueType(Value::eValueTypeLoadAddress);
389557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    }
39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
392a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !pvar_sp->m_live_sp &&
393a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !transient)
39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        // The reference comes from the program.  We need to set up a live SP for it.
39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
397dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen        unsigned long long address = value.GetScalar().ULongLong();
398dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen        AddressType address_type = value.GetValueAddressType();
399dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen
400dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetASTContext(),
40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetName(),
404dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen                                                            address,
405dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen                                                            address_type,
40647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetByteSize());
40747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->ValueUpdated();
41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const size_t pvar_byte_size = pvar_sp->GetByteSize();
41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        uint8_t *pvar_data = pvar_sp->GetValueBytes();
41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
4168f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        if (!ReadTarget(pvar_data, value, pvar_byte_size))
4178f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan            return false;
41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    valobj = pvar_sp;
42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return true;
42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
4278f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananvoid
4288f2e392e8937aaf66f91201dc5f4190d61902c67Sean CallananClangExpressionDeclMap::RemoveResultVariable
4298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan(
4308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    const ConstString &name
4318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan)
4328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan{
4338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
4348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    m_parser_vars->m_persistent_vars->RemovePersistentVariable(pvar_sp);
4358f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan}
4368f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
4378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
4388de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
4398de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4418de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
4458de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
446a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
447aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
448aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
450dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
451dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
452567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
453567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
456a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
4570539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan    TypeFromUser user_type(m_ast_importer->DeportType(context,
4580539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan                                                      parser_type.GetASTContext(),
4590539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan                                                      parser_type.GetOpaqueQualType()),
46097678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
4615a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
4625a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    if (!user_type.GetOpaqueQualType())
4635a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
4645a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        if (log)
4655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            log->Printf("Persistent variable's type wasn't copied successfully");
4665a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        return false;
4675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
46847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
46947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
471a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
472dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
473fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
474427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
47647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
4778c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4788c12720c108cd5e7ed792596749218d8400f647eSean Callanan
479427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan
481427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4838c12720c108cd5e7ed792596749218d8400f647eSean Callanan
484bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan    var_sp->m_frozen_sp->SetHasCompleteType();
485bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan
4866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
4876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
4886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
4906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
4926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
4946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
4986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
4996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
5006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
5016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
5026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
5036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
504427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
5058c12720c108cd5e7ed792596749218d8400f647eSean Callanan
506427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
507427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
5088c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5098c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
510a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
511a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
512a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
5138de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
5148de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
5168de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
5178de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
5188de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
5198de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
5208de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
522aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
523aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
525e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
52645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
527aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
5288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5298c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
5308c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
5318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
532427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
5338c12720c108cd5e7ed792596749218d8400f647eSean Callanan
534427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
535427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
5368c12720c108cd5e7ed792596749218d8400f647eSean Callanan
537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
5388c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
5398c12720c108cd5e7ed792596749218d8400f647eSean Callanan
54045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
5415a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
54245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
5438de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
544427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
54545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
5468c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
5478c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
548427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
5498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
550427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
551427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
552427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
5538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
5558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
562aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
563aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
569aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
570aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
5718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
572427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
5738c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5748c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
5758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
576427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
577427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
578427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
579427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
580427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
5818c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5838c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
584427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
5858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
5888c12720c108cd5e7ed792596749218d8400f647eSean Callanan
589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
5918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
5928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
593aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
595aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
5968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5998de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
6008de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
6028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
6038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
6048de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
6058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
606aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
607aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
608aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
6098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
611427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
612aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
613aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
6148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
6188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
6198de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
6208de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
6228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
6238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
6248de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
6258de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
6268de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
6278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
628aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
629aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
630aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
6318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
633427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
6348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
6358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
636427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
6378c12720c108cd5e7ed792596749218d8400f647eSean Callanan
638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
639427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
64053a5a9986e2a201717ea723f67ae32571be95b32Sean Callanan        !member_sp->m_jit_vars.get() ||
64153a5a9986e2a201717ea723f67ae32571be95b32Sean Callanan        !member_sp->GetValueObject())
6428c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
6438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
6488c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
65202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
6538de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
6548de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6559b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
6568de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
6578de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
658ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
659427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
6608c12720c108cd5e7ed792596749218d8400f647eSean Callanan
661427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
6628c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
663ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
6648c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
666ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
667427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
6688c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6698c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
670ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
671ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
672ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
673ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
674ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
675ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
676ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
677ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
678ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
679ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
680ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
681aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan       sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
682ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
683ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (!sc_list.GetSize())
684ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
685ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
686ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
687f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
6888de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
6898de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6908de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
691da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
6928de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
693f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
694aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
695aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
696aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
697dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
698dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
699f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
700567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
70178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
70278b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
703f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
704f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
705e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
706f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
707ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
708ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
709e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
710aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
711aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
712aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
713aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
7140eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan        if (!strncmp(name.GetCString(), "_ZN", 3) &&
7150eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            strncmp(name.GetCString(), "_ZNK", 4))
716aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
7170eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            std::string fixed_scratch("_ZNK");
7180eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            fixed_scratch.append(name.GetCString() + 3);
7190eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            ConstString fixed_name(fixed_scratch.c_str());
720aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
721aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
7220eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan                log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
7230eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan
7240eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
725aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
726aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
727aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
728aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
729f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
730f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
731f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
732e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
733f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
734da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
735f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
736f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
737da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
738f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
7390c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        func_so_addr = &sym_ctx.symbol->GetAddress();
740f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
741f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
742f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
743ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
744ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
745ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
746567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (target);
747da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
748f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
749f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
750f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
75221ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type)
753c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
754c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
755c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
75621ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
757c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
76121ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++)
762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
765c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
7660c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddress();
767ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
768ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
769ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
770ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
771cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
772cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
773cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
774cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
775cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
776cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
777cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
778cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
779cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
780cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
781cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
782cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
783cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
784cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
785cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
786cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
787cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
788cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
789cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
790cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
791cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
792cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
793cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
794cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
795cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
796cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
797cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
798cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
799cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
800cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
801cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
8023f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCClass:
8033f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCMetaClass:
8043f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCIVar:
805cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
806cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
807cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
808cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
809cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
810c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
811cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
812c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
813c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
814cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
81521ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
816819749647b1605f75753f625050cb240292c08b0Sean Callanan{
817819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
818819749647b1605f75753f625050cb240292c08b0Sean Callanan
819dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
820819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
821819749647b1605f75753f625050cb240292c08b0Sean Callanan
822dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), name, symbol_type);
823819749647b1605f75753f625050cb240292c08b0Sean Callanan}
824819749647b1605f75753f625050cb240292c08b0Sean Callanan
82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter
82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
827557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue
828557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr)
829557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{
830557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    Value ret;
831557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
832557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ret.SetContext(Value::eContextTypeInvalid, NULL);
833557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
834dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (m_parser_vars->m_exe_ctx.GetProcessPtr())
835557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        ret.SetValueType(Value::eValueTypeLoadAddress);
836557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    else
837557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan        ret.SetValueType(Value::eValueTypeFileAddress);
838557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
839557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    ret.GetScalar() = (unsigned long long)addr;
840557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
841557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan    return ret;
842557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan}
843557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan
84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const uint8_t *data,
84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     size_t length)
84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
851dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
853dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = exe_ctx.GetProcessPtr();
85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
856567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
859dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
868567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return reg_ctx->WriteRegister(reg_info, reg_value);
87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        default:
87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeFileAddress:
88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
881567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
884dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                Target *target = exe_ctx.GetTargetPtr();
88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
887567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
890567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
893567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory(load_addr, data, length, err);
89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeLoadAddress:
89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
899567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
903567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeHostAddress:
908e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            {
909e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                if (value.GetScalar().ULongLong() == 0 || data == NULL)
910e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                    return false;
911e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                memcpy ((void *)value.GetScalar().ULongLong(), data, length);
912e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan                return true;
913e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            }
91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeScalar:
91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data,
92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    lldb_private::Value &value,
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    size_t length)
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
927dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
929dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = exe_ctx.GetProcessPtr();
930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
936dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx->ReadRegister(reg_info, reg_value))
94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
948567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            default:
95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeFileAddress:
95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
958dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                Target *target = exe_ctx.GetTargetPtr();
959567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (target == NULL)
96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
964567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
968b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                target->ReadMemory(file_addr, false, data, length, err);
96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeLoadAddress:
97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
974567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
978567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
98247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeHostAddress:
9835a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            {
9845a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                void *host_addr = (void*)value.GetScalar().ULongLong();
9855a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
9865a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                if (!host_addr)
9875a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                    return false;
9885a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
9895a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                memcpy (data, host_addr, length);
99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return true;
9915a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            }
99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeScalar:
99347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value
99952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags)
100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
1002dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
10051c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (expr_var_sp)
100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
100852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        flags = expr_var_sp->m_flags;
100952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
1010b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        if (!expr_var_sp->m_parser_vars.get())
10116d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan            return Value();
10126d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
10131c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference;
1014b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1015b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        if (expr_var_sp->m_parser_vars->m_lldb_var)
10161c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        {
1017dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            std::auto_ptr<Value> value(GetVariableValue(expr_var_sp->m_parser_vars->m_lldb_var, NULL));
10181c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
1019b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
1020b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            {
1021dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1022b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1023b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                if (!process)
1024b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                    return Value();
1025b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1026b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                lldb::addr_t value_addr = value->GetScalar().ULongLong();
1027b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                Error read_error;
1028b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error);
1029b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1030b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                if (!read_error.Success())
1031b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                    return Value();
1032b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1033b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                value->GetScalar() = (unsigned long long)ref_value;
1034b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            }
1035b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1036b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            if (value.get())
1037b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan                return *value;
1038b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            else
10391c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan                return Value();
1040b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        }
1041b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        else if (expr_var_sp->m_parser_vars->m_lldb_sym)
1042b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        {
10430c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton            const Address sym_address = expr_var_sp->m_parser_vars->m_lldb_sym->GetAddress();
10441c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
1045b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            if (!sym_address.IsValid())
10461c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan                return Value();
1047b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
1048b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            Value ret;
1049b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan
10506cdedde154e8b95758596775463a086352baee63Sean Callanan            ProcessSP process_sp (m_parser_vars->m_exe_ctx.GetProcessSP());
10516cdedde154e8b95758596775463a086352baee63Sean Callanan
10526cdedde154e8b95758596775463a086352baee63Sean Callanan            if (process_sp)
10536cdedde154e8b95758596775463a086352baee63Sean Callanan            {
10546cdedde154e8b95758596775463a086352baee63Sean Callanan                uint64_t symbol_load_addr = sym_address.GetLoadAddress(&process_sp->GetTarget());
10556cdedde154e8b95758596775463a086352baee63Sean Callanan
10566cdedde154e8b95758596775463a086352baee63Sean Callanan                ret.GetScalar() = symbol_load_addr;
10576cdedde154e8b95758596775463a086352baee63Sean Callanan                ret.SetValueType(Value::eValueTypeLoadAddress);
10586cdedde154e8b95758596775463a086352baee63Sean Callanan            }
10596cdedde154e8b95758596775463a086352baee63Sean Callanan            else
10606cdedde154e8b95758596775463a086352baee63Sean Callanan            {
10616cdedde154e8b95758596775463a086352baee63Sean Callanan                uint64_t symbol_file_addr = sym_address.GetFileAddress();
10626cdedde154e8b95758596775463a086352baee63Sean Callanan
10636cdedde154e8b95758596775463a086352baee63Sean Callanan                ret.GetScalar() = symbol_file_addr;
10646cdedde154e8b95758596775463a086352baee63Sean Callanan                ret.SetValueType(Value::eValueTypeFileAddress);
10656cdedde154e8b95758596775463a086352baee63Sean Callanan            }
10661c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan
1067b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan            return ret;
10681c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan        }
106952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo())
107052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        {
107152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
107252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
107352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            if (!frame)
107452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan                return Value();
107552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
107652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            RegisterContextSP reg_context_sp(frame->GetRegisterContextSP());
107752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
107852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            RegisterValue reg_value;
107952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
108052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            if (!reg_context_sp->ReadRegister(reg_info, reg_value))
108152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan                return Value();
108252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
108352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            Value ret;
108452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
108552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            ret.SetContext(Value::eContextTypeRegisterInfo, reg_info);
108652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            if (!reg_value.GetScalarValue(ret.GetScalar()))
108752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan                return Value();
108852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
108952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan            return ret;
109052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        }
10914b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        else
1092b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        {
10934b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return Value();
1094b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan        }
109547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
109647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else if (persistent_var_sp)
109747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
109852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan        flags = persistent_var_sp->m_flags;
109952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan
1100a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
1101a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan             persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
110286a07da76f615533a06a797dc4539566951b58d3Sean Callanan            persistent_var_sp->m_live_sp &&
1103f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan            ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress &&
1104dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan              m_parser_vars->m_exe_ctx.GetProcessSP() &&
1105dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan              m_parser_vars->m_exe_ctx.GetProcessSP()->IsAlive()) ||
1106f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan             (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress)))
1107a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
11084b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan            return persistent_var_sp->m_live_sp->GetValue();
1109a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
1110a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        else
1111a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
1112a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            lldb_private::Value ret;
1113a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetValueType(Value::eValueTypeHostAddress);
1114a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetContext(Value::eContextTypeInvalid, NULL);
1115a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
1116a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return ret;
1117a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
111847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
111947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
112047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
112147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
112247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
112347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
112447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
11254b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue
11264b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name)
11274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{
11284b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    assert(m_parser_vars.get());
11294b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
1130dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
11314b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11324b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!frame)
11334b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
11344b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    VariableList *vars = frame->GetVariableList(false);
11364b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11374b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!vars)
11384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
11394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    lldb::VariableSP var = vars->FindVariable(name);
11414b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
11424b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (!var ||
11434b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        !var->IsInScope(frame) ||
11444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        !var->LocationIsValidForFrame (frame))
11454b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
11464b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
1147dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    std::auto_ptr<Value> value(GetVariableValue(var, NULL));
11484b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
114941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress)
115041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    {
1151dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
115241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
115341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        if (!process)
115441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan            return Value();
115541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
115641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        lldb::addr_t value_addr = value->GetScalar().ULongLong();
115741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        Error read_error;
115841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error);
115941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
116041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        if (!read_error.Success())
116141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan            return Value();
116241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
116341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan        value->GetScalar() = (unsigned long long)ptr_value;
116441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan    }
116541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan
11664b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    if (value.get())
11674b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return *value;
11684b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan    else
11694b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan        return Value();
11704b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan}
11714b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan
1172810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
1173f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1174f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
11758de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
11768de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
11778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
11788de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11798de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1180f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1181dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars.get())
1182dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        return false;
1183dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
1184aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
1185aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1186dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    m_material_vars->m_process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
11880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
11890ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
11900ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
11910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
11920ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
1193f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1194f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
1195aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
1196f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1197f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
1198f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1199f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1200f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12018de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
12028de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
12043aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
1205047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
1206047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
12078de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
12083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
1209aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1210aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1211dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1212dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1213dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1214567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1215567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL || process == NULL || target == NULL)
12163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1217e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString());
12183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
12193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1221aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
12223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1223e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString());
12243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
12253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
122739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan    const bool object_pointer = true;
122870c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan
1229567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP object_ptr_var = FindVariableInScope (*frame,
1230696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
123170c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type),
123239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                                                     object_pointer);
12333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
12353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
1236e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString());
12373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
12383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1240dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(object_ptr_var,
1241aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
12423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
12433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
12443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
12453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
12463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
12473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
12483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
124950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
12503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
125150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
125250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
125350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
125450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
12553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
125650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1257567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
125850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
125950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
126050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
126150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
126250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
126350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
126450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
126550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
126650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
1267567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
1268c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
126950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
127050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
127150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
1272c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
127350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
12743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
127550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
12763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
127750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
127850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
127950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
128050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
128150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
128250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
128350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
128450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
128550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1286061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
128750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1288061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
128950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
129050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
129150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
129250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
129350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1294dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
129550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1296061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
129750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
1298061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
129950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
130050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
130150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1302061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
130350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1304061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
130550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
130650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
13073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
13083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
13093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
13103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
13113c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
13128de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
13138de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
13150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
13160ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
13178de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
13188de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1319f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1320dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    return DoMaterialize(true, stack_frame_top, stack_frame_bottom, &result_sp, err);
1321aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1322aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
1323aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
1324aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1325aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
1326aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
1327aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1328aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
1329aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
1330aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1331aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
1332aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
1333aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1334aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
1335aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1336aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
1337aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1338aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
1339aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1340aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
1341aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
1342f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1343f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
134432824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
13458de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
13468de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
13478de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
13488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
13498de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
135032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
1351aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1352aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
1353aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1354aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
135532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
135632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
135732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
135832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
1359dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1360567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1361567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!process)
136232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
136332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
136432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
136532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
136632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1367dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1368567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!target)
136932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
137032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
137132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
137232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
137332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
13743371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
13753371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
13763371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
13773371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
13783371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
13793371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
1380c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
138132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
138232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
1383567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (process->ReadMemory (m_material_vars->m_materialized_location,
1384c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
1385c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
138632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
138732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
138832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
138932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
139032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1391567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
139232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1394427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
1395427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
139632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
1397427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
139832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1399427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
1400427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
1401427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
14038c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
14058c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
14068c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1407427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
1408427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
1409427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
1410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
1411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
1412427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
1413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
1414427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
1415427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
141632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
141732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
141832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
141932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
142032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
142132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
142232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1423f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
14248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
14258de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
14268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
14270ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
14280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
1429427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
14308de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
14318de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1432810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
1433427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
1434427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
1435427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1436aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1437aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1438e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
143982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1440aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
1441810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1442810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
144357067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
1444810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1445810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1446dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1447567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame)
144845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
144945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
145057067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
145145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
1452dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
145345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
1454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
1455aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1456aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
1457e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
1458e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
1459e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1460e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1461f99355834bee84e48e2b6205ed13d307faa74405Filipe Cabecinhas        m_material_vars->m_allocated_area = 0UL;
1462e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1463e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
1464e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
1465e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1466567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
1467810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1468f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
1469f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1470dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1471aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1472f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
1473567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            process->DeallocateMemory(m_material_vars->m_materialized_location);
1474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1475f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1476810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
14777a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
14787a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
14797a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
1480567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
14815a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                   lldb::ePermissionsReadable | lldb::ePermissionsWritable,
14825a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                                   err);
1483f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1484f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
14855a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        {
14865a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct",
14875a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                                         (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size));
1488f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
14895a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        }
14905a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
1491aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
1492f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1493810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1494aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
1495810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1496aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1497aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
1498810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1499427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
15008c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
15018c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1502810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1503427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
15044d0b110715d321d366dec1dc690300f713b63236Sean Callanan
1505a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
1506336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
150725db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan            if (!member_sp->GetValueObject())
150825db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan            {
150925db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan                err.SetErrorString("Variable being materialized doesn't have a frozen version");
151025db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan                return false;
151125db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan            }
151225db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan
1513a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
1514427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
15151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
15161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
15171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1518dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
15191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
15215a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                {
15225a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                    err.SetErrorString("Couldn't get register context");
15231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
15245a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                }
15255a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
1526427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
1527427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
1528427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
1529427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1530427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
15311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
15321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
15331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
15341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
1535427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
15365a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                {
15375a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                    err.SetErrorString("Variable being materialized doesn't have necessary state");
15381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
15395a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan                }
15401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
15426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
1544427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1545427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
15461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
15471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
15488c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1549a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
15508c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
1551a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
1552a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
1553a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
155445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
15556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1556a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
1557a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1558a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1559a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
15606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1561a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1562a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1564a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1565a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1566a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
1567a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
15680ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
15690ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
15700ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1571a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1572a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1573f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1574a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1575a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1576a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
15778c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1578a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
15798c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1580810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1581810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1582f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1583f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1584f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1585a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
15868de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
15878de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
15888de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
1589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
15908de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
15910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
15920ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
15938de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
15948de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1595aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
15966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
15976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1599a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1600427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1601a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1602a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1603a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1604427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1605a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1606427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1607427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
16085a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
16095a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        err.SetErrorString("Persistent variable being materialized contains no data");
1610a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
16115a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
1612a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1613a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1614dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1615567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
16166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
16176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1618a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1619a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
16206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
16216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
16226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
16246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
16256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
16266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1629567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->ReadPointerFromMemory (addr, read_error);
16306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
16326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
16346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
16386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
16396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
16416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
16426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1643dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
164447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
164547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
164647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
164747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
164847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
164947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
16506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
16536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
16556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1658b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
16596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
16626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
166497678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
166597678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
16666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
16676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
16686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
1670c4b6ab949a32a48f69d1aac295770505c99fd4f9Greg Clayton                    log->Printf("Dematerializing %s from 0x%llx (size = %u)", var_sp->GetName().GetCString(), (uint64_t)mem, (unsigned)pvar_byte_size);
16716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
16730ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
16746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
1675567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
16766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
16776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
16786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
16796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
16806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16810ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
16820ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
16830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
16840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
16850ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
16860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
16870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
16880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
16890ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
16900ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
16910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
16920ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
16930ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
16940ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
16956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
16966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
16976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
16996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
17006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
17026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
17046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
17066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1707567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error deallocate_error = process->DeallocateMemory(mem);
17086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
17106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
17116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
17126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
17136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
17146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
17176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1718a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
17196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1720a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1721a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1722a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1723a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1724a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
17256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
17266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
17276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
17296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
17306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
17316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
17336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1734567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->AllocateMemory(pvar_byte_size,
17354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                          lldb::ePermissionsReadable | lldb::ePermissionsWritable,
17364b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                          allocate_error);
17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
17396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
17456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
17466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
17486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1749dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
175047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
175147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
175247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
175347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
175447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
175547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
17566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
17586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
17606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
17616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
17636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1764567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
17656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
17736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
17746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
17756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1776567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!process->WriteScalarToMemory (addr,
17774b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               var_sp->m_live_sp->GetValue().GetScalar(),
17784b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               process->GetAddressByteSize(),
17794b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan                                               write_error))
17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
17816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
17826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
17836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
17846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1786c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
17876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1788696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1789a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
17906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1791a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1792a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1793a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1794a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1795a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1796a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1797a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1798f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
17998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
18008de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
18018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
18028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
18036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
18048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
18058de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
18068de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1808e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1809dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1810dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr();
1811dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1812567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
18136d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
18145a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
18155a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        err.SetErrorString("Necessary state for variable materialization isn't present");
1816cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
18175a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
1818cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
18196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
18206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
18236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18244a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
18254a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
1826f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
18276f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference);
18286f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
1829819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
18304a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1831819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1832819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1833dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        location_value.reset(GetVariableValue(var,
1834819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1835819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1836819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
18374a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    {
183821ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan        addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny);
1839819749647b1605f75753f625050cb240292c08b0Sean Callanan
1840cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1841819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1842819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1843c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1845819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1846819749647b1605f75753f625050cb240292c08b0Sean Callanan
18474a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        location_value.reset(new Value);
18484a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1849819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1850819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1851819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1852819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1853f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1854c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1855c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1856f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1857f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1858f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1859841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1860fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1861fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1862fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1863fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1864fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1865fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1866fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1867c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1868c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1869c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1870c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1871fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1872f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1873f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1874f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
18758de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1876f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1877f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
187817c6a05cb96f7110332342326a90692d9505982eSean Callanan
187917c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1880f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
18816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
18826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
188317c6a05cb96f7110332342326a90692d9505982eSean Callanan
188417c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
188517c6a05cb96f7110332342326a90692d9505982eSean Callanan
188617c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1887f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
188817c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1889f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
189017c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
189117c6a05cb96f7110332342326a90692d9505982eSean Callanan
189217c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
189317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1894c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1895c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1896c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
189717c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1898f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
189917c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
190017c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1901f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
19026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
190317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1904c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
19056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
19076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
19086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    Error read_error;
19096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19106f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error);
19116f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19126f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!read_error.Success())
19136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
19146f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s",
19156f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
19166f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      read_error.AsCString());
19176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
19186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
19196f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19206f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!process->WritePointerToMemory(addr,
19216f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       ref_value,
19226f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       write_error))
19236f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
19246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
19256f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
19266f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
19276f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
19286f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
19296f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
19306f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                else
19316f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
19326f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!process->WriteScalarToMemory (addr,
19336f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       location_value->GetScalar(),
19346f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       process->GetAddressByteSize(),
19356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                       write_error))
19366f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
19376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
19386f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
19396f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
19406f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
19416f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
19426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
194317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1944f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
194517c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
194617c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1947f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
19486916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
194917c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
195017c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
195117c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
195217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1953c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1954c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1955c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
195617c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
195717c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
195817c6a05cb96f7110332342326a90692d9505982eSean Callanan
1959061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
196017c6a05cb96f7110332342326a90692d9505982eSean Callanan
1961061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
196217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1963c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1964c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
196517c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
196617c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
196717c6a05cb96f7110332342326a90692d9505982eSean Callanan
1968061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1969061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1970dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext();
1971061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1972061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
197317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1974c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1975c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1976c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
197717c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
197817c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
197917c6a05cb96f7110332342326a90692d9505982eSean Callanan
1980061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
198117c6a05cb96f7110332342326a90692d9505982eSean Callanan
198217c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
198317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
19846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
19856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return true; // reference types don't need demateralizing
19866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
19876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
19886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
19896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
19906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
19916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
19926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
19936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
19946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1995b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
19966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
19976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
19986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
19996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
20006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2001c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
200217c6a05cb96f7110332342326a90692d9505982eSean Callanan
2003c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
2004c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
2005c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
2006c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
2007061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
200817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
2009061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
2010061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
201117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
2012c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
2013c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2014c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
201517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
201617c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
20176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
20196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2020567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
20216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
20236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
2024c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
2025c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2026c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
20276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
20286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
20296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
203117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
203217c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
203317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
20346f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                Error write_error;
20356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20366f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                RegisterValue reg_value;
20376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20386f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (!reg_ctx->ReadRegister (reg_info, reg_value))
20396f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
20406f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
20416f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                  name.GetCString(),
20426f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                  reg_info->name);
20436f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return false;
20446f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
20456f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20466f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                if (is_reference)
20476f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                {
20486f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    write_error = reg_ctx->WriteRegisterValueToMemory(reg_info,
20496f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      addr,
20506f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      process->GetAddressByteSize(),
20516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                                      reg_value);
20526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    if (!write_error.Success())
20546f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    {
20556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s",
20566f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      name.GetCString(),
20576f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      reg_info->name,
20586f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                      write_error.AsCString());
20596f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                        return false;
20606f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    }
20616f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20626f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                    return true;
20636f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                }
20646f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
20656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
20666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
20676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
20696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2070567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Scalar reg_addr (process->AllocateMemory (value_byte_size,
20716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                          lldb::ePermissionsReadable | lldb::ePermissionsWritable,
20726f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                          allocate_error));
20736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2074c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
20756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
2076c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
2077c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2078c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
20796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
20806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
20816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
20836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2084dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan                expr_var->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
208547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
208647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
208747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
2088c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
208947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
209047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
20916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
20926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
20936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
2094567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
20956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   reg_addr,
20966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   process->GetAddressByteSize(),
20976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan                                                   write_error))
20986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
2099c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
2100c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2101c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
21026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
21036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
21046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
21056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
210617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
2107c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
2108c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2109c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
211017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
211117c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
2112061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
2113061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
211417c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
2115c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
2116c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
2117c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
211817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
211917c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
212017c6a05cb96f7110332342326a90692d9505982eSean Callanan
2121c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
2122c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
2123c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
2124c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
2125061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
212617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
212717c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
2128f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
2129f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2130f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
2131f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
2132810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
2133810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
21341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
21351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
21361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
21371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
21381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
2139b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
21401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
21411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
21421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
21431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
21441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
2145061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
21461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
21471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2148061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
2149061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
21501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2151bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
21521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2155061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
21561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2157061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
21581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
21611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
21621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
21631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2164061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
21651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2166061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
21671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2170061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
2171061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
21721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
217395b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
21741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
21751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
21761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
21771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
21781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
21791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
21801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2181696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
21828de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
21838de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
21848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
21858de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
218670c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan    TypeFromUser *type,
218739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan    bool object_pointer
21888de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2189aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
2190e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2191cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
2192f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    ValueObjectSP valobj;
2193f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    VariableSP var_sp;
2194f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    Error err;
2195f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan
2196f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
2197f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     eNoDynamicValues,
2198f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     StackFrame::eExpressionPathOptionCheckPtrVsMember,
2199f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     var_sp,
2200f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     err);
22013bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
2202f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    if (!err.Success() ||
2203f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan        !var_sp ||
2204ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
2205ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
2206ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
22073bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
22084207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan    if (var_sp)
22093bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
22104207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan        if (!type)
22114207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            return var_sp;
22124207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
221339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        TypeFromUser candidate_type(var_sp->GetType()->GetClangFullType(),
221439d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                                    var_sp->GetType()->GetClangAST());
221539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
221639d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        if (candidate_type.GetASTContext() != type->GetASTContext())
22173bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
221839d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            if (log)
221939d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                log->PutCString("Skipping a candidate variable because of different AST contexts");
222039d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            return lldb::VariableSP();
222139d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        }
222239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
222339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        if (object_pointer)
222439d1af981f6a76603356fd84b2e9372a9172297cSean Callanan        {
222539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            clang::QualType desired_qual_type = clang::QualType::getFromOpaquePtr(type->GetOpaqueQualType());
222639d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            clang::QualType candidate_qual_type = clang::QualType::getFromOpaquePtr(candidate_type.GetOpaqueQualType());
222739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
22284207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            const clang::ObjCObjectPointerType *desired_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
22294207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            const clang::ObjCObjectPointerType *candidate_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>();
22304207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
22314207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            if (desired_objc_ptr_type && candidate_objc_ptr_type) {
22324207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                clang::QualType desired_target_type = desired_objc_ptr_type->getPointeeType().getUnqualifiedType();
22334207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                clang::QualType candidate_target_type = candidate_objc_ptr_type->getPointeeType().getUnqualifiedType();
22344207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
22354207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                if (ClangASTContext::AreTypesSame(type->GetASTContext(),
22364207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                                                  desired_target_type.getAsOpaquePtr(),
22374207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                                                  candidate_target_type.getAsOpaquePtr()))
22384207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                    return var_sp;
22394207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            }
22404207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
224139d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            const clang::PointerType *desired_ptr_type = desired_qual_type->getAs<clang::PointerType>();
224239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan            const clang::PointerType *candidate_ptr_type = candidate_qual_type->getAs<clang::PointerType>();
224339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
22444207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            if (desired_ptr_type && candidate_ptr_type) {
22454207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                clang::QualType desired_target_type = desired_ptr_type->getPointeeType().getUnqualifiedType();
22464207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                clang::QualType candidate_target_type = candidate_ptr_type->getPointeeType().getUnqualifiedType();
22474207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan
22484207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                if (ClangASTContext::AreTypesSame(type->GetASTContext(),
22494207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                                                  desired_target_type.getAsOpaquePtr(),
22504207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                                                  candidate_target_type.getAsOpaquePtr()))
22514207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                    return var_sp;
22524207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            }
225339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan
22544207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            return lldb::VariableSP();
22553bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
22563bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
22573bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
22584207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan            if (ClangASTContext::AreTypesSame(type->GetASTContext(),
225939d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                                               type->GetOpaqueQualType(),
226039d1af981f6a76603356fd84b2e9372a9172297cSean Callanan                                               var_sp->GetType()->GetClangFullType()))
22614207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan                return var_sp;
22623bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
22633bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
22643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
22654207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan    return lldb::VariableSP();
2266cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
2267336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2268819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
2269819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
2270819749647b1605f75753f625050cb240292c08b0Sean Callanan(
2271819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
2272aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    const ConstString &name
2273819749647b1605f75753f625050cb240292c08b0Sean Callanan)
2274819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2275819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
2276819749647b1605f75753f625050cb240292c08b0Sean Callanan
2277aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name,
2278aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  eSymbolTypeData,
2279aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  sc_list);
2280819749647b1605f75753f625050cb240292c08b0Sean Callanan
2281819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
2282819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2283819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
2284819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
2285819749647b1605f75753f625050cb240292c08b0Sean Callanan
2286819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
2287819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2288819749647b1605f75753f625050cb240292c08b0Sean Callanan
2289819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
2290819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2291819749647b1605f75753f625050cb240292c08b0Sean Callanan
229247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
229347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
229447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
229547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
229694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
229794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
229894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
229947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
230047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
230147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
230247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
230347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
230494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
230594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
230694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
230794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
230847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
230947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
231047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
231147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
231247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
231347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
231447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
231547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
231647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
231747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
231847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                {
231947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
232047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        return var_sp;
232147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                }
232247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
232347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
232447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
232547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
232647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
232747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
232847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
232947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
233047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
233147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
233247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
233324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
233447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
233516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
2336f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2338f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
2339f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
2340f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
2341f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
2342e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23449394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (GetImportInProgress())
2345ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
234667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
2347ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
2348ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
2349ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
2350e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
235167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    static unsigned int invocation_id = 0;
235267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    unsigned int current_id = invocation_id++;
235367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
235416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
235516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
235616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
23579394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
235816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
23599394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
236016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
23619394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
236216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
23639394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
236416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
236516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
236673b520f4f60dca58e58e446c9504d45384ee677bSean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
2367a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
236867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
23695a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            log->Printf("  CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
237067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
237167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        namespace_map.get(),
237267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)namespace_map->size());
2373a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2374a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        if (!namespace_map)
2375a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            return;
2376a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan
237716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
237816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
237916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
238016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
238116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
23829394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Searching namespace %s in module %s",
238367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            current_id,
238416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
238516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
238616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
2387c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan            FindExternalVisibleDecls(context,
2388c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->first,
2389c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->second,
239067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     current_id);
239116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
239216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2393e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan    else if (isa<TranslationUnitDecl>(context.m_decl_context))
239416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
239516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
239616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
239716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
23989394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("  CEDM::FEVD[%u] Searching the root namespace", current_id);
239916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
240016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
240116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
240216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
240367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 current_id);
240416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2405a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
24069394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (!context.m_found.variable)
24079394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        ClangASTSource::FindExternalVisibleDecls(context);
240816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
240916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
241016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
241116b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
241238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                                  lldb::ModuleSP module_sp,
241303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
241467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  unsigned int current_id)
241516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
2416f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
241716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
241816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
24199394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
2420e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24229394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
24239394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
24243bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
24253bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
24263bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
24273bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
24289394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
24298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    static ConstString id_name("id");
24308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    static ConstString Class_name("Class");
24318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
24328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    if (name == id_name || name == Class_name)
24338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        return;
24348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
24358de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
24368de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
2437dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2438dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
243903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
24403cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
244157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
244247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
244357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
244457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
244557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
244675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
244775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (frame == NULL)
244847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
244947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
245075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
245157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
245275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (!sym_ctx.function)
245357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
245457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2455b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // Get the block that defines the function
2456b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            Block *function_block = sym_ctx.GetFunctionBlock();
2457b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2458b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (!function_block)
2459b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                return;
2460b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2461b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            clang::DeclContext *decl_context = function_block->GetClangDeclContext();
246257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
246375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (!decl_context)
246457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
246557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
246675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
246757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
246875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (!method_decl)
246957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
247057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
247175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            clang::CXXRecordDecl *class_decl = method_decl->getParent();
2472c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
247375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            QualType class_qual_type(class_decl->getTypeForDecl(), 0);
2474c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
247575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
247675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                                          &class_decl->getASTContext());
247703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
24783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
24793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
248075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                ASTDumper ast_dumper(class_qual_type);
24819394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
24823aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
24833aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2484e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            AddOneType(context, class_user_type, current_id, true);
248557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2486bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan            if (method_decl->isInstance())
2487bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan            {
2488bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan                // self is a pointer to the object
2489bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
2490bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan                QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
2491bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
2492bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan                TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
2493bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan                                            &method_decl->getASTContext());
2494bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
2495bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan                m_struct_vars->m_object_pointer_type = self_user_type;
2496bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan            }
2497bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
249857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
249957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
250057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
25013aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
25023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
25033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
25043aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
25053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2506567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
250747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
2508e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2509e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
251047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2511e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!sym_ctx.function)
2512e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                return;
251303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2514b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // Get the block that defines the function
2515b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            Block *function_block = sym_ctx.GetFunctionBlock();
2516e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2517b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (!function_block)
2518b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                return;
2519b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2520b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            clang::DeclContext *decl_context = function_block->GetClangDeclContext();
2521e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2522e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!decl_context)
25233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
252403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2525e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
2526e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2527e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!method_decl)
2528e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                return;
2529e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2530e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
2531e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2532e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!self_interface)
2533e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                return;
2534e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2535e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            const clang::Type *interface_type = self_interface->getTypeForDecl();
2536e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2537e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
2538e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                                         &method_decl->getASTContext());
2539e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2540e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (log)
2541e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            {
2542e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                ASTDumper ast_dumper(interface_type);
2543e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
2544e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            }
2545e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
2546e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            AddOneType(context, class_user_type, current_id, false);
2547e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
254875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan#if 0
2549e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            VariableList *vars = frame->GetVariableList(false);
2550e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
25513aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
255203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
255375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (self_var &&
255475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                self_var->IsInScope(frame) &&
255575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                self_var->LocationIsValidForFrame (frame)) {
255675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                Type *self_type = self_var->GetType();
255775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
255875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                if (!self_type)
255975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                    return;
256075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
256175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                TypeFromUser self_user_type(self_type->GetClangFullType(),
256275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                                            self_type->GetClangAST());
256375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            }
256475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan#endif
25653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
256675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (method_decl->isInstanceMethod())
256775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            {
256875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                // self is a pointer to the object
256975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
257075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
257103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
257275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
257375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                                            &method_decl->getASTContext());
25743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
257575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                m_struct_vars->m_object_pointer_type = self_user_type;
257675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            }
257775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            else
257875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            {
257975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                // self is a Class pointer
258075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                QualType class_type = method_decl->getASTContext().getObjCClassType();
258175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
258275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
258375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                                            &method_decl->getASTContext());
258475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
258575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                m_struct_vars->m_object_pointer_type = self_user_type;
258675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            }
258775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
25883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
25893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
2590c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
2591c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
2592c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2593c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
259403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
25952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
25962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
2597567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
25982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
25992431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2600567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
26012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
26032431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
26042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
26062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
26082431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
26092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
261103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
26122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
26132431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
26142431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2615e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
26162431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26172431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
26182431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
26192431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26202431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
26212431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26222431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
26232431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
26242431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26252431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
26269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
26272431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
26282431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
26292431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
26302431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2631427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
263203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2633427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
26341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
263567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            AddOneVariable(context, pvar_sp, current_id);
26361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
26371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
26381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
26391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
26401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2641dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        if (m_parser_vars->m_exe_ctx.GetRegisterContext())
26421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2643dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
26449394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
26451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
2646e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            {
2647e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                if (log)
26489394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                    log->Printf("  CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
2649e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan
265067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneRegister(context, reg_info, current_id);
2651e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            }
26521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
26538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
265403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
265503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
265603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
265703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
265803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
265903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
266003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
266103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
266203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
266303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
266403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember,
266503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
266603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
266703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
266803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
2669b386d82334b65fb984348f2027b1cb7714de993fSean Callanan            if (err.Success() && var)
267003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
267189e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                AddOneVariable(context, var, valobj, current_id);
267216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
26733a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan                return;
267403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
267503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
26761c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan
26771c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan        if (target)
267803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
267994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
268038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                      module_sp,
268194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
268294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
268303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
268403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
268503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
268603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
2687f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan                valobj = ValueObjectVariable::Create(target, var);
268889e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                AddOneVariable(context, var, valobj, current_id);
268916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
26901c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan                return;
269103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
269203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
269303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
269416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan        if (!context.m_found.variable)
269503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
2696302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan            const bool include_inlines = false;
269703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
2698a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
269938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            if (namespace_decl && module_sp)
2700a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
270151cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan                const bool include_symbols = false;
270251cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan
270338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                module_sp->FindFunctions(name,
270438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         &namespace_decl,
270538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         eFunctionNameTypeBase,
270638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         include_symbols,
2707302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                                         include_inlines,
270838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         append,
270938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         sc_list);
2710a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2711647fefd71c4364342aa116e45418592667fb8265Sean Callanan            else if (!namespace_decl)
2712a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
271351cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan                const bool include_symbols = true;
271451cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan
27152975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                // TODO Fix FindFunctions so that it doesn't return
27162975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                //   instance methods for eFunctionNameTypeBase.
27172975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
2718a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
2719a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  eFunctionNameTypeBase,
2720a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
2721302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                                                  include_inlines,
2722a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
2723a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
2724a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2725a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
272603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
272703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
272803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
272903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
273003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
273103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
273203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
273303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
273403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
273503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
273603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
273703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
273803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
273903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
27402975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
27412975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
27422975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        // Filter out class/instance methods.
27432975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
27442975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                            continue;
27452975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
27462975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                            continue;
27472975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
274803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
274903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // overloaded
275016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        if (!context.m_found.function_with_type_info)
275167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            AddOneFunction(context, sym_ctx.function, NULL, current_id);
275216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function_with_type_info = true;
275316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
275403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
275503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
275603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
275703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
275803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
275903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
276003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
276103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
276203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
276303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
276416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                if (!context.m_found.function_with_type_info)
276503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
276603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
276703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
276867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, generic_symbol, current_id);
276916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
277003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
277103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
277203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
277367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, non_extern_symbol, current_id);
277416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
277503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
277603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
277703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
277803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2779647fefd71c4364342aa116e45418592667fb8265Sean Callanan            if (!context.m_found.variable && !namespace_decl)
278003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
278116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
278203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
278303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2784aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
278503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
278603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
278703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
278867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    AddOneGenericVariable(context, *data_symbol, current_id);
278916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                    context.m_found.variable = true;
279003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
279103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
279203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
2793b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan    }
279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2795e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
279669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callananstatic clang_type_t
279769716a233f3240978bdbd7a8b682b31e7e07e498Sean CallananMaybePromoteToBlockPointerType
279869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan(
279969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    ASTContext *ast_context,
280069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    clang_type_t candidate_type
280169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan)
280269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan{
280369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!candidate_type)
280469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
280569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
280669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
280769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
280869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
280969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
281069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!candidate_pointer_type)
281169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
281269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
281369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
281469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
281569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
281669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
281769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_type)
281869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
281969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
282069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
282169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
282269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_decl->isRecord())
282369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
282469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
282569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
282669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
282769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
282869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
282969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
283069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
283169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    return block_pointer_type.getAsOpaquePtr();
283269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan}
283369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
2834336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
28358de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
28368de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
28374a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var,
28389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
28398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
28408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
28418de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2843e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
28446184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2849810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2850810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
2851336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
285404c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2858810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2859810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
2860336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2865b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2867810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2868810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
2869336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
287169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
28723418bfeeafef91b67a62f536d0ff4bbdb4d0d440Enrico Granata    // commented out because of <rdar://problem/11024417>
28733418bfeeafef91b67a62f536d0ff4bbdb4d0d440Enrico Granata    //var_opaque_type = MaybePromoteToBlockPointerType (ast, var_opaque_type);
287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2875336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
2876336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2879178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2880178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
2881dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2882567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2883178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
2884178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
2885178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
2886178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
2887567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
2888178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2891dd1dcfdbad297562951169ad621f895daf32b382Sean 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))
289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2893810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2894810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
2895336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2897b01000fd063629facd45044f137446fb748ee179Greg Clayton
289858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
2899336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2900f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
2901f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
2902b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
2903f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
29044b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
29054b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
29064b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
29074b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
29084b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
29094b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
29104b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
29114b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
2912f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
2913f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2914f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2915336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
2916336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
29196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
2925336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
2927336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
2932336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
2933336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2936567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
293947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
294047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->GetScalar() = load_addr;
294147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->SetValueType(Value::eValueTypeLoadAddress);
294247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2945f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
2946b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
2947336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2948336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
2949336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
2950336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2951336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
295289e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
2953336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
2954aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2955aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2956e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
295747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2958f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
2959f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
2960336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2961dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Value *var_location = GetVariableValue (var,
2962f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                            m_ast_context,
29638de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
29648de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
2965336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2966e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
2967e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan
296830a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan    if (parser_opaque_type.isNull())
296930a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan        return;
297030a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan
2971e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
2972e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    {
2973e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan        if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
2974e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan            CompleteType(tag_type->getDecl());
2975e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    }
2976e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan
29774b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
29784b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
29794b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
29806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    NamedDecl *var_decl;
29816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
29826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType());
29836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
29846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
29856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
29866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    else
29876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
29886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
29898de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
299189e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
299289e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan
2993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2997427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2998427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2999696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
30026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
30036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
3004810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
30058de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3006aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan        ASTDumper orig_dumper(ut.GetOpaqueQualType());
3007a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
3008aa56141b061ca23a447d48c27bf1f35017405376Sean 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());
30098de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
30108f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
30118f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30128f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
3013a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
301467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       ClangExpressionVariableSP &pvar_sp,
301567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       unsigned int current_id)
3016a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
3017e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
301845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
3019427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
3020a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
3021f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    TypeFromParser parser_type (GuardedCopyType(m_ast_context,
3022427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
3023427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
3024f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
3025a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
3026dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!parser_type.GetOpaqueQualType())
3027dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
3028dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
3029dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("  CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
3030dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return;
3031dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
3032dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
30336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
30348c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3035427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
3036427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
3037427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
3038427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
3039427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
304045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
304145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
3042a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
3043a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
30449394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
3045a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
3046a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
3047a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
30481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
3049819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
305067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              Symbol &symbol,
305167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              unsigned int current_id)
3052819749647b1605f75753f625050cb240292c08b0Sean Callanan{
3053819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
3054819749647b1605f75753f625050cb240292c08b0Sean Callanan
3055819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3056819749647b1605f75753f625050cb240292c08b0Sean Callanan
3057dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
3058567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3059567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
3060567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
3061567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3062567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
3063819749647b1605f75753f625050cb240292c08b0Sean Callanan
3064fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
3065819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
3066819749647b1605f75753f625050cb240292c08b0Sean Callanan
3067f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)),
3068f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
3069819749647b1605f75753f625050cb240292c08b0Sean Callanan
3070fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
3071819749647b1605f75753f625050cb240292c08b0Sean Callanan
3072819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
3073819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
3074dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
3075819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
3076819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
307747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
307847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3079819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
3080819749647b1605f75753f625050cb240292c08b0Sean Callanan
3081819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
3082819749647b1605f75753f625050cb240292c08b0Sean Callanan
30830c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton    Address &symbol_address = symbol.GetAddress();
3084567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
3085819749647b1605f75753f625050cb240292c08b0Sean Callanan
3086819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3087819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
3088819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
3089819749647b1605f75753f625050cb240292c08b0Sean Callanan
3090fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    entity->EnableParserVars();
3091819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
3092819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
3093819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
3094819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
3095819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
3096819749647b1605f75753f625050cb240292c08b0Sean Callanan
3097819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
3098819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
3099a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
3100819749647b1605f75753f625050cb240292c08b0Sean Callanan
31019394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
3102819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
3103819749647b1605f75753f625050cb240292c08b0Sean Callanan}
3104819749647b1605f75753f625050cb240292c08b0Sean Callanan
3105fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
3106fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
3107fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
3108fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3109dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
3110567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3111567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
3112fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3113fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
3114fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
3115fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
3116fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
3117fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
3118fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3119fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
3120fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
3121fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
3122fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
3123fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3124fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
3125fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
3126fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
3127fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
3128fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
3129fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
3130fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3131fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
3132fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
3133a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
3134a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
3135fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
3136fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3137fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
3138fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
3139fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
31405a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
3141fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3142dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            if (!copied_type)
3143dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            {
3144dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                if (log)
3145dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                    log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
3146dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
31479880efacdd3a5e855b405d89433a01170422a889Jim Ingham                return (bool) lldb::ClangExpressionVariableSP();
3148dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            }
3149dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3150fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
3151fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3152fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
3153fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_parser_type = parser_type;
3154fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3155fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
3156fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
3157fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3158fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
3159fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
3160fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
3161fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3162fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
3163fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
3164fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
3165819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
3166427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
316767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        const RegisterInfo *reg_info,
316867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
31691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
31701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
31711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3172f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context,
31731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
31741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
31751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
31761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
31771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
3178122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
317967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
31801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
31811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
31821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3183427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
3184f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan                                m_ast_context);
31851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
31861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
31871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3188dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
318947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
319047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
31921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
3193427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
3194427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
3195427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
3196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
3197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
3198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3199427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
320052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan    entity->m_flags |= ClangExpressionVariable::EVBareRegister;
32011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
320252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan    if (log)
32031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
3204a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
32059394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
32061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
32071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
32081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
3209a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
3210da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3211da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
321267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        Symbol* symbol,
321367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
32148f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
3215aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3216aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3217e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
32188f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
321958baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
32200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
322158baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
32228f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
32230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
32240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
32259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
32268f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
32270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
32280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
32290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
32300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
32310fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
32320fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
32330fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
323467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no type");
32350fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
32360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
32370fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
323804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
32390fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
32400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
32410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
32420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
324367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no Clang type");
32440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
32450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
32460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
32470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
32480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
3249b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
3250f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan        void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type);
3251a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        if (copied_type)
3252a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
3253a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            fun_decl = context.AddFunDecl(copied_type);
3254a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
3255a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        else
3256a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
3257a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            // We failed to copy the type we found
3258a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            if (log)
3259a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            {
3260a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf ("  Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3261a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetName().GetCString(),
3262a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetID());
3263a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            }
326416089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan
326516089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan            return;
3266a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
32670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
32680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
32690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
32700c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        fun_address = &symbol->GetAddress();
32710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
32720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
32730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
32748f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
3275810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
327667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->PutCString("  AddOneFunction called with no function and no symbol");
32778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
32788f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
32798f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3280dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
3281567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3282567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
32838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
32848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
32858f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3286dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
328747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
328847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
32908de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
3291427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
3292427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
3293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
3294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
3296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
3297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3298427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
32998c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3300810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
33018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3302a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(fun_decl);
3303a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
33042975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        StreamString ss;
33052975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
33062975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
33072975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
33082975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
330967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    current_id,
331067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    (fun ? "specific" : "generic"),
33112975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                    decl_name.c_str(),
33122975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                    ss.GetData(),
3313a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                    ast_dumper.GetCString());
33148de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
331693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
331793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
331893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
33193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
332067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                   unsigned int current_id,
33213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
332293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
3323f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    ASTContext *parser_ast_context = m_ast_context;
33249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
33253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3326ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
3327dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3328dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!copied_type)
3329dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
3330dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
3331dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3332dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
3333dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
3334dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
3335dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return;
3336dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
33379394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
33383356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton    if (add_method && ClangASTContext::IsAggregateType(copied_type) && ClangASTContext::GetCompleteType (parser_ast_context, copied_type))
33393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
33403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
33413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
33423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
33433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3344716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan        clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
3345716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        ClangASTContext::GetBuiltInType_void(parser_ast_context),
3346716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        args,
3347716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        1,
3348716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        false,
3349716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        ClangASTContext::GetTypeQualifiers(copied_type));
3350716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan
33511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
33521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
33531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
335430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
335528ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan        const bool is_attr_used = true;
33562581dbf7292c6272bb771fe396ab30921385d669Sean Callanan        const bool is_artificial = false;
335730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
33581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
33591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
33608de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
33611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
33621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
33631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
33641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
336530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
3366716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                   is_explicit,
33672581dbf7292c6272bb771fe396ab30921385d669Sean Callanan                                                   is_attr_used,
33682581dbf7292c6272bb771fe396ab30921385d669Sean Callanan                                                   is_artificial);
33693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
337093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
337193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
337293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
3373