ClangExpressionDeclMap.cpp revision 67bbb1103c5a49b7c994750e90ae7ed130daa3ae
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangExpressionDeclMap.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h"
17a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
20810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h"
216184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
23061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h"
2405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h"
256e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
27a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
28cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
40f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
41810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
4217c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
44f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
46a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
483bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) :
538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
55dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_keep_result_in_memory (keep_result_in_memory),
56aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
57dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_struct_vars ()
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
646d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    // Note: The model is now that the parser's AST context and all associated
656d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   data does not vanish until the expression has been executed.  This means
666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   that valuable lookup data (like namespaces) doesn't vanish, but
676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    DidParse();
69aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
73166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool
74427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
758c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_exe_ctx = &exe_ctx;
78567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx.GetFramePtr())
81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetThreadPtr())
83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetProcessPtr())
85987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
86987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
87567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
88987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
89567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (target)
90987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
92567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
93987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
9497ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan
95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
97567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
98166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!target->GetScratchClangASTContext())
100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            return false;
101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
102166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    m_parser_vars->m_target_info = GetTargetInfo();
10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
105166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    return true;
106aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
107c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
108427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp &&
119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars.get() &&
120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars->m_lldb_value)
121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                delete var_sp->m_parser_vars->m_lldb_value;
122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp->DisableParserVars();
124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
126427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
130427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                pvar_sp->DisableParserVars();
133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1367a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo
14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo()
14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo ret;
14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
149567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx)
15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx->GetProcessPtr();
152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (process)
153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.byte_order = process->GetByteOrder();
155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.address_byte_size = process->GetAddressByteSize();
156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        else
158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Target *target = exe_ctx->GetTargetPtr();
160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (target)
161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            {
162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.byte_order = target->GetArchitecture().GetByteOrder();
163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            }
165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return ret;
16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1718de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
17382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
177427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
182aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
18382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
18482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
191166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
193567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
194567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
195567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
196567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
197567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
19805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
19905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
20005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetASTContext(),
20105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetOpaqueQualType()),
20205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
2060e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
20747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
20847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
2090e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
2100e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2110e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
2120e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2130e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
2140e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
21505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2160e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
2170e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
2180e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
21905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
22005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
22147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
22205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
2230e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
22405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
22505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
22805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2292bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen    for (size_t byte_idx = 0;
23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
23205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
23405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (m_parser_vars->m_target_info.byte_order)
23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
2400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
2410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
2420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
2430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
2450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
2470e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
2480e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
2490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
2510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
25205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
25305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
2546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
256696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
257696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
26005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
26105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP
263696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
2649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                           VarDecl *decl,
265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           lldb_private::TypeFromParser type)
266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{
267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    assert (m_parser_vars.get());
268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
270696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
271696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
273567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
274567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
275567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
276567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
278567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return ClangExpressionVariableSP();
287696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
288696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetASTContext(),
290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetOpaqueQualType()),
291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                           context);
292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser var_type = var_sp->GetTypeFromUser();
294696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
295567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx->GetFramePtr();
296567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL)
297567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
298567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
299567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var)
302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
303696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
304567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_valobj)
307696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
308696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
309696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
310696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
311696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_casted_valobj)
312696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (log)
315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    {
316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        StreamString my_stream_string;
317696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
318696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
319696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           var_type.GetOpaqueQualType(),
320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           &my_stream_string);
321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    }
325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!pvar_sp)
329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return pvar_sp;
339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan}
340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name)
34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
34647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
34747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
34847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
34947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
35047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
35147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                lldb_private::Value &value,
35247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                const ConstString &name,
353a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                lldb_private::TypeFromParser type,
354a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                bool transient)
35547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!pvar_sp)
36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
364a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !pvar_sp->m_live_sp &&
365a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !transient)
36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        // The reference comes from the program.  We need to set up a live SP for it.
36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetASTContext(),
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetName(),
37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetScalar().ULongLong(),
37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetValueAddressType(),
37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetByteSize());
37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->ValueUpdated();
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const size_t pvar_byte_size = pvar_sp->GetByteSize();
38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        uint8_t *pvar_data = pvar_sp->GetValueBytes();
38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!ReadTarget(pvar_data, value, pvar_byte_size))
38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    valobj = pvar_sp;
39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return true;
39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
3968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
3978de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
3988de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4008de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
4026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
4036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
4048de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
405a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
406aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
407aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
4086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
409fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
412567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
413567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
414567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
415567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
416567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
417a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
418a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
41982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
42082b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
42197678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
425a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
426fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
427fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
428427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
42947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
43047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
4318c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4328c12720c108cd5e7ed792596749218d8400f647eSean Callanan
433427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
4348c12720c108cd5e7ed792596749218d8400f647eSean Callanan
435427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4368c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4378c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
4396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
4406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
4466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
4506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
4516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
4546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
4556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
456427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
4578c12720c108cd5e7ed792596749218d8400f647eSean Callanan
458427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
459427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
4608c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4618c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
462a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
463a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
464a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
4658de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
4668de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4679b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
4708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
4718de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
4728de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
476aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
477e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
47845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
479aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
4808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
4838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
484427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan
486427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
487427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
4888c12720c108cd5e7ed792596749218d8400f647eSean Callanan
489427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4918c12720c108cd5e7ed792596749218d8400f647eSean Callanan
49245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
49345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
49445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
4958de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
496427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
49745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
4988c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
4998c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
500427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
5018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
502427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
503427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
504427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
5058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
506427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
5078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
5138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
514aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
515aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
516aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
5178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
5208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
521aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
522aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
5238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
524427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
5258c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5268c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
5278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
528427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
529427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
530427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
532427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
5338c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
536427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
5378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
539427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
5408c12720c108cd5e7ed792596749218d8400f647eSean Callanan
541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
542427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
5438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
5448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
545aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
5468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
547aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
5488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5518de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
5528de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
5548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
5558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
5568de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
558aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
559aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
560aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
563427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
565aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
5728de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
5748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
5758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
5768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
5778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
5788de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
582aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
585427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
5868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
588427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
5898c12720c108cd5e7ed792596749218d8400f647eSean Callanan
590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_jit_vars.get())
5938c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
596427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
597427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
5998c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
60302fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
6048de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
6058de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
6078de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value**& value,
6088de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
6098de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
610ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
611427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
6128c12720c108cd5e7ed792596749218d8400f647eSean Callanan
613427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
6148c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
615ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
6168c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
6178c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
618ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
619427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = &entity_sp->m_parser_vars->m_llvm_value;
620427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
6218c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6228c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
623ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
624ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
625ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
626ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
627ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
628ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
629ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
630ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
631ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
632ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
633ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
634aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan       sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
635ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
636ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (!sc_list.GetSize())
637ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
638ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
639ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
640f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
6418de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
6428de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
644da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
6458de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
646f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
648aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
649aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
651567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
652567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
653567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
654f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
655567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
65678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
65778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
658f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
659f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
660e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
661f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
662ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
663ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
664e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
665aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
666aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
667aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
668aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
669aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        Mangled mangled(name.GetCString(), true);
670aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
671aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        ConstString demangled_name = mangled.GetDemangledName();
672aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
673aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        if (strlen(demangled_name.GetCString()))
674aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
675aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            std::string const_name_scratch(demangled_name.GetCString());
676aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
677aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            const_name_scratch.append(" const");
678aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
679aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            ConstString const_name(const_name_scratch.c_str());
680aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
681ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan            FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
682aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
683aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
684aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan                log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString());
685aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
686aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
687aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
688aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
689f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
690f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
691f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
692e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
693f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
694da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
696f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
697da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
698f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
699da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
700f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
701f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
702f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
703ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
704ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
705ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
706567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (target);
707da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
708f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
709f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
710f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
711cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
712cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
713c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
714c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
715c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
716819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
717c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
718cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
719cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
720cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
721cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
722cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
723cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
724cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
725c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
726cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
727ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
728ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
729ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
730ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
731cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
732cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
733cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
734cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
735cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
736cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
737cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
738cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
739cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
740cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
741cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
742cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
743cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
744cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
745cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
746cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeExtern:
748cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
749cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
750cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
752cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
753cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
757cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
765cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
766cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
768c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
769cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
770c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
771c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
772cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
773cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
774819749647b1605f75753f625050cb240292c08b0Sean Callanan{
775819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
776819749647b1605f75753f625050cb240292c08b0Sean Callanan
777819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (!m_parser_vars->m_exe_ctx ||
778567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        !m_parser_vars->m_exe_ctx->GetTargetPtr())
779819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
780819749647b1605f75753f625050cb240292c08b0Sean Callanan
781567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name);
782819749647b1605f75753f625050cb240292c08b0Sean Callanan}
783819749647b1605f75753f625050cb240292c08b0Sean Callanan
78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter
78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
78847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const uint8_t *data,
78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     size_t length)
79047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
79347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
79447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
795567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
79747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
798567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
80947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
810567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return reg_ctx->WriteRegister(reg_info, reg_value);
81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
81847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        default:
82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeFileAddress:
82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
823567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
82447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
826567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
829567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
832567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
835567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory(load_addr, data, length, err);
83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeLoadAddress:
84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
841567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
845567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeHostAddress:
85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            memcpy ((void *)value.GetScalar().ULongLong(), data, length);
85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return true;
85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeScalar:
85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data,
86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    lldb_private::Value &value,
86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    size_t length)
86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
866567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
867567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
868567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
871567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx->ReadRegister(reg_info, reg_value))
88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
886567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            default:
89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeFileAddress:
89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
896567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (target == NULL)
89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
902567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
906567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                target->ReadMemory(file_addr, true, data, length, err);
90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeLoadAddress:
91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
912567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeHostAddress:
92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                memcpy (data, (const void *)value.GetScalar().ULongLong(), length);
92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return true;
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeScalar:
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value
93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (expr_var_sp)
94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
9414a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var)
9426d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan            return Value();
9436d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
9444a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        return *GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL);
94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else if (persistent_var_sp)
94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
948a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
949a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan             persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
950a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            persistent_var_sp->m_live_sp)
951a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
952a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return persistent_var_sp->m_live_sp->GetValue();
953a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
954a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        else
955a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
956a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            lldb_private::Value ret;
957a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetValueType(Value::eValueTypeHostAddress);
958a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetContext(Value::eContextTypeInvalid, NULL);
959a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
960a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return ret;
961a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
969810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
970f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
971f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
9728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
9738de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
974aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
9758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
9768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
9778de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
978f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
979aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
980aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
981567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    m_material_vars->m_process = exe_ctx.GetProcessPtr();
982aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
9830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
9840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                exe_ctx,
9850ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
9860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
9870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
9880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
989f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
990f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
991aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
992f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
993f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
994f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
995f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
996f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
9978de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
9988de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
9998de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
10003aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
1001aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1002047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
1003047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
10048de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
10053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
1006aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1007aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1008567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1009567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1010567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1011567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1012567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL || process == NULL || target == NULL)
10133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
10153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1018aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
10193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
10213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1024567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP object_ptr_var = FindVariableInScope (*frame,
1025696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
1026696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
10273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
10293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
10313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1034aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
10353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
1036aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
10373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
10393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
10413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
104450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
10453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
104650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
104750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
104850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
104950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
10503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
105150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1052567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
105350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
105450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
105550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
105650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
105750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
105850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
105950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
106050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
106150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
1062567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
1063c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
106450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
106550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
106650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
1067c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
106850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
10693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
107050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
10713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
107250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
107350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
107450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
107550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
107650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
107750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
107850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
107950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
108050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1081061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
108250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1083061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
108450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
108550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
108650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
108750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
108850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1089061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
109050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1091061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
109250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
1093061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
109450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
109550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
109650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1097061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
109850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1099061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
110050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
110150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
11023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
11033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
11053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11063c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
11078de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
11088de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1110427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
11110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
11120ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
11138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11148de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1115f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
11160ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
1117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1118aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
1119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
1120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
1122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
1123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
1125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
1126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
1128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
1129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
1131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1132aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
1133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
1135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
1137aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
1138f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1139f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
114032824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
11418de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
11428de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1143aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
11448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
11458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11468de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
114732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
1148aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1149aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
1150aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1151aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
115232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
115332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
115432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
115532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
1156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!process)
115932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
116032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
116132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
116232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
116332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!target)
116632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
116732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
116832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
116932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
117032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
11713371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
11723371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
11733371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
11743371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
11753371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
11763371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
1177c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
117832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
117932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
1180567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (process->ReadMemory (m_material_vars->m_materialized_location,
1181c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
1182c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
118332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
118432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
118532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
118632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
118732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1188567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
118932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
1192427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
119332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
1194427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
119532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
1197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
1198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1199427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
12008c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1201427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
12028c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
12038c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1204427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
1205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
1206427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
1207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
1208427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
1209427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
1210427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
1211427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
1212427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
121332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
121432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
121532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
121632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
121732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
121832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
121932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1220f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12218de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
1224aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
12250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
12260ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
1227427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
12288de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12298de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1230810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
1233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1234aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1235aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1236e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
123782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1238aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
1239810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1240810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
124157067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
1242810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1243810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1244567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1245567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame)
124645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
124745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
124857067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
124945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
1250567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
125145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
1252567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
1253aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1254aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
1255e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
1256e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
1257e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1258e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
12599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        m_material_vars->m_allocated_area = NULL;
1260e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1261e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
1262e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
1263e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1264567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
1265810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1266f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
1267f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1268567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx.GetProcessPtr();
1269aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1270f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
1271567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            process->DeallocateMemory(m_material_vars->m_materialized_location);
1272aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1273f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1274810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
12757a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
12767a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
12777a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
1278567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
1279aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1280aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
1281f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1282f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
1283f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
1284f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1285aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
1286f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1287810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1288aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
1289810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1290aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1291aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
1292810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
12948c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
12958c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1296810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
12984d0b110715d321d366dec1dc690300f713b63236Sean Callanan
1299a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
1300336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
1301a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
1302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
13031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
13041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
13051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1306aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
13071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
13091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
1312427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
1313427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
1314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
1315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1316427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
13201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
1321427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
13221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
1325427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
13266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
13276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
1328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1329427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13328c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1333a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
13348c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
1335a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
1336a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
1337a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
133845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
13396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1340a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
1341a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1342a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1343a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
13446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1345a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1346a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
13476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1348a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1349a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1350a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
13516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
1352a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
13530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
13540ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
13550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1356a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1357a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1358f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1359a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1360a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1361a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
13628c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1363a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
13648c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1365810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1366810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1369f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1370a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
13718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
13728de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
13738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
13748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1375427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
13768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
13770ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
13780ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
13798de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
13808de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1381aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
13826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
13836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1384427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1385a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1386427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1387a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1388a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1389a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1390427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1391a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1392427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
1394a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
1395a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1396a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1397567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1398567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
13996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
14006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1401a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1402a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
14036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
14056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
14076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
14086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
14096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
14106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1412567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->ReadPointerFromMemory (addr, read_error);
14136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
14156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
14176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
14216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
14246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
14256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
142647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
142747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
142847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
142947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
143047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
143147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
143247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
14336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
14366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
14386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1441b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
14426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
14446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
144797678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
144897678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
14496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
14516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
14536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
14546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
14560ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
14576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
1458567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
14596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
14616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14640ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
14650ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
14660ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
14670ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
14680ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
14690ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
14700ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
14710ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
14720ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
14730ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
14740ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
14750ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
14760ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
14770ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
14796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
14826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
14836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
14856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
14896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1490567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error deallocate_error = process->DeallocateMemory(mem);
14916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
14936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
14946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
14956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
14966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
14976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
15006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1501a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
15026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1503a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1504a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1505a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1506a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1507a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
15086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
15096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
15106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
15146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
15166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1517567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->AllocateMemory(pvar_byte_size,
15186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
15196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  allocate_error);
15206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
15226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
15246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
15286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
15296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
15316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
153247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
153347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
153447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
153547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
153647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
153747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
153847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
15396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
15416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
15446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
15466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1547567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
15486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
15506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
15536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
15556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
15566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
15586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1559567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!process->WriteScalarToMemory (addr,
1560c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       var_sp->m_live_sp->GetValue().GetScalar(),
1561567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                       process->GetAddressByteSize(),
1562c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       write_error))
15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
15656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1569c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
15706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1571696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1572a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
15736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1574a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1575a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1576a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1577a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1578a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1579a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1580a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1581f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
15828de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
15838de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
15848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
15858de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
15868de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
15876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
15888de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
15898de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
15908de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1591f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1592e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1593567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1594567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1595567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1596567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
15976d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
1598cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
1599cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
16016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
16046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16054a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
16064a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
1607f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1608819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
16094a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1610819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1611819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1612819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(GetVariableValue(exe_ctx,
1613819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              var,
1614819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1615819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1616819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
16174a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    {
1618567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        addr_t location_load_addr = GetSymbolAddress(*target, name);
1619819749647b1605f75753f625050cb240292c08b0Sean Callanan
1620cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1621819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1622819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1623c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1624c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1625819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1626819749647b1605f75753f625050cb240292c08b0Sean Callanan
16274a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        location_value.reset(new Value);
16284a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1629819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1630819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1631819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1632819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1633f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1634c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1635c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1636f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1637f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1638f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1639841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1640fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1641fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1642fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1643fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1644fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1645fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1646fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1647c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1648c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1649c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1650c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1651fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1652f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1653f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1654f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
16558de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1656f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1657f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
165817c6a05cb96f7110332342326a90692d9505982eSean Callanan
165917c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1660f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
16626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
166317c6a05cb96f7110332342326a90692d9505982eSean Callanan
166417c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
166517c6a05cb96f7110332342326a90692d9505982eSean Callanan
166617c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
166817c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1669f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
167017c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
167117c6a05cb96f7110332342326a90692d9505982eSean Callanan
167217c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
167317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1674c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1675c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1676c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
167717c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1678f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
167917c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
168017c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1681f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
16826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
168317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1684c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
16856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1686567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
1687c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           location_value->GetScalar(),
1688567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                           process->GetAddressByteSize(),
1689c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
16906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1691c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1692c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1693c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
16946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
16956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
169617c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1697f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
169817c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
169917c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1700f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
17016916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
170217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
170317c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
170417c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
170517c6a05cb96f7110332342326a90692d9505982eSean Callanan
1706c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1707c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1708c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
170917c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
171017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
171117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1712061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
171317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1714061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
171517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1716c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1717c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
171817c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
171917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
172017c6a05cb96f7110332342326a90692d9505982eSean Callanan
1721061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1722061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1723061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1724061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1725061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
172617c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1727c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1728c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1729c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
173017c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
173117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
173217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1733061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
173417c6a05cb96f7110332342326a90692d9505982eSean Callanan
173517c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
173617c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
17386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
17406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1745b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
17466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
17486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1751c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
175217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1753c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1754c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
1755c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
1756c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
1757061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
175817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
1759061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1760061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
176117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1762c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1763c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1764c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
176517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
176617c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1770567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
17736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1774c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1775c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1776c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
178117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
178217c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
178317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
17846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
17856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
17866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
17886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1789567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Scalar reg_addr (process->AllocateMemory (value_byte_size,
1790c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1791c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  allocate_error));
17926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1793c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
17946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1795c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1796c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1797c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
17986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
18026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
180347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
180447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
180547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
180647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
1807c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
180847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
180947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
18126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error write_error;
1814c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
1815567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
1816c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr,
1817567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                           process->GetAddressByteSize(),
1818c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
18196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1820c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1821c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1822c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
18236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
182717c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1828c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
1829c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1830c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
183117c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
183217c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
1833061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1834061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                RegisterValue reg_value;
1835061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1836061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
183717c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1838c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1839c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1840c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
184117c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
184217c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
184317c6a05cb96f7110332342326a90692d9505982eSean Callanan
1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1845c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
1846c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
1847c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
1848061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
184917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
185017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1851f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1852f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1853f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1854f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1855810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
1856810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
18571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
18581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
18591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
18601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
18611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
18621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
1863b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
18641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
18651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
18661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
18671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
18681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
1869061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
18701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
18711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
1872061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1873061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
18741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1875bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
18761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
18771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1879061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
18801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1881061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
18821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
18831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
18851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
18861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
18871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1888061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
18891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1890061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
18911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
18921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1894061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1895061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
18961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
189795b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
18981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
18991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
19011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
19031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
19041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1905696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
19068de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
19078de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
19088de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
19098de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
19108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
19118de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1912aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1913e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1914cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1915f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    ValueObjectSP valobj;
1916f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    VariableSP var_sp;
1917f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    Error err;
1918f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan
1919f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
1920f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     eNoDynamicValues,
1921f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     StackFrame::eExpressionPathOptionCheckPtrVsMember,
1922f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     var_sp,
1923f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     err);
19243bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1925f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    if (!err.Success() ||
1926f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan        !var_sp ||
1927ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
1928ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
1929ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
19303bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
19313bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
19323bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
19333bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
19343bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
193504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
1936696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                return lldb::VariableSP();
19373bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
19383bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
19393bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
19403bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
19413bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
1942696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan            return lldb::VariableSP();
19433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
19443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
19453bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1946696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return var_sp;
1947cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
1948336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1949819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
1950819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
1951819749647b1605f75753f625050cb240292c08b0Sean Callanan(
1952819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
1953aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    const ConstString &name
1954819749647b1605f75753f625050cb240292c08b0Sean Callanan)
1955819749647b1605f75753f625050cb240292c08b0Sean Callanan{
1956819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
1957819749647b1605f75753f625050cb240292c08b0Sean Callanan
1958aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name,
1959aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  eSymbolTypeData,
1960aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  sc_list);
1961819749647b1605f75753f625050cb240292c08b0Sean Callanan
1962819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
1963819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1964819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
1965819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
1966819749647b1605f75753f625050cb240292c08b0Sean Callanan
1967819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
1968819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1969819749647b1605f75753f625050cb240292c08b0Sean Callanan
1970819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
1971819749647b1605f75753f625050cb240292c08b0Sean Callanan}
1972819749647b1605f75753f625050cb240292c08b0Sean Callanan
197347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
197447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
197547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
197647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
197794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
197894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
197994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
198047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
198147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
198247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
198347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
198447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
198594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
198694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
198794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
198894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
198947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
199047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
199147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
199247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
199347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
199447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
199547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
199647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
199747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
199847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
199947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                {
200047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
200147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        return var_sp;
200247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                }
200347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
200447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
200547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
200647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
200747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
200847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
200947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
201047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
201147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
201247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
201347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
201424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
201547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
201616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
201716b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name)
201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2019e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2021aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_ignore_lookups)
2022ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
202367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
2024ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
2025ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
2026ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
2027e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
202867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    static unsigned int invocation_id = 0;
202967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    unsigned int current_id = invocation_id++;
203067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
203116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
203216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
203316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
203467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
203516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
203667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
203716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
203867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
203916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2040a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2041a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan    context.m_namespace_map.reset(new ClangASTImporter::NamespaceMap);
204216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
204316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
204416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
204516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->m_ast_importer->GetNamespaceMap(namespace_context);
2046a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
204767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
204867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  FEVD[%u] Inspecting namespace map %p (%d entries)",
204967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
205067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        namespace_map.get(),
205167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)namespace_map->size());
2052a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
205316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
205416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
205516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
205616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
205716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
205867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf("  FEVD[%u] Searching namespace %s in module %s",
205967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            current_id,
206016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
206116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
206216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
2063c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan            FindExternalVisibleDecls(context,
2064c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->first,
2065c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->second,
206667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     name,
206767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     current_id);
206816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
206916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
207016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else if (!isa<TranslationUnitDecl>(context.m_decl_context))
207116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
207216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        // we shouldn't be getting FindExternalVisibleDecls calls for these
207316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return;
207416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
207516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else
207616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
207716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
207816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
207916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
208067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  FEVD[%u] Searching the root namespace", current_id);
208116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
208216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
208316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
208416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
208567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 name,
208667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 current_id);
208716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2088a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2089a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan    if (!context.m_namespace_map->empty())
2090a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan    {
209167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
209267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  FEVD[%u] Registering namespace map %p (%d entries)",
209367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
209467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        context.m_namespace_map.get(),
209567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)context.m_namespace_map->size());
2096a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2097a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan        NamespaceDecl *clang_namespace_decl = AddNamespace(context, context.m_namespace_map);
2098a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2099a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan        if (clang_namespace_decl)
2100a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            clang_namespace_decl->setHasExternalVisibleStorage();
2101a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan    }
210216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
210316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
210416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
210516b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
210638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                                  lldb::ModuleSP module_sp,
210703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
210867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  const ConstString &name,
210967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  unsigned int current_id)
211016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
211116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    assert (m_struct_vars.get());
211216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    assert (m_parser_vars.get());
211316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
211416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2115e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2116e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21183bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
21193bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21203bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
21213bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
21223bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
21248de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
2125567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2126567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
212703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
21283cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
212957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
213047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
213157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
213257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
213357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
213457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2135567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
213647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
213747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2138567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
213957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
214057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
214157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
214257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
214357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
214457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
214575a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!this_var ||
2146567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->IsInScope(frame) ||
2147567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->LocationIsValidForFrame (frame))
214857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
214957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
215057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
215157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
215257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
215357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
215457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
215567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            if (log && log->GetVerbose())
21562403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
215767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf ("  FEVD[%u] Type for \"this\" is: ", current_id);
21582403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
21592403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
21602403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
21612403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
216203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
216304c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser this_user_type(this_type->GetClangFullType(),
216457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
216557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2166aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
216757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
216858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
216957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
217057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
217157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
217257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
217357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2174c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2175c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2176c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            if (pointer_target_qual_type.isConstQualified())
2177c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                pointer_target_qual_type.removeLocalConst();
2178c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2179c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
218057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
218103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
21823aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
21833aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
21843aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
21853aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
21863aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
218767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf("  FEVD[%u] Adding type for $__lldb_class: %s", current_id, type_stream.GetString().c_str());
21883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
21893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
219057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            AddOneType(context, class_user_type, true);
219157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
219257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
219357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
219457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
21953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
21963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
21973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
21983aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
21993aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2200567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
220147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
220247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2203567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
220403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
22063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
220703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
220903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
221075a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!self_var ||
2211567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->IsInScope(frame) ||
2212567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->LocationIsValidForFrame (frame))
22133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
221403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
22163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22173aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
22183aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
221903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
222004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser self_user_type(self_type->GetClangFullType(),
22213aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
22223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
222403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
222558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
222603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
222827a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham                                                &pointer_target_type)
222919c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton                || pointer_target_type == NULL)
22303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
223103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
22333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
22343aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22353aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
22363aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
22373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
22383aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
22393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
224067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, type_stream.GetString().c_str());
22413aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
22423aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            AddOneType(context, class_user_type, false);
22443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
22463aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
2247c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
2248c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
2249c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2250c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
225103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22522431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
22532431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
2254567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
22552431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22562431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2257567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
22582431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22592431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
22602431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22612431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22622431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
22632431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22642431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
22652431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22662431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22672431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
226803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22692431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
22702431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22712431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22722431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
22732431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22742431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
22752431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22762431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22772431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
22782431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
22802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22812431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
228367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf("  FEVD[%u] Found persistent type %s", current_id, name.GetCString());
22842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
22862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
22872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2288427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
228903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2290427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
22911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
229267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            AddOneVariable(context, pvar_sp, current_id);
22931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
22941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
22951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
22961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
22971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2298aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
22991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2300b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
23011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
230267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            if (log)
230367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf("  FEVD[%u] Found register %s", current_id, reg_info->name);
230467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
23051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
230667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneRegister(context, reg_info, current_id);
23071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
23088de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
230903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
231003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
231103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
231203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
231303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
231403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
231503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
231603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
231703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
231803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
231903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember,
232003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
232103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
232203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
232303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
232403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (err.Success() && var != NULL)
232503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
232667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneVariable(context, var, current_id);
232716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
232803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
232903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
233003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        else if (target)
233103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
233294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
233338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                      module_sp,
233494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
233594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
233603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
233703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
233803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
233903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
234067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneVariable(context, var, current_id);
234116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
234203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
234303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
234403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
234516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan        if (!context.m_found.variable)
234603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
234703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool include_symbols = true;
234803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
2349a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
235038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            if (namespace_decl && module_sp)
2351a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
235238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                module_sp->FindFunctions(name,
235338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         &namespace_decl,
235438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         eFunctionNameTypeBase,
235538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         include_symbols,
235638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         append,
235738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         sc_list);
2358a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2359a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            else
2360a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
2361a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
2362a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  eFunctionNameTypeBase,
2363a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
2364a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
2365a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
2366a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2367a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
236803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
236903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
237003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
237103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
237203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
237303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
237403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
237503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
237603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
237703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
237803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
237903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
238003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
238103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
238203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
238303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // overloaded
238416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        if (!context.m_found.function_with_type_info)
238567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            AddOneFunction(context, sym_ctx.function, NULL, current_id);
238616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function_with_type_info = true;
238716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
238803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
238903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
239003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
239103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
239203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
239303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
239403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
239503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
239603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
239703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
239816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                if (!context.m_found.function_with_type_info)
239903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
240003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
240103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
240267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, generic_symbol, current_id);
240316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
240403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
240503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
240603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
240767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, non_extern_symbol, current_id);
240816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
240903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
241003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
241103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
241203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
241316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan            if (!context.m_found.variable)
241403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
241516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
241603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
241703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2418aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
241903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
242003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
242103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
242267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    AddOneGenericVariable(context, *data_symbol, current_id);
242316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                    context.m_found.variable = true;
242403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
242503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
242603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
242703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2428a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan        if (module_sp && namespace_decl)
242903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
2430a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            ClangNamespaceDecl found_namespace_decl;
243103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2432a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor();
243303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2434a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            if (symbol_vendor)
243503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
2436a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                SymbolContext null_sc;
243703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2438a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &namespace_decl);
2439a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2440a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                if (found_namespace_decl)
2441a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                {
2442a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    context.m_namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(module_sp, found_namespace_decl));
244303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2444a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    if (log)
244567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        log->Printf("  FEVD[%u] Found namespace %s in module %s",
244667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                    current_id,
2447a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                                    name.GetCString(),
2448a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                                    module_sp->GetFileSpec().GetFilename().GetCString());
244903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
245003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
245103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
2452a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan        else
245303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
2454a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages();
2455a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2456a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            for (uint32_t i = 0, e = images.GetSize();
2457a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                 i != e;
2458a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                 ++i)
2459a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            {
2460a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                ModuleSP image = images.GetModuleAtIndex(i);
2461a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2462a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                if (!image)
2463a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    continue;
2464a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2465a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                ClangNamespaceDecl found_namespace_decl;
2466a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2467a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                SymbolVendor *symbol_vendor = image->GetSymbolVendor();
2468a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2469a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                if (!symbol_vendor)
2470a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    continue;
2471a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2472a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                SymbolContext null_sc;
2473a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2474a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &namespace_decl);
2475a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2476a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                if (found_namespace_decl)
2477a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                {
2478a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    context.m_namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(image, found_namespace_decl));
2479a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2480a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    if (log)
248167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        log->Printf("  FEVD[%u] Found namespace %s in module %s",
248267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                    current_id,
2483a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                                    name.GetCString(),
2484a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                                    image->GetFileSpec().GetFilename().GetCString());
2485a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                }
2486a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            }
248703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
248803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    }
2489a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
249038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    TypeList types;
249138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    SymbolContext null_sc;
249238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
249338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    if (module_sp && namespace_decl)
249438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        module_sp->FindTypes(null_sc, name, &namespace_decl, true, 1, types);
249538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    else
249638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        target->GetImages().FindTypes (null_sc, name, true, 1, types);
249738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
249838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    if (types.GetSize())
2499ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
250038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        TypeSP type_sp = types.GetTypeAtIndex(0);
250138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
2502ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
25036df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
250467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            const char *name_string = type_sp->GetName().GetCString();
250567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
250667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  FEVD[%u] Matching type found for \"%s\": %s",
250767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
250867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        name.GetCString(),
250967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (name_string ? name_string : "<anonymous>"));
2510ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        }
25112403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
251238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        TypeFromUser user_type(type_sp->GetClangFullType(),
251338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                               type_sp->GetClangAST());
25146df0840c87be29724055716db951aa6d494ddabcSean Callanan
2515ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        AddOneType(context, user_type, false);
25166df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
251724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2518e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananclang::ExternalLoadResult
25209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context,
25219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  bool (*predicate)(Decl::Kind),
25229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  llvm::SmallVectorImpl<Decl*> &decls)
2523e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{
25249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
25259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2526e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
25279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const Decl *context_decl = dyn_cast<Decl>(decl_context);
25299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!context_decl)
25319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast_context = &context_decl->getASTContext();
25349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2535c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan    static unsigned int invocation_id = 0;
2536c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan    unsigned int current_id = invocation_id++;
2537c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan
25389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (log)
253916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
254016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
2541c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan            log->Printf("FindExternalLexicalDecls[%u] in '%s' (a %s) with %s predicate",
2542c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                        current_id,
254316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_named_decl->getNameAsString().c_str(),
254416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_decl->getDeclKindName(),
254516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
254616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if(context_decl)
2547c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan            log->Printf("FindExternalLexicalDecls[%u] in a %s with %s predicate",
2548c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                        current_id,
254916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_decl->getDeclKindName(),
255016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
255116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
2552c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan            log->Printf("FindExternalLexicalDecls[%u] in a NULL context with %s predicate",
2553c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                        current_id,
255416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
255516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
25569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25579b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *original_decl = NULL;
25589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *original_ctx = NULL;
25599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25609b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context);
25619b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25629b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer)
25639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25659b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
25669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25679b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2568e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (log)
2569e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
25709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        std::string decl_print_string;
25719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        llvm::raw_string_ostream decl_print_stream(decl_print_string);
25729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        original_decl->print(decl_print_stream);
25739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        decl_print_stream.flush();
257467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        log->Printf("  FELD[%u] Original decl:\n%s", current_id, decl_print_string.c_str());
25759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    }
25769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
25789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    {
25799b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        ExternalASTSource *external_source = original_ctx->getExternalSource();
2580336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2581c613971c0016484053b60db95d01648a3f6ea849Sean Callanan        if (external_source)
2582c613971c0016484053b60db95d01648a3f6ea849Sean Callanan            external_source->CompleteType (original_tag_decl);
2583e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2584e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
2586e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25879b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!original_decl_context)
25889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
2589e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25909b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
25919b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         iter != original_decl_context->decls_end();
25929b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         ++iter)
2593e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
25949b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        Decl *decl = *iter;
2595e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25969b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!predicate || predicate(decl->getKind()))
2597e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
25989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            if (log)
25999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            {
26009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                std::string decl_print_string;
26019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                llvm::raw_string_ostream decl_print_stream(decl_print_string);
26029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                decl->print(decl_print_stream);
26039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                decl_print_stream.flush();
2604c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan
2605c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
260667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    log->Printf("  FELD[%d] Adding [to %s] lexical decl %s", current_id, context_named_decl->getNameAsString().c_str(), decl_print_string.c_str());
2607c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                else
260867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    log->Printf("  FELD[%d] Adding lexical decl %s", current_id, decl_print_string.c_str());
26099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            }
26109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl);
2612e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            decls.push_back(copied_decl);
2614e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
2615e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2616e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return ELR_AlreadyLoaded;
26189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
26199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
26219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
26229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
26239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
26249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl);
26269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
26279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
26299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
26309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
26319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
26329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl);
2634e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton}
2635e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2636336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
26378de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
26388de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
26398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
26404a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var,
26419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
26428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
26438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
26448de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2646e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
26476184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2652810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2653810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
2654336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
266024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2661810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2662810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
2663336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2668b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
266924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2670810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2671810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
2672336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
267324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
267424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2675336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
2676336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
267824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2679178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2680178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
2681567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
2682567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2683178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
2684178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
2685178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
2686178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
2687567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
2688178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2691bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2693810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2694810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
2695336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2697b01000fd063629facd45044f137446fb748ee179Greg Clayton
269858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
2699336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2700f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
2701f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
2702b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
2703f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
27044b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
27054b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
27064b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
27074b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
27084b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
27094b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
27104b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
27114b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
2712f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
2713f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2714f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2715336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
2716336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
271724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
27196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
2725336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
2727336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
273024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
2732336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
2733336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2736567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
273847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
273947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
274047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->GetScalar() = load_addr;
274147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->SetValueType(Value::eValueTypeLoadAddress);
274247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
274324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2745f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
2746b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
2747336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2748336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
2749336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
2750336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2751336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
275267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, unsigned int current_id)
2753336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
2754aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2755aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2756e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
275747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2758f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
2759f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
2760336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2761aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
27628de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
27638de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
27648de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
27658de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
2766336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
27674b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
27684b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
27694b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
27706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
27718de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2772427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
2773fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2774fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      entity_name,
2775427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      ut,
277647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
277747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2778427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2779427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2780427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2781427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2782427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2783427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2784696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2786810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
27878de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2788a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2789a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2790a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2791a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2792a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
279367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        log->Printf("  FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), var_decl_print_string.c_str());
27946e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan
27959b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //if (log->GetVerbose())
27969b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //{
27979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    StreamString var_decl_dump_string;
27989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
27999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    log->Printf("%s\n", var_decl_dump_string.GetData());
28009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //}
28018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
28028f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
28038f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
28048f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
2805a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
280667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       ClangExpressionVariableSP &pvar_sp,
280767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       unsigned int current_id)
2808a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
2809e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
281045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2811427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
2812a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2813427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2814427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
2815427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
2816427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
2817a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
28186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
28198c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2820427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
2821427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
2822427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
2823427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
2824427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
282545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
282645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
2827a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
2828a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2829a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2830a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2831a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2832a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
283367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        log->Printf("  FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
2834a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
2835a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
2836a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
28371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
2838819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
283967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              Symbol &symbol,
284067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              unsigned int current_id)
2841819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2842819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
2843819749647b1605f75753f625050cb240292c08b0Sean Callanan
2844819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2845819749647b1605f75753f625050cb240292c08b0Sean Callanan
2846567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2847567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2848567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
2849567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
2850567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2851567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2852819749647b1605f75753f625050cb240292c08b0Sean Callanan
2853fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
2854819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
2855819749647b1605f75753f625050cb240292c08b0Sean Callanan
2856fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
2857819749647b1605f75753f625050cb240292c08b0Sean Callanan                                context.GetASTContext());
2858819749647b1605f75753f625050cb240292c08b0Sean Callanan
2859fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2860819749647b1605f75753f625050cb240292c08b0Sean Callanan
2861819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2862819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
2863819749647b1605f75753f625050cb240292c08b0Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2864819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
2865819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
286647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
286747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2868819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
2869819749647b1605f75753f625050cb240292c08b0Sean Callanan
2870819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
2871819749647b1605f75753f625050cb240292c08b0Sean Callanan
2872819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddressRange &symbol_range = symbol.GetAddressRangeRef();
2873819749647b1605f75753f625050cb240292c08b0Sean Callanan    Address &symbol_address = symbol_range.GetBaseAddress();
2874567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
2875819749647b1605f75753f625050cb240292c08b0Sean Callanan
2876819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2877819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
2878819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2879819749647b1605f75753f625050cb240292c08b0Sean Callanan
2880fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    entity->EnableParserVars();
2881819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
2882819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
2883819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
2884819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
2885819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
2886fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //entity->m_flags                      |= ClangExpressionVariable::EVUnknownType;
2887819749647b1605f75753f625050cb240292c08b0Sean Callanan
2888819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
2889819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2890819749647b1605f75753f625050cb240292c08b0Sean Callanan        std::string var_decl_print_string;
2891819749647b1605f75753f625050cb240292c08b0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2892819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl->print(var_decl_print_stream);
2893819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl_print_stream.flush();
2894819749647b1605f75753f625050cb240292c08b0Sean Callanan
289567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        log->Printf("  FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), var_decl_print_string.c_str());
2896819749647b1605f75753f625050cb240292c08b0Sean Callanan
28979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //if (log->GetVerbose())
28989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //{
28999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    StreamString var_decl_dump_string;
29009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
29019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    log->Printf("%s\n", var_decl_dump_string.GetData());
29029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //}
2903819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2904819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2905819749647b1605f75753f625050cb240292c08b0Sean Callanan
2906fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
2907fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
2908fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
2909fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2910567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2912567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2913fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2914fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
2915fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
2916fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
2917fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
2918fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2919fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2920fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2921fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
2922fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2923fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2924fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2925fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
2926fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2927fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
2928fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
2929fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
2930fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2931fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2932fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
2933fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2934fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                std::string var_decl_print_string;
2935fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2936fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                var_decl->print(var_decl_print_stream);
2937fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                var_decl_print_stream.flush();
2938fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2939fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str());
2940fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2941fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2942fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
2943fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2944fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2945fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2946fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2947fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
2948fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2949fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2950fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_parser_type = parser_type;
2951fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2952fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
2953fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
2954fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2955fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2956fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
2957fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
2958fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2959fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
2960fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
2961fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2962819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
2963427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
296467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        const RegisterInfo *reg_info,
296567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
29661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
29671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
29681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
29701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
29711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
29721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
29741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2975122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
297667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
29771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
29781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
29791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2980427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
2981427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
29821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
29841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2985fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
298647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
298747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2988427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
29891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
2991427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
2992427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
29971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
299867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    if (log && log->GetVerbose())
29991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
30001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        std::string var_decl_print_string;
30011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
30021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl->print(var_decl_print_stream);
30031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl_print_stream.flush();
30041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
300567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        log->Printf("  FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
30061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
30071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
30081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
30099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananNamespaceDecl *
301016b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls)
30116916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
301216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (namespace_decls.empty())
301316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return NULL;
301416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30156916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
30166916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
3017e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    assert (m_parser_vars.get());
3018e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
301916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second;
302016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
302216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                                                                         namespace_decl.GetNamespaceDecl());
302316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
302416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl);
302516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
302616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
302716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
30289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return dyn_cast<NamespaceDecl>(copied_decl);
30296916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
30306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
3031a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
3032da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
3033da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
303467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        Symbol* symbol,
303567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
30368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
3037aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3038aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3039e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
30408f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
304158baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
30420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
304358baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
30448f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
30460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
30479b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
30488f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
30500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
30520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
30540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
305667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no type");
30570fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30590fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
306004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
30610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
30630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
306567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no Clang type");
30660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
30700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
3071b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
3072ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
30730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
30750fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
30770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
30790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
30810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
30838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
3084810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
308567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->PutCString("  AddOneFunction called with no function and no symbol");
30868f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
30878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
30888f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3090567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3091567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
30928f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
30938f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
30948f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3095fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
309647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
309747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3098427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
30998de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
3100427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
3101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
3102427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
3103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3104427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
3105427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
3106427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3107427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
31088c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3109810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
31108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3111a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string fun_decl_print_string;
3112a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
3113a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl->print(fun_decl_print_stream);
3114a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl_print_stream.flush();
3115a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
311667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        log->Printf("  FEVD[%u] Found %s function %s, returned %s",
311767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    current_id,
311867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    (fun ? "specific" : "generic"),
311967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    decl_name.c_str(),
312067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    fun_decl_print_string.c_str());
31218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
312224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
312393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
312493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
312593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
31263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
312767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                   unsigned int current_id,
31283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
312993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
31309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context = context.GetASTContext();
31319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
31323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3133ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
31343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
313693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
31373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
31383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
31393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
31403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
31423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
31443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
31453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
31463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
31473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
31483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
314930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
31511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
31521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
315330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
315430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
31561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
31578de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
31581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
31591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
31601d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
31611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
316230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
316330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
31643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
316593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
316693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
316793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
3168ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3169ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid *
3170ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
3171ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         ASTContext *source_context,
3172ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         void *clang_type)
3173ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{
3174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = true;
3177ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3178e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context);
3179e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
3180e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    QualType ret_qual_type = importer->CopyType (source_context,
3181e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                                 QualType::getFromOpaquePtr(clang_type));
3182e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
3183e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    void *ret = ret_qual_type.getAsOpaquePtr();
3184ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3185aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = false;
3186ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3187ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    return ret;
3188ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan}
3189