ClangExpressionDeclMap.cpp revision a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangExpressionDeclMap.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h"
17a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
20810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h"
216184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
23061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h"
2405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h"
256e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
27a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
28cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
40f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
41810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
4217c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
44f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
473bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) :
528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
54dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_keep_result_in_memory (keep_result_in_memory),
55aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
56dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_struct_vars ()
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
636d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    // Note: The model is now that the parser's AST context and all associated
646d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   data does not vanish until the expression has been executed.  This means
656d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   that valuable lookup data (like namespaces) doesn't vanish, but
666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    DidParse();
68aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
69aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
72166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool
73427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
748c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
75aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_exe_ctx = &exe_ctx;
77567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
78567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx.GetFramePtr())
80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetThreadPtr())
82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetProcessPtr())
84987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
85987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
86567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
87987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
88567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (target)
89987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
90987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton        m_parser_vars->m_sym_ctx.Clear();
91567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
92987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
9397ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan
94567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
97166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!target->GetScratchClangASTContext())
99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            return false;
100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
101166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
10247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    m_parser_vars->m_target_info = GetTargetInfo();
10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
104166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    return true;
105aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
106c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
107427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
108427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
112427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp &&
118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars.get() &&
119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars->m_lldb_value)
120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                delete var_sp->m_parser_vars->m_lldb_value;
121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp->DisableParserVars();
123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
129427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
130427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                pvar_sp->DisableParserVars();
132aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1357a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
14047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo
14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo()
14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo ret;
14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
148567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx)
14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx->GetProcessPtr();
151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (process)
152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.byte_order = process->GetByteOrder();
154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ret.address_byte_size = process->GetAddressByteSize();
155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        else
157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            Target *target = exe_ctx->GetTargetPtr();
159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (target)
160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            {
161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.byte_order = target->GetArchitecture().GetByteOrder();
162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            }
164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return ret;
16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1708de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
17282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
173aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
176427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
177427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
181aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
18282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
18382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
18405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
190166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
192567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
193567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
194567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
195567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
196567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
19705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
19805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
19905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetASTContext(),
20005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetOpaqueQualType()),
20105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
20247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
2050e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
20647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
20747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
2080e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
2090e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2100e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
2110e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2120e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
2130e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
21405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2150e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
2160e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
2170e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
21805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
21905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
22047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
22105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
22305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
22405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
22505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
2282bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen    for (size_t byte_idx = 0;
22905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
23205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
23405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
23647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (m_parser_vars->m_target_info.byte_order)
23705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
2380e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
2400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
2410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
2420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
2440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
2460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
2470e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
2480e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
2490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
2500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
25105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
25205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
2536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
255696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
256696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
25905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
26005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
261696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP
262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
2639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                           VarDecl *decl,
264696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           lldb_private::TypeFromParser type)
265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{
266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    assert (m_parser_vars.get());
267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
270696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
271567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
273567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
274567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
275567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
276567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return ClangExpressionVariableSP();
286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
287696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
288696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetASTContext(),
289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetOpaqueQualType()),
290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                           context);
291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser var_type = var_sp->GetTypeFromUser();
293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
294567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx->GetFramePtr();
295567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL)
296567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return lldb::ClangExpressionVariableSP();
297567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
298567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type);
299696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var)
301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
303567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
304696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_valobj)
306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
307696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
308696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
309696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
310696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_casted_valobj)
311696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
312696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (log)
314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    {
315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        StreamString my_stream_string;
316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
317696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
318696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           var_type.GetOpaqueQualType(),
319696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           &my_stream_string);
320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    }
324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!pvar_sp)
328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return pvar_sp;
338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan}
339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
34047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name)
34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference);
34647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
34747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
34847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
34947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj,
35047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                lldb_private::Value &value,
35147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                const ConstString &name,
352a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                lldb_private::TypeFromParser type,
353a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan                                                bool transient)
35447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
35547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name);
35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!pvar_sp)
36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
363a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !pvar_sp->m_live_sp &&
364a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        !transient)
36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        // The reference comes from the program.  We need to set up a live SP for it.
36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetASTContext(),
37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetTypeFromUser().GetOpaqueQualType(),
37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetName(),
37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetScalar().ULongLong(),
37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            value.GetValueAddressType(),
37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                            pvar_sp->GetByteSize());
37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry)
37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->ValueUpdated();
38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        const size_t pvar_byte_size = pvar_sp->GetByteSize();
38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        uint8_t *pvar_data = pvar_sp->GetValueBytes();
38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!ReadTarget(pvar_data, value, pvar_byte_size))
38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry);
38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    valobj = pvar_sp;
39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return true;
39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
3958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
3968de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
3978de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
3998de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
4016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
4026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
4038de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
404a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
405aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
406aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
4076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
408fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
409567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
412567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
413567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
414567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
415567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
416a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
417a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
41882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
41982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
42097678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
424a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
425fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
426fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
427427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
42847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.byte_order,
42947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                     m_parser_vars->m_target_info.address_byte_size))
4308c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4318c12720c108cd5e7ed792596749218d8400f647eSean Callanan
432427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
4338c12720c108cd5e7ed792596749218d8400f647eSean Callanan
434427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4358c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4368c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
4386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
4396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
4416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
4456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
4476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
4506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
4516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
4526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
4536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
4546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
455427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
4568c12720c108cd5e7ed792596749218d8400f647eSean Callanan
457427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
458427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
4598c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4608c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
461a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
462a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
463a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
4648de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
4658de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4678de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
4698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
4708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
4718de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
473aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
476e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
47745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
478aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
4798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
4828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
483427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
4848c12720c108cd5e7ed792596749218d8400f647eSean Callanan
485427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
486427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
4878c12720c108cd5e7ed792596749218d8400f647eSean Callanan
488427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
4898c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan
49145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
49245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
49345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
4948de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
495427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
49645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
4978c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
4988c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
499427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
5008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
501427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
502427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
503427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
5048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
505427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
5068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
5128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
513aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
514aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
515aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
5168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
5178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
5198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
520aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
521aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
5228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
523427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
5248c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5258c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
5268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
527427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
528427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
529427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
530427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
5328c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5348c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
535427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
5368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
5398c12720c108cd5e7ed792596749218d8400f647eSean Callanan
540427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
5428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
5438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
544aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
5458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
546aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
5478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5508de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
5518de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
5538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
5548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
5558de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
557aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
558aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
559aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
562427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
563aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
5698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
5708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
5718de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
5738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
5748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
5758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
5768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
5778de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
5788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
579aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
5828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
584427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
5858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
5868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
5888c12720c108cd5e7ed792596749218d8400f647eSean Callanan
589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_jit_vars.get())
5928c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
5938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
594427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
596427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
597427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
5988c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
6008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
6018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
60202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
6038de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
6048de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
6068de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value**& value,
6078de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
6088de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
609ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
610427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
6118c12720c108cd5e7ed792596749218d8400f647eSean Callanan
612427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
6138c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
614ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
6158c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
6168c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
617ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
618427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = &entity_sp->m_parser_vars->m_llvm_value;
619427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
6208c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6218c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
622ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
623ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
624ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
625ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
626ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
627ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
628ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
629ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
630ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
631ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
632ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
633aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan       sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
634ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
635ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (!sc_list.GetSize())
636ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list);
637ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
638ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
639f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
6408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
6418de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
643da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
6448de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
645f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
646aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
648aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
649567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx == NULL)
651567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
652567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx->GetTargetPtr();
653f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
654567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
65578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
65678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
657f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
658f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
659e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
660f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
661ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
662ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
663e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
664aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
665aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
666aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
667aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
668aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        Mangled mangled(name.GetCString(), true);
669aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
670aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        ConstString demangled_name = mangled.GetDemangledName();
671aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
672aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        if (strlen(demangled_name.GetCString()))
673aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
674aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            std::string const_name_scratch(demangled_name.GetCString());
675aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
676aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            const_name_scratch.append(" const");
677aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
678aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            ConstString const_name(const_name_scratch.c_str());
679aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
680ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan            FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
681aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
682aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
683aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan                log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString());
684aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
685aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
686aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
687aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
688f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
689f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
690f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
691e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
692f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
693da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
694f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
696da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
697f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
698da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
699f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
700f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
701f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
702ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
703ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
704ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
705567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (target);
706da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
707f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
708f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
709f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
710cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
711cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
712c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
713c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
714c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
715819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
716c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
717cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
718cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
719cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
720cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
721cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
722cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
723cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
724c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
725cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
726ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
727ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
728ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
729ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
730cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
731cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
732cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
733cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
734cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
735cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
736cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
737cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
738cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
739cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
740cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
741cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
742cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
743cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
744cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
745cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
746cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeExtern:
747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
748cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
749cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
750cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
752cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
753cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
757cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
765cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
766cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
767c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
768cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
769c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
770c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
771cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
772cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
773819749647b1605f75753f625050cb240292c08b0Sean Callanan{
774819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
775819749647b1605f75753f625050cb240292c08b0Sean Callanan
776819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (!m_parser_vars->m_exe_ctx ||
777567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        !m_parser_vars->m_exe_ctx->GetTargetPtr())
778819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
779819749647b1605f75753f625050cb240292c08b0Sean Callanan
780567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name);
781819749647b1605f75753f625050cb240292c08b0Sean Callanan}
782819749647b1605f75753f625050cb240292c08b0Sean Callanan
78347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter
78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value,
78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     const uint8_t *data,
78847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                     size_t length)
78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
79047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
79347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
794567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
79547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
797567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
79847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
80147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
80447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
809567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err))
81047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return reg_ctx->WriteRegister(reg_info, reg_value);
81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
81847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        default:
81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeFileAddress:
82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
822567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
82347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
82447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
825567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
828567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
831567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                lldb::addr_t load_addr = file_addr.GetLoadAddress(target);
83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
834567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory(load_addr, data, length, err);
83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeLoadAddress:
83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
840567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
844567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeHostAddress:
84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            memcpy ((void *)value.GetScalar().ULongLong(), data, length);
85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return true;
85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        case Value::eValueTypeScalar:
85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool
85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data,
85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    lldb_private::Value &value,
86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                    size_t length)
86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
865567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
866567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx->GetProcessPtr();
867567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (value.GetContextType() == Value::eContextTypeRegisterInfo)
86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
870567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!process)
87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterContext *reg_ctx = exe_ctx->GetRegisterContext();
87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        RegisterInfo *reg_info = value.GetRegisterInfo();
87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx)
87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        lldb_private::RegisterValue reg_value;
88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        Error err;
88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (!reg_ctx->ReadRegister(reg_info, reg_value))
88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return false;
88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
885567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err);
88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        switch (value.GetValueType())
89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            default:
89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeFileAddress:
89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
895567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Target *target = exe_ctx->GetTargetPtr();
896567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (target == NULL)
89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Address file_addr;
90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
901567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr))
90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
905567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                target->ReadMemory(file_addr, true, data, length, err);
90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeLoadAddress:
91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process)
91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    return false;
91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                Error err;
915567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err);
91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return err.Success();
91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeHostAddress:
92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                memcpy (data, (const void *)value.GetScalar().ULongLong(), length);
92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return true;
92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            case Value::eValueTypeScalar:
92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return false;
92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value
92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl)
93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx;
93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl));
93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl));
93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (expr_var_sp)
93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
9404a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var)
9416d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan            return Value();
9426d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
9434a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        return *GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL);
94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else if (persistent_var_sp)
94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
947a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference ||
948a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan             persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) &&
949a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            persistent_var_sp->m_live_sp)
950a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
951a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return persistent_var_sp->m_live_sp->GetValue();
952a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
953a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        else
954a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        {
955a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            lldb_private::Value ret;
956a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetValueType(Value::eValueTypeHostAddress);
957a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.SetContext(Value::eContextTypeInvalid, NULL);
958a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes();
959a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan            return ret;
960a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan        }
96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    else
96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return Value();
96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
968810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
969f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
970f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
9718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
9728de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
973aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
9748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
9758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
9768de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
977f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
978aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
979aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
980567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    m_material_vars->m_process = exe_ctx.GetProcessPtr();
981aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
9820ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
9830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                exe_ctx,
9840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
9850ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
9860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
9870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
988f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
989f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
990aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
991f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
992f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
993f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
994f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
995f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
9968de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
9978de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
9988de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
9993aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
1000aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1001047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
1002047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
10038de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
10043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
1005aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1006aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1007567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1008567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1009567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1010567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1011567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (frame == NULL || process == NULL || target == NULL)
10123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
10143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1017aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
10183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
10203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1023567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    VariableSP object_ptr_var = FindVariableInScope (*frame,
1024696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
1025696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
10263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
10283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
10303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1033aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
10343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
1035aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
10363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
10383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
10393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
10403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
10413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
10423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
104350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
10443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
104550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
104650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
104750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
104850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
10493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
105050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
1051567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize();
105250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
105350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
105450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
105550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
105650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
105750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
105850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
105950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
106050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
1061567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            object_ptr = process->ReadPointerFromMemory (value_addr, read_error);
1062c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
106350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
106450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
106550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
1066c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
106750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
10683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
106950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
10703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
107150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
107250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
107350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
107450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
107550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
107650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
107750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
107850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
107950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1080061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
108150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1082061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
108350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
108450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
108550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
108650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
108750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1088061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
108950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1090061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
109150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
1092061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
109350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
109450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
109550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1096061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
109750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
1098061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
109950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
110050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
11013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
11023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
11033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
11043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11053c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
11068de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
11078de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1108aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
1109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
11100ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
11110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
11128de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11138de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1114f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
11150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
1116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
1118aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
1119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
1121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
1122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
1124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
1125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
1127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
1128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
1130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
1131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
1132aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
1134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
1136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
1137f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1138f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
113932824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
11408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
11418de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1142aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
11438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
11448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
11458de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
114632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
1147aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1148aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
1149aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1150aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
115132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
115232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
115332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
115432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
1155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!process)
115832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
115932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
116032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
116132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
116232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!target)
116532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
116632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
116732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
116832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
116932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
11703371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
11713371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
11723371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
11733371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
11743371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
11753371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
1176c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
117732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
117832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
1179567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (process->ReadMemory (m_material_vars->m_materialized_location,
1180c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
1181c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
118232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
118332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
118432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
118532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
118632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1187567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize());
118832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1189427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
1190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
1191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
119232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
1193427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
119432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1195427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
1196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
1197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
11998c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1200427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
12018c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
12028c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1203427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
1204427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
1205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
1206427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
1207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
1208427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
1209427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
1210427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
1211427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
121232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
121332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
121432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
121532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
121632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
121732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
121832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
1219f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12208de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
12218de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
1223aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
12240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
12250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
1226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
12278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12288de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1229810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
1230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1233aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1234aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1235e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
123682b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1237aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
1238810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1239810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
124057067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
1241810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1242810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1243567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1244567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (!frame)
124545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
124645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
124757067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton        return false;
124845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
1249567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
125045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
1251567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ClangPersistentVariables &persistent_vars = target->GetPersistentVariables();
1252aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1253aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
1254e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
1255e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
1256e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
1257e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
12589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        m_material_vars->m_allocated_area = NULL;
1259e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1260e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
1261e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
1262e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
1263567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything));
1264810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1265f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
1266f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1267567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = exe_ctx.GetProcessPtr();
1268aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
1269f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
1270567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            process->DeallocateMemory(m_material_vars->m_materialized_location);
1271aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
1272f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1273810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
12747a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
12757a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
12767a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
1277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
1278aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1279aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
1280f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1281f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
1282f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
1283f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1284aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
1285f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1286810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1287aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
1288810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1289aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
1290aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
1291810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1292427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
12938c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
12948c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1295810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
1296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
12974d0b110715d321d366dec1dc690300f713b63236Sean Callanan
1298a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
1299336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
1300a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
1301427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
13021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
13031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
13041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1305aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
13061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
13081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
1311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
1312427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
1313427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
1314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
13191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
1320427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
13211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
13256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
13266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
1327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
1328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
13291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
13301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
13318c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1332a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
13338c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
1334a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
1335a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
1336a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
133745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
13386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1339a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
1340a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1341a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1342a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
13436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1344a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1345a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
13466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1347a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1348a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1349a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
13506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
1351a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
13520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
13530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
13540ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1355a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1356a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1358a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1359a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1360a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
13618c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1362a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
13638c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1364810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1365810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1366f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1369a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
13708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
13718de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
13728de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
13738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1374427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
13758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
13760ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
13770ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
13788de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
13798de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1380aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
13816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
13826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1383427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1384a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1385427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1386a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1387a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1388a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1390a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1391427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1392427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
1393a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
1394a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1395a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1396567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1397567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
13986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
13996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1400a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1401a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
14026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
14036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
14066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
14076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
14086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
14096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->ReadPointerFromMemory (addr, read_error);
14126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
14146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
14166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
14206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
14216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
14236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
14246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
142547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
142647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
142747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
142847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
142947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
143047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
143147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
14326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
14356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
14376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1440b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
14416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
14436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
14446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
144697678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
144797678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
14486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
14506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
14526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
14536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
14550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
14566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
1457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
14586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
14606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14630ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
14640ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
14650ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
14660ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
14670ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
14680ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
14690ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
14700ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
14710ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
14720ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
14730ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
14740ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
14750ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
14760ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
14816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
14826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
14836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
14846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
14866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1489567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    Error deallocate_error = process->DeallocateMemory(mem);
14906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
14926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
14936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
14946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
14956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
14966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
14986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
14996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1500a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
15016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1502a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1503a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1504a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1505a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1506a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
15076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
15086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
15096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
15116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
15136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
15156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1516567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            mem = process->AllocateMemory(pvar_byte_size,
15176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
15186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  allocate_error);
15196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
15216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
15236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
15276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
15286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
15306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
153147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
153247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
153347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
153447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
153547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
153647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
153747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
15386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
15406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
15426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
15456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1546567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
15476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
15496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
15526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
15546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
15556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
15566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
15576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1558567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!process->WriteScalarToMemory (addr,
1559c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       var_sp->m_live_sp->GetValue().GetScalar(),
1560567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                       process->GetAddressByteSize(),
1561c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       write_error))
15626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
15646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
15656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
15666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1568c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
15696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1570696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1571a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
15726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1573a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1574a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1575a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1576a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1577a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1578a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1579a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1580f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
15818de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
15828de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
15838de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
15848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
15858de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
15866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
15878de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
15888de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
15898de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1590f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1591e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1592567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
1593567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
1594567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = exe_ctx.GetFramePtr();
1595567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
15966d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get())
1597cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
1598cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
15996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
16026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
16044a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var(expr_var->m_parser_vars->m_lldb_var);
16054a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym);
1606f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1607819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
16084a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1609819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1610819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1611819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(GetVariableValue(exe_ctx,
1612819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              var,
1613819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1614819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1615819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
16164a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    {
1617567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        addr_t location_load_addr = GetSymbolAddress(*target, name);
1618819749647b1605f75753f625050cb240292c08b0Sean Callanan
1619cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1620819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1621819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1622c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1623c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1624819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1625819749647b1605f75753f625050cb240292c08b0Sean Callanan
16264a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan        location_value.reset(new Value);
16274a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan
1628819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1629819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1630819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1631819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1632f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1633c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1634c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1635f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1636f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1637f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1638841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1639fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1640fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1641fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1642fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1643fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1644fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1645fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1646c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1647c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1648c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1649c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1650fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1651f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1652f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1653f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
16548de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1655f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1656f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
165717c6a05cb96f7110332342326a90692d9505982eSean Callanan
165817c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1659f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
166217c6a05cb96f7110332342326a90692d9505982eSean Callanan
166317c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
166417c6a05cb96f7110332342326a90692d9505982eSean Callanan
166517c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1666f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
166717c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1668f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
166917c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
167017c6a05cb96f7110332342326a90692d9505982eSean Callanan
167117c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
167217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1673c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1674c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1675c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
167617c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1677f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
167817c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
167917c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1680f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
16816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
168217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1683c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
16846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1685567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
1686c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           location_value->GetScalar(),
1687567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                           process->GetAddressByteSize(),
1688c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
16896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1690c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1691c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1692c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
16936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
16946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
169517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1696f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
169717c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
169817c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1699f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
17006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
170117c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
170217c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
170317c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
170417c6a05cb96f7110332342326a90692d9505982eSean Callanan
1705c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1706c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1707c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
170817c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
170917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
171017c6a05cb96f7110332342326a90692d9505982eSean Callanan
1711061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
171217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1713061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
171417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1715c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1716c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
171717c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
171817c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
171917c6a05cb96f7110332342326a90692d9505982eSean Callanan
1720061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1721061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1722061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1723061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1724061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
172517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1726c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1727c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1728c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
172917c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
173017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
173117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1732061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
173317c6a05cb96f7110332342326a90692d9505982eSean Callanan
173417c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
173517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
17366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
17396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1744b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
17456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
17466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
17476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1750c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
175117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1752c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1753c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
1754c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
1755c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
1756061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
175717c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
1758061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1759061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
176017c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1761c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1762c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1763c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
176417c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
176517c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
17666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1769567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong());
17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1773c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1774c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1775c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
17766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
178017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
178117c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
178217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
17836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
17846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
17856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
17866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
17876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1788567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                Scalar reg_addr (process->AllocateMemory (value_byte_size,
1789c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1790c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  allocate_error));
17916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1792c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
17936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1794c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1795c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1796c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
17976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
17986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
17996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
18016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
180247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
180347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
180447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
180547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
1806c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
180747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
180847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
18096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
18116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error write_error;
1813c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
1814567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (!process->WriteScalarToMemory (addr,
1815c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr,
1816567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                                                           process->GetAddressByteSize(),
1817c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
18186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1819c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1820c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1821c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
18236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
18246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
18256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
182617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1827c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
1828c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1829c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
183017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
183117c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
1832061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1833061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                RegisterValue reg_value;
1834061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1835061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
183617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1837c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1838c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1839c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
184017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
184117c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
184217c6a05cb96f7110332342326a90692d9505982eSean Callanan
1843c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
1845c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
1846c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
1847061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
184817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
184917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1850f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1851f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1852f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1853f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1854810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
1855810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
18561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
18571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
18581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
18591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
18601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
18611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
1862b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
18631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
18641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
18651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
18661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
18671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
1868061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
18691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
18701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
1871061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1872061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
18731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1874bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
18751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
18761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1878061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
18791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1880061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
18811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
18821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
18841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
18851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
18861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1887061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
18881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1889061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
18901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
18911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1893061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1894061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
18951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
189695b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString());
18971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
18981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
19001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
19021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
19031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1904696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
19058de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
19068de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
19078de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
19088de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
19098de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
19108de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1911aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1912e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1913cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1914f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    ValueObjectSP valobj;
1915f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    VariableSP var_sp;
1916f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    Error err;
1917f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan
1918f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    valobj = frame.GetValueForVariableExpressionPath(name.GetCString(),
1919f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     eNoDynamicValues,
1920f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     StackFrame::eExpressionPathOptionCheckPtrVsMember,
1921f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     var_sp,
1922f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan                                                     err);
19233bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1924f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan    if (!err.Success() ||
1925f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan        !var_sp ||
1926ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
1927ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
1928ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
19293bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
19303bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
19313bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
19323bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
19333bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
193404c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
1935696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                return lldb::VariableSP();
19363bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
19373bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
19383bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
19393bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
19403bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
1941696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan            return lldb::VariableSP();
19423bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
19433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
19443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1945696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return var_sp;
1946cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
1947336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1948819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
1949819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
1950819749647b1605f75753f625050cb240292c08b0Sean Callanan(
1951819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
1952aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    const ConstString &name
1953819749647b1605f75753f625050cb240292c08b0Sean Callanan)
1954819749647b1605f75753f625050cb240292c08b0Sean Callanan{
1955819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
1956819749647b1605f75753f625050cb240292c08b0Sean Callanan
1957aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name,
1958aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  eSymbolTypeData,
1959aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                                                  sc_list);
1960819749647b1605f75753f625050cb240292c08b0Sean Callanan
1961819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
1962819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1963819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
1964819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
1965819749647b1605f75753f625050cb240292c08b0Sean Callanan
1966819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
1967819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1968819749647b1605f75753f625050cb240292c08b0Sean Callanan
1969819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
1970819749647b1605f75753f625050cb240292c08b0Sean Callanan}
1971819749647b1605f75753f625050cb240292c08b0Sean Callanan
197247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
197347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
197447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
197547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
197694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
197794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
197894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
197947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
198047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
198147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
198247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
198347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
198494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
198594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
198694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
198794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
198847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
198947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
199047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
199147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
199247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
199347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
199447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
199547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
199647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
199747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
199847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                {
199947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                    if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
200047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                        return var_sp;
200147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                }
200247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
200347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
200447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
200547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
200647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
200747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
200847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
200947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
201047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
201147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
201247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
201447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
201516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
201616b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name)
201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2018e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2020aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_ignore_lookups)
2021ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
202267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
2023ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
2024ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
2025ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
2026e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
202767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    static unsigned int invocation_id = 0;
202867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    unsigned int current_id = invocation_id++;
202967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
203016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
203116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
203216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
203367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
203416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
203567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
203616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
203767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
203816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2039a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2040a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan    context.m_namespace_map.reset(new ClangASTImporter::NamespaceMap);
204116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
204216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
204316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
204416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->m_ast_importer->GetNamespaceMap(namespace_context);
2045a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
204667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
204767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  FEVD[%u] Inspecting namespace map %p (%d entries)",
204867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
204967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        namespace_map.get(),
205067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)namespace_map->size());
2051a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
205216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
205316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
205416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
205516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
205616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
205767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf("  FEVD[%u] Searching namespace %s in module %s",
205867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            current_id,
205916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
206016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
206116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
2062c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan            FindExternalVisibleDecls(context,
2063c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->first,
2064c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->second,
206567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     name,
206667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     current_id);
206716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
206816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
206916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else if (!isa<TranslationUnitDecl>(context.m_decl_context))
207016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
207116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        // we shouldn't be getting FindExternalVisibleDecls calls for these
207216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return;
207316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
207416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    else
207516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
207616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
207716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
207816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
207967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  FEVD[%u] Searching the root namespace", current_id);
208016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
208116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
208216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
208316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
208467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 name,
208567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 current_id);
208616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
2087a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2088a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan    if (!context.m_namespace_map->empty())
2089a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan    {
209067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
209167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  FEVD[%u] Registering namespace map %p (%d entries)",
209267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
209367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        context.m_namespace_map.get(),
209467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)context.m_namespace_map->size());
2095a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2096a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan        NamespaceDecl *clang_namespace_decl = AddNamespace(context, context.m_namespace_map);
2097a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2098a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan        if (clang_namespace_decl)
2099a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            clang_namespace_decl->setHasExternalVisibleStorage();
2100a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan    }
210116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
210216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
210316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
210416b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
210538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                                  lldb::ModuleSP module_sp,
210603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
210767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  const ConstString &name,
210867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  unsigned int current_id)
210916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
211016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    assert (m_struct_vars.get());
211116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    assert (m_parser_vars.get());
211216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
211316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2114e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2115e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21173bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
21183bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21193bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
21203bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
21213bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
21228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
21238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
2124567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2125567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr();
212603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
21273cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
212857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
212947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
213057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
213157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
213257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
213357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2134567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
213547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
213647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2137567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
213857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
213957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
214057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
214157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
214257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
214357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
214475a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!this_var ||
2145567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->IsInScope(frame) ||
2146567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !this_var->LocationIsValidForFrame (frame))
214757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
214857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
214957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
215057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
215157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
215257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
215357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
215467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            if (log && log->GetVerbose())
21552403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
215667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf ("  FEVD[%u] Type for \"this\" is: ", current_id);
21572403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
21582403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
21592403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
21602403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
216103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
216204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser this_user_type(this_type->GetClangFullType(),
216357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
216457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2165aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
216657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
216758baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
216857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
216957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
217057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
217157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
217257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
2173c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type);
2174c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2175c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            if (pointer_target_qual_type.isConstQualified())
2176c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan                pointer_target_qual_type.removeLocalConst();
2177c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan
2178c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan            TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(),
217957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
218003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
21813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
21823aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
2183a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(pointer_target_qual_type);
2184a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("  FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
21853aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
21863aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2187e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            AddOneType(context, class_user_type, current_id, true);
218857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
218957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
219057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
219157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
21923aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
21933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
21943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
21953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
21963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2197567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
219847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
219947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2200567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            VariableList *vars = frame->GetVariableList(false);
220103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
22033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
220403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
220603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
220775a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!self_var ||
2208567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->IsInScope(frame) ||
2209567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                !self_var->LocationIsValidForFrame (frame))
22103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
221103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
22133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
22153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
221603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
221704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser self_user_type(self_type->GetClangFullType(),
22183aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
22193aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
222103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
222258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
222303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
222527a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham                                                &pointer_target_type)
222619c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton                || pointer_target_type == NULL)
22273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
222803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
22303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
22313aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
22333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
2234a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(pointer_target_type);
2235a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
22363aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
22373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
2238e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            AddOneType(context, class_user_type, current_id, false);
22393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
22403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
22413aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
2242c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
2243c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
2244c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
2245c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
224603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22472431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
22482431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
2249567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
22502431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22512431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2252567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
22532431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22542431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
22552431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22562431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22572431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
22582431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22592431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
22602431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22612431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22622431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
226303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
22642431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
22652431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22662431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22672431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl);
22682431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22692431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
22702431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22712431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22722431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
22732431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22742431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
22752431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
22762431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22772431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
227867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->Printf("  FEVD[%u] Found persistent type %s", current_id, name.GetCString());
22792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
22802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
22812431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
22822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
2283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
228403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2285427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
22861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
228767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            AddOneVariable(context, pvar_sp, current_id);
22881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
22891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
22901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
22911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
22921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2293aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
22941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
2295b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
2296e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan
22971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
2298e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            {
2299e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                if (log)
2300e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                    log->Printf("  FEVD[%u] Found register %s", current_id, reg_info->name);
2301e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan
230267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneRegister(context, reg_info, current_id);
2303e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            }
23041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
23058de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
230603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
230703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
230803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
230903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
231003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
231103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
231203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
231303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
231403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
231503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
231603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember,
231703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
231803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
231903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
232003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
232103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (err.Success() && var != NULL)
232203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
232367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneVariable(context, var, current_id);
232416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
232503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
232603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
232703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        else if (target)
232803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
232994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
233038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                      module_sp,
233194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
233294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
233303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
233403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
233503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
233603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
233767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneVariable(context, var, current_id);
233816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
233903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
234003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
234103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
234216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan        if (!context.m_found.variable)
234303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
234403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool include_symbols = true;
234503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
2346a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
234738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            if (namespace_decl && module_sp)
2348a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
234938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                module_sp->FindFunctions(name,
235038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         &namespace_decl,
235138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         eFunctionNameTypeBase,
235238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         include_symbols,
235338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         append,
235438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         sc_list);
2355a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2356a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            else
2357a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
2358a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
2359a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  eFunctionNameTypeBase,
2360a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
2361a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
2362a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
2363a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
2364a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
236503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
236603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
236703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
236803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
236903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
237003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
237103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
237203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
237303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
237403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
237503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
237603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
237703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
237803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
237903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
238003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        // overloaded
238116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        if (!context.m_found.function_with_type_info)
238267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            AddOneFunction(context, sym_ctx.function, NULL, current_id);
238316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function_with_type_info = true;
238416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
238503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
238603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
238703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
238803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
238903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
239003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
239103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
239203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
239303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
239403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
239516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                if (!context.m_found.function_with_type_info)
239603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
239703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
239803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
239967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, generic_symbol, current_id);
240016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
240103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
240203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
240303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
240467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, non_extern_symbol, current_id);
240516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
240603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
240703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
240803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
240903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
241016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan            if (!context.m_found.variable)
241103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
241216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
241303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
241403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2415aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan                Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
241603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
241703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
241803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
241967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    AddOneGenericVariable(context, *data_symbol, current_id);
242016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                    context.m_found.variable = true;
242103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
242203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
242303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
242403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2425a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan        if (module_sp && namespace_decl)
242603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
2427a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            ClangNamespaceDecl found_namespace_decl;
242803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2429a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor();
243003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2431a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            if (symbol_vendor)
243203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
2433a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                SymbolContext null_sc;
243403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2435a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &namespace_decl);
2436a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2437a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                if (found_namespace_decl)
2438a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                {
2439a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    context.m_namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(module_sp, found_namespace_decl));
244003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
2441a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    if (log)
244267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        log->Printf("  FEVD[%u] Found namespace %s in module %s",
244367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                    current_id,
2444a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                                    name.GetCString(),
2445a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                                    module_sp->GetFileSpec().GetFilename().GetCString());
244603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
244703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
244803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
2449a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan        else
245003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
2451a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages();
2452a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2453a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            for (uint32_t i = 0, e = images.GetSize();
2454a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                 i != e;
2455a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                 ++i)
2456a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            {
2457a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                ModuleSP image = images.GetModuleAtIndex(i);
2458a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2459a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                if (!image)
2460a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    continue;
2461a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2462a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                ClangNamespaceDecl found_namespace_decl;
2463a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2464a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                SymbolVendor *symbol_vendor = image->GetSymbolVendor();
2465a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2466a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                if (!symbol_vendor)
2467a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    continue;
2468a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2469a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                SymbolContext null_sc;
2470a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2471a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &namespace_decl);
2472a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2473a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                if (found_namespace_decl)
2474a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                {
2475a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    context.m_namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(image, found_namespace_decl));
2476a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
2477a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                    if (log)
247867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        log->Printf("  FEVD[%u] Found namespace %s in module %s",
247967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                    current_id,
2480a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                                    name.GetCString(),
2481a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                                    image->GetFileSpec().GetFilename().GetCString());
2482a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan                }
2483a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan            }
248403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
248503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    }
2486a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
248738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    TypeList types;
248838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    SymbolContext null_sc;
248938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
249038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    if (module_sp && namespace_decl)
249138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        module_sp->FindTypes(null_sc, name, &namespace_decl, true, 1, types);
249238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    else
249338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        target->GetImages().FindTypes (null_sc, name, true, 1, types);
249438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
249538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan    if (types.GetSize())
2496ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
249738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        TypeSP type_sp = types.GetTypeAtIndex(0);
249838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan
2499ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
25006df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
250167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            const char *name_string = type_sp->GetName().GetCString();
250267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
250367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  FEVD[%u] Matching type found for \"%s\": %s",
250467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
250567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        name.GetCString(),
250667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (name_string ? name_string : "<anonymous>"));
2507ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        }
25082403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
250938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan        TypeFromUser user_type(type_sp->GetClangFullType(),
251038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                               type_sp->GetClangAST());
25116df0840c87be29724055716db951aa6d494ddabcSean Callanan
2512e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan        AddOneType(context, user_type, current_id, false);
25136df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2515e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananclang::ExternalLoadResult
25179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context,
25189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  bool (*predicate)(Decl::Kind),
25199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  llvm::SmallVectorImpl<Decl*> &decls)
2520e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{
25219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
25229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2523e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
25249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const Decl *context_decl = dyn_cast<Decl>(decl_context);
25269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!context_decl)
25289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast_context = &context_decl->getASTContext();
25319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2532c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan    static unsigned int invocation_id = 0;
2533c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan    unsigned int current_id = invocation_id++;
2534c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan
25359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (log)
253616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
253716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
2538c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan            log->Printf("FindExternalLexicalDecls[%u] in '%s' (a %s) with %s predicate",
2539c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                        current_id,
254016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_named_decl->getNameAsString().c_str(),
254116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_decl->getDeclKindName(),
254216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
254316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if(context_decl)
2544c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan            log->Printf("FindExternalLexicalDecls[%u] in a %s with %s predicate",
2545c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                        current_id,
254616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        context_decl->getDeclKindName(),
254716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
254816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
2549c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan            log->Printf("FindExternalLexicalDecls[%u] in a NULL context with %s predicate",
2550c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                        current_id,
255116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                        (predicate ? "non-null" : "null"));
255216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
25539b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25549b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *original_decl = NULL;
25559b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *original_ctx = NULL;
25569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25579b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context);
25589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer)
25609b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25619b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25629b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
25639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
25649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2565e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (log)
2566e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan    {
2567e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan        log->Printf("  FELD[%u] Original decl:", current_id);
2568e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan        ASTDumper(original_decl).ToLog(log, "    ");
25699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    }
25709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
25719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
25729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    {
25739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        ExternalASTSource *external_source = original_ctx->getExternalSource();
2574336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2575c613971c0016484053b60db95d01648a3f6ea849Sean Callanan        if (external_source)
2576c613971c0016484053b60db95d01648a3f6ea849Sean Callanan            external_source->CompleteType (original_tag_decl);
2577e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2578e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25799b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
2580e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25819b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!original_decl_context)
25829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
2583e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
25859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         iter != original_decl_context->decls_end();
25869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         ++iter)
2587e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
25889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        Decl *decl = *iter;
2589e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
25909b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!predicate || predicate(decl->getKind()))
2591e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
25929b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            if (log)
25939b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            {
2594a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(decl);
2595c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl))
2596a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                    log->Printf("  FELD[%d] Adding [to %s] lexical decl %s", current_id, context_named_decl->getNameAsString().c_str(), ast_dumper.GetCString());
2597c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan                else
2598a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                    log->Printf("  FELD[%d] Adding lexical decl %s", current_id, ast_dumper.GetCString());
25999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            }
26009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl);
2602e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            decls.push_back(copied_decl);
2604e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
2605e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2606e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
26079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return ELR_AlreadyLoaded;
26089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
26099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
26119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
26129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
26139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
26149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl);
26169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
26179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
26199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
26209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
26219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
26229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
26239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl);
2624e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton}
2625e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2626336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
26278de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
26288de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
26298de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
26304a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan    VariableSP &var,
26319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
26328de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
26338de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
26348de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2636e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
26376184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2642810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2643810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
2644336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2651810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2652810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
2653336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2658b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2660810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2661810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
2662336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2665336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
2666336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2669178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2670178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
2671567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
2672567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2673178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
2674178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
2675178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
2676178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
2677567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
2678178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2681bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2683810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2684810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
2685336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2687b01000fd063629facd45044f137446fb748ee179Greg Clayton
268858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
2689336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2690f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
2691f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
2692b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
2693f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
26944b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
26954b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
26964b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
26974b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
26984b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
26994b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
27004b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
27014b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
2702f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
2703f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2704f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2705336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
2706336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
27096916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
271024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
2715336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
2717336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
2722336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
2723336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2726567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
272847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
272947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
273047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->GetScalar() = load_addr;
273147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            var_location->SetValueType(Value::eValueTypeLoadAddress);
273247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2735f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
2736b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
2737336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2738336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
2739336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
2740336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2741336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
274267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, unsigned int current_id)
2743336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
2744aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2745aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2746e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
274747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
2748f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
2749f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
2750336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2751aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
27528de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
27538de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
27548de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
27558de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
2756336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
27574b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
27584b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
27594b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
27606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
27618de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2762427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
2763fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2764fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      entity_name,
2765427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      ut,
276647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
276747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2768427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2769427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2770427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2771427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2772427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2773427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2774696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2776810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
27778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2778a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
2779a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        log->Printf("  FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
27808de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
27818f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
27828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
27838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
2784a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
278567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       ClangExpressionVariableSP &pvar_sp,
278667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       unsigned int current_id)
2787a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
2788e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
278945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2790427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
2791a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2792427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2793427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
2794427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
2795427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
2796a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
27976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
27988c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2799427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
2800427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
2801427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
2802427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
2803427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
280445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
280545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
2806a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
2807a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
2808a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        log->Printf("  FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
2809a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
2810a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
2811a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
28121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
2813819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
281467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              Symbol &symbol,
281567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              unsigned int current_id)
2816819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2817819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
2818819749647b1605f75753f625050cb240292c08b0Sean Callanan
2819819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2820819749647b1605f75753f625050cb240292c08b0Sean Callanan
2821567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2822567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2823567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
2824567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
2825567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2826567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2827819749647b1605f75753f625050cb240292c08b0Sean Callanan
2828fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
2829819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
2830819749647b1605f75753f625050cb240292c08b0Sean Callanan
2831fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
2832819749647b1605f75753f625050cb240292c08b0Sean Callanan                                context.GetASTContext());
2833819749647b1605f75753f625050cb240292c08b0Sean Callanan
2834fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2835819749647b1605f75753f625050cb240292c08b0Sean Callanan
2836819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2837819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
2838819749647b1605f75753f625050cb240292c08b0Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2839819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
2840819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
284147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
284247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2843819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
2844819749647b1605f75753f625050cb240292c08b0Sean Callanan
2845819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
2846819749647b1605f75753f625050cb240292c08b0Sean Callanan
2847819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddressRange &symbol_range = symbol.GetAddressRangeRef();
2848819749647b1605f75753f625050cb240292c08b0Sean Callanan    Address &symbol_address = symbol_range.GetBaseAddress();
2849567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
2850819749647b1605f75753f625050cb240292c08b0Sean Callanan
2851819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2852819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
2853819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2854819749647b1605f75753f625050cb240292c08b0Sean Callanan
2855fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    entity->EnableParserVars();
2856819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
2857819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
2858819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
2859819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
2860819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
2861fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //entity->m_flags                      |= ClangExpressionVariable::EVUnknownType;
2862819749647b1605f75753f625050cb240292c08b0Sean Callanan
2863819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
2864819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2865a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
2866819749647b1605f75753f625050cb240292c08b0Sean Callanan
2867a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        log->Printf("  FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
2868819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2869819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2870819749647b1605f75753f625050cb240292c08b0Sean Callanan
2871fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
2872fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
2873fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
2874fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2875567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
2876567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
2877567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
2878fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2879fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
2880fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
2881fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
2882fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
2883fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2884fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2885fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2886fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
2887fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2888fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2889fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2890fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
2891fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2892fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
2893fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
2894fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
2895fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2896fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2897fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
2898fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2899a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
2900a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
2901fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2902fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2903fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
2904fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2905fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2906fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2907fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2908fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
2909fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2910fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2911fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_parser_type = parser_type;
2912fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2913fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
2914fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
2915fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2916fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2917fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
2918fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
2919fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2920fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
2921fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
2922fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2923819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
2924427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
292567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        const RegisterInfo *reg_info,
292667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
29271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
29281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
29291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
29311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
29321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
29331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
29351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2936122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
293767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
29381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
29391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
29401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
2942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
29431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
29451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2946fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
294747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
294847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
2949427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
29501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2951427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
2952427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
2953427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2954427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
2955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2956427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2957427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
29581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
295967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    if (log && log->GetVerbose())
29601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
2961a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
2962a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        log->Printf("  FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
29631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
29641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
29651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
29669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananNamespaceDecl *
296716b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls)
29686916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
296916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (namespace_decls.empty())
297016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        return NULL;
297116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
29726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
29736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2974e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    assert (m_parser_vars.get());
2975e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
297616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second;
297716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
29789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
297916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                                                                         namespace_decl.GetNamespaceDecl());
298016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
298116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl);
298216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
298316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls);
298416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
29859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return dyn_cast<NamespaceDecl>(copied_decl);
29866916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
29876916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2988a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
2989da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
2990da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
299167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        Symbol* symbol,
299267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
29938f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
2994aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2995aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2996e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
29978f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
299858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
29990fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
300058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
30018f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
30030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
30049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
30058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
30060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
30070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
30090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
30110fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
301367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no type");
30140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30160fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
301704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
30180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
30200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
30210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
302267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no Clang type");
30230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
30240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
30250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
30270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
3028b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
3029ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
3030a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        if (copied_type)
3031a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
3032a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            fun_decl = context.AddFunDecl(copied_type);
3033a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
3034a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        else
3035a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
3036a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            // We failed to copy the type we found
3037a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            if (log)
3038a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            {
3039a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf ("  Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt",
3040a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetName().GetCString(),
3041a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                             fun_type->GetID());
3042a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            }
3043a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
30440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
30460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
30470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
30480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
30490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
30500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
30510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
30528f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
3053810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
305467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->PutCString("  AddOneFunction called with no function and no symbol");
30558f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
30568f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
30578f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3058567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr();
3059567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
3060567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target);
30618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
30628f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
30638f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
3064fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
306547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
306647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
3067427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
30688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
3069427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
3070427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
3071427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
3072427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
3073427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
3074427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
3075427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
3076427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
30778c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3078810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
30798de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
3080a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(fun_decl);
3081a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
308267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        log->Printf("  FEVD[%u] Found %s function %s, returned %s",
308367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    current_id,
308467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    (fun ? "specific" : "generic"),
308567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    decl_name.c_str(),
3086a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                    ast_dumper.GetCString());
30878de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
308993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
309093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
309193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
30923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
309367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                   unsigned int current_id,
30943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
309593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
30969b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context = context.GetASTContext();
30979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
30983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3099ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
31003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
310293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
31033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
31043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
31053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
31063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
31083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
31093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
31103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
31113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
31123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
31133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
31143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
311530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
31171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
31181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
311930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
312030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
31211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
31221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
31238de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
31241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
31251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
31261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
31271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
312830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
312930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
31303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
313193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
313293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
313393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
3134ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3135ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid *
3136ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
3137ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         ASTContext *source_context,
3138ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         void *clang_type)
3139ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{
3140aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
3141aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3142aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = true;
3143ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3144e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context);
3145e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
3146e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    QualType ret_qual_type = importer->CopyType (source_context,
3147e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                                 QualType::getFromOpaquePtr(clang_type));
3148e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
3149e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    void *ret = ret_qual_type.getAsOpaquePtr();
3150ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3151aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = false;
3152ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
3153ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    return ret;
3154ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan}
3155