ClangExpressionDeclMap.cpp revision 9b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0
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"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
39f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
40810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
4117c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
43f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
45a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.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{
63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
65aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
66aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
67427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
68427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
698c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_exe_ctx = &exe_ctx;
7245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (exe_ctx.frame)
74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything);
7578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    else if (exe_ctx.thread)
7678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
77ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham    else if (exe_ctx.process)
78ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham        m_parser_vars->m_sym_ctx = SymbolContext(exe_ctx.target->GetSP(), ModuleSP());
79427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (exe_ctx.target)
80427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_parser_vars->m_persistent_vars = &exe_ctx.target->GetPersistentVariables();
81aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
82c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
83427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
84427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
85aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
86aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
87aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
88427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
89aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
90aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
91aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
92427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
93427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp &&
94427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars.get() &&
95427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars->m_lldb_value)
96427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                delete var_sp->m_parser_vars->m_lldb_value;
97aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
98427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp->DisableParserVars();
99aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
100aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
102aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
103aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
104aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
105427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
106427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
107427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                pvar_sp->DisableParserVars();
108aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1117a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1168de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1178de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
11882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
124427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
126427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
12882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
12982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
13005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
13105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
13205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
13305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
13405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
13505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
1379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
13805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
13905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
14005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetASTContext(),
14105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetOpaqueQualType()),
14205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
143696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
1460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     exe_ctx->process->GetByteOrder(),
148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     exe_ctx->process->GetAddressByteSize()))
1490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
1500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
1510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
1520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
1530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
1540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
15505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
1560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
1570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
1580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
15905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
16005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
16105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ByteOrder byte_order = exe_ctx->process->GetByteOrder();
16305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
16405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
1650e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
16605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
16705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
16805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
16905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
17005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
1712bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen    for (size_t byte_idx = 0;
17205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
17305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
17405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
17505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
17605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
17705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
17805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
17905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        switch (byte_order)
18005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
1810e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
1820e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
1830e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
1840e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
1850e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
1860e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
1870e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
1880e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
1890e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
1900e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
1910e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
1920e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
1930e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
19405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
19505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
1966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
198696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
199696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2000e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
2010e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
20205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
20305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
204696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP
205696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name,
2069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                           VarDecl *decl,
207696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           lldb_private::TypeFromParser type)
208696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{
209696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    assert (m_parser_vars.get());
210696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
211696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
212696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
213696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
2149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
215696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
216696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
217696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
218696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
219696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
220696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
221696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_sp)
222696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return ClangExpressionVariableSP();
223696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
224696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
225696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetASTContext(),
226696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     type.GetOpaqueQualType()),
227696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                           context);
228696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
229696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    TypeFromUser var_type = var_sp->GetTypeFromUser();
230696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
231696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP var = FindVariableInScope (*exe_ctx->frame, var_sp->GetName(), &var_type);
232696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
233696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var)
234696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable
235696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
236696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_valobj = exe_ctx->frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues);
237696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
238696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_valobj)
239696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
240696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
241696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type);
242696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
243696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!var_casted_valobj)
244696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
245696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
246696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (log)
247696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    {
248696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        StreamString my_stream_string;
249696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
250696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        ClangASTType::DumpTypeDescription (var_type.GetASTContext(),
251696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           var_type.GetOpaqueQualType(),
252696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           &my_stream_string);
253696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
254696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
255696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str());
256696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    }
257696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
258696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj);
259696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
260696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (!pvar_sp)
261696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
263696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name))
264696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::ClangExpressionVariableSP();
265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
270696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return pvar_sp;
271696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan}
272696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan
2738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
2748de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
2758de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
2778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
2786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
2796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
2806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
2818de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
282a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
283aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
284aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
286fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx;
2876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
289a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
290a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
29182b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
29282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
29397678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
294a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
295fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (),
296fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     name,
297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
298fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     exe_ctx->process->GetByteOrder(),
299fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                     exe_ctx->process->GetAddressByteSize()))
3008c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
3018c12720c108cd5e7ed792596749218d8400f647eSean Callanan
302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
3038c12720c108cd5e7ed792596749218d8400f647eSean Callanan
304427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
3058c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
3068c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
3086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
3096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
3106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
3116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
3126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
3136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
3146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
3156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
3166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
3176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
3186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
3196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
3206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
3216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
3226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
3236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
3246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
325427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
3268c12720c108cd5e7ed792596749218d8400f647eSean Callanan
327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
3298c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3308c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
331a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
332a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
333a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
3348de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
3358de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
3378de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
3388de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
3398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
3408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
3418de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
3428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
343aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
344aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
345aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
346e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
34745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
348aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
3498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3508c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
3518c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
3528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
353427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
3548c12720c108cd5e7ed792596749218d8400f647eSean Callanan
355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
3578c12720c108cd5e7ed792596749218d8400f647eSean Callanan
358427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
3598c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
3608c12720c108cd5e7ed792596749218d8400f647eSean Callanan
36145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
36245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
36345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
3648de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
365427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
36645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
3678c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
3688c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
369427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
3708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
371427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
372427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
373427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
3748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
375427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
3768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
3788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
3798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
3818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
3828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
383aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
384aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
385aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
3868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
3878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
3898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
390aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
391aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
3928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
3948c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
3958c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
3968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
397427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
398427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
399427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
400427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
401427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
4028c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
4038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4048c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
405427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
4068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
407427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
408427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
4098c12720c108cd5e7ed792596749218d8400f647eSean Callanan
410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
4128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
4138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
414aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
4158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
416aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
4178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
4188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
4198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4208de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
4218de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
4238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
4248de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
4258de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
427aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
428aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
429aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
4308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
4318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
432427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
433aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
434aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
4358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
4378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
4388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
4408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
4418de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
4438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
4448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
4458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
4468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
4478de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
449aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
451aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
4528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
4538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
454427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
4558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
4568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
457427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
4588c12720c108cd5e7ed792596749218d8400f647eSean Callanan
459427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
460427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
461427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_jit_vars.get())
4628c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
464427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
465427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
466427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
467427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
4688c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
4708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
4718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
47202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
4738de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
4748de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value**& value,
4778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
4788de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
479ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
480427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan
482427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
4838c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
484ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
4868c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
487ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
488427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = &entity_sp->m_parser_vars->m_llvm_value;
489427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4918c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
492ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
493ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
494f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
4958de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
4968de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4978de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
498da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
4998de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
500f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
501aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
502aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
503aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
504aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
505f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
50678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (m_parser_vars->m_exe_ctx->target == NULL)
50778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
50878b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
509f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
510f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
511e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
51228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const bool include_symbols = true;
51328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const bool append = false;
51428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    m_parser_vars->m_sym_ctx.FindFunctionsByName(name, include_symbols, append, sc_list);
515f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
516e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
517aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
518aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
519aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
520aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
521aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        Mangled mangled(name.GetCString(), true);
522aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
523aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        ConstString demangled_name = mangled.GetDemangledName();
524aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
525aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        if (strlen(demangled_name.GetCString()))
526aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
527aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            std::string const_name_scratch(demangled_name.GetCString());
528aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
529aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            const_name_scratch.append(" const");
530aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
531aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            ConstString const_name(const_name_scratch.c_str());
532aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
533aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            m_parser_vars->m_sym_ctx.FindFunctionsByName(const_name, include_symbols, append, sc_list);
534aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
535aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
536aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan                log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString());
537aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
538aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
539aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
540aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
541f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
542f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
543f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
544e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
545f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
546da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
547f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
548f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
549da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
550f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
551da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
552f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
553f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
554f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
555ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
556ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
557ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
558da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    func_addr = func_so_addr->GetCallableLoadAddress (m_parser_vars->m_exe_ctx->target);
559da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
560f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
561f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
562f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
563cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
564cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name)
565c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
566c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
567c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
568819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
569c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
570cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
571cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
572cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
573cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++)
574cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
575cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
576cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
577c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
578cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
579ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
580ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
581ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan            return LLDB_INVALID_ADDRESS;
582ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
583cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
584cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
585cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
586cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
587cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
588cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
589cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
590cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
591cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
592cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
593cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
594cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
595cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
596cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
597cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
598cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
599cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeExtern:
600cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
601cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
602cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
603cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
604cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
605cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
606cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
607cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
608cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
609cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
610cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
611cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
612cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
613cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
614cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
615cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
616cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
617cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
618cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
619cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
620c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
621cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
622c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
623c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
624cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
625cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name)
626819749647b1605f75753f625050cb240292c08b0Sean Callanan{
627819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
628819749647b1605f75753f625050cb240292c08b0Sean Callanan
629819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (!m_parser_vars->m_exe_ctx ||
630819749647b1605f75753f625050cb240292c08b0Sean Callanan        !m_parser_vars->m_exe_ctx->target)
631819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
632819749647b1605f75753f625050cb240292c08b0Sean Callanan
633cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return GetSymbolAddress(*m_parser_vars->m_exe_ctx->target, name);
634819749647b1605f75753f625050cb240292c08b0Sean Callanan}
635819749647b1605f75753f625050cb240292c08b0Sean Callanan
636810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
637f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
638f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
6398de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
6408de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
641aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
6428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
6438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
6448de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
645f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
646aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
648aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_process = exe_ctx.process;
649aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
6500ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    bool result = DoMaterialize(false /* dematerialize */,
6510ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                exe_ctx,
6520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* top of stack frame */,
6530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                LLDB_INVALID_ADDRESS /* bottom of stack frame */,
6540ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                NULL, /* result SP */
6550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                err);
656f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
657f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
658aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
659f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
660f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
661f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
662f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
663f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
6648de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
6658de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6668de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
6673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
668aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
669047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
670047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
6718de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
6723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
673aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
674aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
675aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
6763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
6773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
6783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
6793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
6803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
681aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
6823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
6833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
6843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
6853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
6863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
687696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP object_ptr_var = FindVariableInScope (*exe_ctx.frame,
688696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
689696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
6903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
6913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
6923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
6933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
6943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
6953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
6963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
697aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
6983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
699aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
7003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
7023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
7033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
7043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
7053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
7063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
70750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
7083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
70950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
71050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
71150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
71250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
7133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
71450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
71550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
71650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
71750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
71850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
71950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
72050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
72150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
72250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
72350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
72450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
725c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            object_ptr = exe_ctx.process->ReadPointerFromMemory (value_addr, read_error);
726c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS)
72750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
72850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
72950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
730c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            }
73150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
7323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
73350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
7343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
73550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
73650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
73750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
73850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
73950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
74050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
74150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
74250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
74350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
744061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
74550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
746061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
74750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
74850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
74950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
75050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
75150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
752061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
75350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
754061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
75550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
756061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
75750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
75850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
75950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
760061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
76150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
762061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
76350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
76450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
7653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
7663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
7673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
7683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7693c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
7708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
7718de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
772aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
773427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
7740ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
7750ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
7768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
7778de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
778f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
7790ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err);
780aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
781aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
782aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
783aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
784aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
785aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
786aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
787aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
788aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
789aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
790aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
791aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
792aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
793aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
794aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
795aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
796aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
797aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
798aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
799aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
800aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
801f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
802f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
80332824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
8048de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
8058de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
806aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
8078de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
8088de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
8098de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
81032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
811aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
812aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
813aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
814aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
81532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
81632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
81732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
81832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
81932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
820aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.process)
82132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
82232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
82332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
82432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
82532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
826aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.target)
82732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
82832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
82932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
83032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
83132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
8323371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
8333371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
8343371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
8353371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
8363371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
8373371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
838c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
83932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
84032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
841c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location,
842c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetBytes(),
843c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                     data_sp->GetByteSize(), error) != data_sp->GetByteSize())
84432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
84532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
84632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
84732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
84832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
849c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton    DataExtractor extractor(data_sp, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
85032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
851427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
852427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
853427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
85432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
855427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
85632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
857427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
858427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
859427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
860427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
8618c12720c108cd5e7ed792596749218d8400f647eSean Callanan
862427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
8638c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
8648c12720c108cd5e7ed792596749218d8400f647eSean Callanan
865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
871427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
873427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
87432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
87532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
87632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
87732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
87832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
87932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
88032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
881f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
8828de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
8838de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
8848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
885aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
8860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
8870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
888427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
8898de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
8908de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
891810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
892427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
894427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
895aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
896aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
897e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
89882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
899aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
900810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
901810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
902810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
903810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
904810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
905aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.frame)
90645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
90745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
90845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        return LLDB_INVALID_ADDRESS;
90945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
91045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
911427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables();
912aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
913aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
914e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
915e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
916e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
917e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
9189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        m_material_vars->m_allocated_area = NULL;
919e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
920e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
921e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
922e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
923aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
924810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
925f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
926f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
927aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
928f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
929aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
930aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
931f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
932810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
9337a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
9347a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
9357a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
936aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
937aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
938aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
939f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
940f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
941f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
942f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
943aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
944f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
945810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
946aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
947810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
948aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
949aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
950810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
951427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
9528c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
9538c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
954810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
9564d0b110715d321d366dec1dc690300f713b63236Sean Callanan
957a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
958336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
959a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
960427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
9611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
9621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
9631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
964aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
9651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
9661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
9671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
9681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
969427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
970427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
971427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
972427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
973427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
974427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
9751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
9761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
9771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
9781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
9801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
9811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
982427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
983427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
9846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
9856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
986427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
987427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
9881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
9891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
9908c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
991a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
9928c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
993a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
994a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
995a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
99645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
9976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
998a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
999a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
1000a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
1001a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
10026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1003a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
1004a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
10056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1006a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
1007a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
1008a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
10096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
1010a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
10110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
10120ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_top,
10130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                                                         stack_frame_bottom,
1014a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
1015a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
1016f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
1017a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
1018a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
1019a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
10208c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
1021a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
10228c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
1023810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
1024810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1025f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1026f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
1027f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1028a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
10298de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
10308de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
10318de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
10328de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1033427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
10348de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
10350ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_top,
10360ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan    lldb::addr_t stack_frame_bottom,
10378de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
10388de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1039aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
10406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
10416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1043a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1045a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1046a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1047a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1048427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1049a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1050427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1051427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
1052a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
1053a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1054a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1055a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
10566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
10576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1058a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1059a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
10606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
10616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
10626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
10646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
10656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
10666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
10676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
1069c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            mem = exe_ctx.process->ReadPointerFromMemory (addr, read_error);
10706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
10726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
10746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
10756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
10786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
10796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
10816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
10826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
108347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
108447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
108547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
108647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
108747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
108847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
108947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
10906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
10936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
10956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
10966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1098b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
10996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
11006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
11016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
11026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
11036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
110497678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
110597678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
11066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
11076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
11086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
11106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
11116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
11130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
11146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
11156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
11166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
11186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
11196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
11206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11210ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                if (stack_frame_top != LLDB_INVALID_ADDRESS &&
11220ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    stack_frame_bottom != LLDB_INVALID_ADDRESS &&
11230ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem >= stack_frame_bottom &&
11240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    mem <= stack_frame_top)
11250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                {
11260ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // If the variable is resident in the stack frame created by the expression,
11270ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // then it cannot be relied upon to stay around.  We treat it as needing
11280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    // reallocation.
11290ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
11300ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
11310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
11320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                    var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference;
11330ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan                }
11340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan
11356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
11366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
11376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
11396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
11406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
11416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
11426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
11446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
11456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
11466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
11486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
11506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
11516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
11526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
11536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
11546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
11556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
11566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
11576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1158a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
11596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1160a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1161a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1162a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1163a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1164a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
11656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
11666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
11676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
11696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
11706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
11716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
11736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            mem = exe_ctx.process->AllocateMemory(pvar_byte_size,
11756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
11766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  allocate_error);
11776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
11796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
11806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
11816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
11826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
11836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
11856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
11866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
11886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
118947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
119047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
119147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
119247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
119347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
119447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
119547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
11966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
11986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
12006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
12016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
12036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
12056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
12066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
12076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
12086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
12096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
12106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
12126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
12136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
12146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
12156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
1216c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            if (!exe_ctx.process->WriteScalarToMemory (addr,
1217c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       var_sp->m_live_sp->GetValue().GetScalar(),
1218c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       exe_ctx.process->GetAddressByteSize(),
1219c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                       write_error))
12206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
12216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
12226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
12236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
12246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
1226c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong());
12276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1228696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1229a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
12306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1231a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1232a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1233a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1234a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1235a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1236a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1237a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1238f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12398de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
12408de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12418de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
12428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
12438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
12446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
12458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
12468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12478de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1248f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1249e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1250f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
125117c6a05cb96f7110332342326a90692d9505982eSean Callanan    if (!exe_ctx.frame || !exe_ctx.process)
1252cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
1253cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
12546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
12556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
12576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
12586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1259696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP var = FindVariableInScope (*exe_ctx.frame, name, &type);
1260819749647b1605f75753f625050cb240292c08b0Sean Callanan    Symbol *sym = FindGlobalDataSymbol(*exe_ctx.target, name);
1261f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1262819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
1263819749647b1605f75753f625050cb240292c08b0Sean Callanan
1264819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1265819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1266819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(GetVariableValue(exe_ctx,
1267819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              var,
1268819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1269819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1270819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
1271ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    {
1272819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(new Value);
1273819749647b1605f75753f625050cb240292c08b0Sean Callanan
1274cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        addr_t location_load_addr = GetSymbolAddress(*exe_ctx.target, name);
1275819749647b1605f75753f625050cb240292c08b0Sean Callanan
1276cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (location_load_addr == LLDB_INVALID_ADDRESS)
1277819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1278819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1279c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s",
1280c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
1281819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1282819749647b1605f75753f625050cb240292c08b0Sean Callanan
1283819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1284819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1285819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1286819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1287f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1288c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type",
1289c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                      name.GetCString());
1290f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1291f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1292f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1293841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
1294fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1295fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        StreamString my_stream_string;
1296fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1297fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangASTType::DumpTypeDescription (type.GetASTContext(),
1298fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           type.GetOpaqueQualType(),
1299fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                                           &my_stream_string);
1300fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1301c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton        log->Printf ("%s %s with type %s",
1302c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     dematerialize ? "Dematerializing" : "Materializing",
1303c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     name.GetCString(),
1304c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                     my_stream_string.GetString().c_str());
1305fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1306f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1307f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1308f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
13098de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1310f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1311f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
131217c6a05cb96f7110332342326a90692d9505982eSean Callanan
131317c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1314f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
13156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
13166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
131717c6a05cb96f7110332342326a90692d9505982eSean Callanan
131817c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
131917c6a05cb96f7110332342326a90692d9505982eSean Callanan
132017c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1321f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
132217c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1323f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
132417c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
132517c6a05cb96f7110332342326a90692d9505982eSean Callanan
132617c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
132717c6a05cb96f7110332342326a90692d9505982eSean Callanan
1328c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton            err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s",
1329c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          name.GetCString(),
1330c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                          ss.GetString().c_str());
133117c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1332f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
133317c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
133417c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1335f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
13366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
133717c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1338c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error write_error;
13396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1340c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (!exe_ctx.process->WriteScalarToMemory (addr,
1341c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           location_value->GetScalar(),
1342c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           exe_ctx.process->GetAddressByteSize(),
1343c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
13446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1345c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1346c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1347c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
13486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
13496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
135017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1351f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
135217c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
135317c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1354f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
13556916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
135617c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
135717c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
135817c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
135917c6a05cb96f7110332342326a90692d9505982eSean Callanan
1360c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s",
1361c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1362c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              ss.GetString().c_str());
136317c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
136417c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
136517c6a05cb96f7110332342326a90692d9505982eSean Callanan
1366061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
136717c6a05cb96f7110332342326a90692d9505982eSean Callanan
1368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
136917c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1370c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't get the register information for %s",
1371c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString());
137217c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
137317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
137417c6a05cb96f7110332342326a90692d9505982eSean Callanan
1375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1376061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1377061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1379061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
138017c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1381c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s",
1382c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              name.GetCString(),
1383c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                              reg_info->name);
138417c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
138517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
138617c6a05cb96f7110332342326a90692d9505982eSean Callanan
1387061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
138817c6a05cb96f7110332342326a90692d9505982eSean Callanan
138917c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
139017c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
13916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
13926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
13936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
13946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
13956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
13966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
13976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
13986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1399b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
14006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
14026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1405c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar &reg_addr = expr_var->m_live_sp->GetValue().GetScalar();
140617c6a05cb96f7110332342326a90692d9505982eSean Callanan
1407c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info,
1408c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_addr.ULongLong(),
1409c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            value_byte_size,
1410c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                            reg_value);
1411061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
141217c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
1413061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1414061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
141517c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1416c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to register %s",
1417c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1418c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
141917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
142017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
14216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
14236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1424c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Error deallocate_error = exe_ctx.process->DeallocateMemory(reg_addr.ULongLong());
14256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
14276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1428c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s",
1429c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1430c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  deallocate_error.AsCString());
14316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
143517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
143617c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
143717c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
14386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
14396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
14406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
14426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1443c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                Scalar reg_addr (exe_ctx.process->AllocateMemory (value_byte_size,
1444c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1445c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                  allocate_error));
14466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1447c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS)
14486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1449c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s",
1450c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1451c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  allocate_error.AsCString());
14526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
14566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
145747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
145847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
145947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
146047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
1461c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                                      reg_addr.ULongLong(),
146247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
146347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
14646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
14666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error write_error;
1468c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton
1469c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                if (!exe_ctx.process->WriteScalarToMemory (addr,
1470c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr,
1471c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           exe_ctx.process->GetAddressByteSize(),
1472c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           write_error))
14736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
1474c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s",
1475c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1476c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  write_error.AsCString());
14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
148117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1482c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("%s is too big to store in %s",
1483c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1484c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
148517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
148617c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
1487061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1488061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                RegisterValue reg_value;
1489061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1490061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
149117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1492c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from %s",
1493c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  name.GetCString(),
1494c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                  reg_info->name);
149517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
149617c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
149717c6a05cb96f7110332342326a90692d9505982eSean Callanan
1498c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                err = reg_ctx->WriteRegisterValueToMemory (reg_info,
1499c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_addr.ULongLong(),
1500c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           value_byte_size,
1501c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton                                                           reg_value);
1502061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
150317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
150417c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1505f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1506f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1507f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1508f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1509810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
1510810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
15111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
15121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
15131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
15141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
15151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
15161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
1517b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
15181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
15191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
15201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
15211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
15221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
1523061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
15241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
15251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
1526061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1527061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
15281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1529bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
15301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
15311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
15321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1533061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
15341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1535061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
15361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
15371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
15381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
15391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
15401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
15411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1542061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
15431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1544061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
15451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
15461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
15471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1548061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1549061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
15501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1551061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString());
15521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
15531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
15541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
15551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
15571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
15581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1559696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
15608de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
15618de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
15628de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
15638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
15648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
15658de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1566aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1567e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1568cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1569cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    VariableList *var_list = frame.GetVariableList(true);
1570cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1571bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (!var_list)
1572696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::VariableSP();
1573bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
15743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    lldb::VariableSP var_sp (var_list->FindVariable(name));
15753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
15763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const bool append = true;
15773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const uint32_t max_matches = 1;
15783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (!var_sp)
1579cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
15803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        // Look for globals elsewhere in the module for the frame
1581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
15823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (module_sp)
15833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
15843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            VariableList module_globals;
15853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
15863bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                var_sp = module_globals.GetVariableAtIndex (0);
15873bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
1588cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
15893bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
15903bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (!var_sp)
1591cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
15923bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        // Look for globals elsewhere in the program (all images)
1593aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
15943bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (target_sp)
15953bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
15963bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            VariableList program_globals;
15973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
15983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                var_sp = program_globals.GetVariableAtIndex (0);
15993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
1600cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
1601ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
1602ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!var_sp ||
1603ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->IsInScope(&frame) ||
1604ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        !var_sp->LocationIsValidForFrame (&frame))
1605ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return lldb::VariableSP();
16063bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
16073bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
16083bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
16093bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
16103bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
161104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
1612696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                return lldb::VariableSP();
16133bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
16143bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
16153bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
16163bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
16173bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
1618696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan            return lldb::VariableSP();
16193bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
16203bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
16213bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1622696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return var_sp;
1623cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
1624336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1625819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
1626819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
1627819749647b1605f75753f625050cb240292c08b0Sean Callanan(
1628819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
1629819749647b1605f75753f625050cb240292c08b0Sean Callanan    const ConstString &name
1630819749647b1605f75753f625050cb240292c08b0Sean Callanan)
1631819749647b1605f75753f625050cb240292c08b0Sean Callanan{
1632819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
1633819749647b1605f75753f625050cb240292c08b0Sean Callanan
1634819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name,
1635819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                   eSymbolTypeData,
1636819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                   sc_list);
1637819749647b1605f75753f625050cb240292c08b0Sean Callanan
1638819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
1639819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1640819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
1641819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
1642819749647b1605f75753f625050cb240292c08b0Sean Callanan
1643819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
1644819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1645819749647b1605f75753f625050cb240292c08b0Sean Callanan
1646819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
1647819749647b1605f75753f625050cb240292c08b0Sean Callanan}
1648819749647b1605f75753f625050cb240292c08b0Sean Callanan
164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1651e5748d889fb7fb97b3ff07444894d7714776b609Greg ClaytonClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1653aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1654aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1655aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1656e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
16573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1658810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
16598de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("Hunting for a definition for '%s'", name.GetCString());
166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Back out in all cases where we're not fully initialized
1662aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_exe_ctx->frame == NULL)
166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
1664ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1665aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_ignore_lookups)
1666ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
1667ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
1668ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
1669ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
1670ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
1671e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
1672e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    do
1673e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
1674e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (isa<TranslationUnitDecl>(context.m_decl_context))
1675e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            break;
1676e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
16779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!isa<NamespaceDecl>(context.m_decl_context))
16789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            return;
1679e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
1680e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        const Decl *context_decl = dyn_cast<Decl>(context.m_decl_context);
1681e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
16829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (log)
16839b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            log->Printf("Searching for '%s' in a '%s'", name.GetCString(), context_decl->getDeclKindName());
16849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
16859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        Decl *original_decl = NULL;
16869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        ASTContext *original_ctx = NULL;
16879b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
16889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!m_parser_vars->GetASTImporter(context.GetASTContext())->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
16899b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            break;
16909b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
16919b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
1692e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
16939b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            ExternalASTSource *external_source = original_ctx->getExternalSource();
1694e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
16959b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            if (!external_source)
1696e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                break;
16979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
16989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            if (!original_tag_decl)
1699e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                break;
1700e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
17019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            external_source->CompleteType (original_tag_decl);
17029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        }
17039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
17049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
17059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
17069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!original_decl_context)
17079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            break;
1708e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
17099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
17109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan             iter != original_decl_context->decls_end();
17119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan             ++iter)
17129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        {
17139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            NamedDecl *named_decl = dyn_cast<NamedDecl>(*iter);
1714e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
17159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            if (named_decl && named_decl->getName().equals(name.GetCString()))
1716e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            {
17179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(original_ctx, named_decl);
17189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                NamedDecl *copied_named_decl = dyn_cast<NamedDecl>(copied_decl);
17199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
17209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                if (!copied_named_decl)
17219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                    continue;
1722e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
17239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                context.AddNamedDecl (copied_named_decl);
1724e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            }
1725e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
17269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
17279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return;
1728e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
1729e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    while (0);
17303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1731e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17333bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
17343bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
17353bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
17363bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
17373bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
17388de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
17398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
17403bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr[0] != '$')
17410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
1742696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        VariableSP var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
17438de27c761a22187ef63fb60000894be163e7285fGreg Clayton
17448de27c761a22187ef63fb60000894be163e7285fGreg Clayton        // If we found a variable in scope, no need to pull up function names
17458de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (var != NULL)
174692aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
17478de27c761a22187ef63fb60000894be163e7285fGreg Clayton            AddOneVariable(context, var);
174892aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
17498de27c761a22187ef63fb60000894be163e7285fGreg Clayton        else
175092aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
175128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            const bool include_symbols = true;
175228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            const bool append = false;
175328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            m_parser_vars->m_sym_ctx.FindFunctionsByName (name,
175428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                                                          include_symbols,
175528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                                                          append,
175628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                                                          sc_list);
17578de27c761a22187ef63fb60000894be163e7285fGreg Clayton
1758819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (sc_list.GetSize())
17598de27c761a22187ef63fb60000894be163e7285fGreg Clayton            {
1760819749647b1605f75753f625050cb240292c08b0Sean Callanan                bool found_specific = false;
1761819749647b1605f75753f625050cb240292c08b0Sean Callanan                Symbol *generic_symbol = NULL;
1762819749647b1605f75753f625050cb240292c08b0Sean Callanan                Symbol *non_extern_symbol = NULL;
1763819749647b1605f75753f625050cb240292c08b0Sean Callanan
1764819749647b1605f75753f625050cb240292c08b0Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
1765819749647b1605f75753f625050cb240292c08b0Sean Callanan                     index < num_indices;
1766819749647b1605f75753f625050cb240292c08b0Sean Callanan                     ++index)
17678de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
1768819749647b1605f75753f625050cb240292c08b0Sean Callanan                    SymbolContext sym_ctx;
1769819749647b1605f75753f625050cb240292c08b0Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
1770819749647b1605f75753f625050cb240292c08b0Sean Callanan
1771819749647b1605f75753f625050cb240292c08b0Sean Callanan                    if (sym_ctx.function)
1772819749647b1605f75753f625050cb240292c08b0Sean Callanan                    {
1773819749647b1605f75753f625050cb240292c08b0Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
1774819749647b1605f75753f625050cb240292c08b0Sean Callanan                        // overloaded
1775819749647b1605f75753f625050cb240292c08b0Sean Callanan                        if (!found_specific)
1776819749647b1605f75753f625050cb240292c08b0Sean Callanan                            AddOneFunction(context, sym_ctx.function, NULL);
1777819749647b1605f75753f625050cb240292c08b0Sean Callanan                        found_specific = true;
1778819749647b1605f75753f625050cb240292c08b0Sean Callanan                    }
1779819749647b1605f75753f625050cb240292c08b0Sean Callanan                    else if (sym_ctx.symbol)
1780819749647b1605f75753f625050cb240292c08b0Sean Callanan                    {
1781819749647b1605f75753f625050cb240292c08b0Sean Callanan                        if (sym_ctx.symbol->IsExternal())
1782819749647b1605f75753f625050cb240292c08b0Sean Callanan                            generic_symbol = sym_ctx.symbol;
1783819749647b1605f75753f625050cb240292c08b0Sean Callanan                        else
1784819749647b1605f75753f625050cb240292c08b0Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
1785819749647b1605f75753f625050cb240292c08b0Sean Callanan                    }
17868de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
1787819749647b1605f75753f625050cb240292c08b0Sean Callanan
1788819749647b1605f75753f625050cb240292c08b0Sean Callanan                if (!found_specific)
17898de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
1790819749647b1605f75753f625050cb240292c08b0Sean Callanan                    if (generic_symbol)
1791819749647b1605f75753f625050cb240292c08b0Sean Callanan                        AddOneFunction (context, NULL, generic_symbol);
1792819749647b1605f75753f625050cb240292c08b0Sean Callanan                    else if (non_extern_symbol)
1793819749647b1605f75753f625050cb240292c08b0Sean Callanan                        AddOneFunction (context, NULL, non_extern_symbol);
1794819749647b1605f75753f625050cb240292c08b0Sean Callanan                }
17958de27c761a22187ef63fb60000894be163e7285fGreg Clayton            }
1796819749647b1605f75753f625050cb240292c08b0Sean Callanan            else
17976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            {
1798819749647b1605f75753f625050cb240292c08b0Sean Callanan                // We couldn't find a variable or function for this.  Now we'll hunt for a generic
1799819749647b1605f75753f625050cb240292c08b0Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
1800819749647b1605f75753f625050cb240292c08b0Sean Callanan
1801819749647b1605f75753f625050cb240292c08b0Sean Callanan                Symbol *data_symbol = FindGlobalDataSymbol(*m_parser_vars->m_exe_ctx->target, name);
1802819749647b1605f75753f625050cb240292c08b0Sean Callanan
1803819749647b1605f75753f625050cb240292c08b0Sean Callanan                if (data_symbol)
1804819749647b1605f75753f625050cb240292c08b0Sean Callanan                    AddOneGenericVariable(context, *data_symbol);
18056916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            }
180692aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
1807e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
1808e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
1809e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
1810e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (namespace_decl)
1811e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
1812e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            if (log)
1813e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            {
1814e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                std::string s;
1815e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                llvm::raw_string_ostream os(s);
1816e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                namespace_decl.GetNamespaceDecl()->print(os);
1817e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                os.flush();
1818e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
1819e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                log->Printf("Added namespace decl:");
1820e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                log->Printf("%s", s.c_str());
1821e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            }
1822e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
18239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
1824e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            if (clang_namespace_decl)
1825e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                clang_namespace_decl->setHasExternalLexicalStorage();
1826e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
18270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
18288de27c761a22187ef63fb60000894be163e7285fGreg Clayton    else
18293cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
183057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
183157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
183257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
183357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
183457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
1835aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
183657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
183757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
183857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
183957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
184057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
184157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
184275a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!this_var ||
184375a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton                !this_var->IsInScope(m_parser_vars->m_exe_ctx->frame) ||
184475a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton                !this_var->LocationIsValidForFrame (m_parser_vars->m_exe_ctx->frame))
184557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
184657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
184757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
184857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
184957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
185057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
185157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
18522403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            if (log)
18532403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
18542403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString ("Type for \"this\" is: ");
18552403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
18562403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
18572403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
18582403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
18592403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
186004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser this_user_type(this_type->GetClangFullType(),
186157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
186257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
1863aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
186457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
186558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
186657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
186757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
186857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
186957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
187057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
187157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            TypeFromUser class_user_type(pointer_target_type,
187257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
187357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
18743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
18753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
18763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
18773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
18783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
18793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
18803aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
18813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
188257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            AddOneType(context, class_user_type, true);
188357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
188457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
188557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
188657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
18873aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
18883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
18893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
18903aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
18913aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18923aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
18933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
18953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
18963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
18983aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
189975a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton            if (!self_var ||
190075a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton                !self_var->IsInScope(m_parser_vars->m_exe_ctx->frame) ||
190175a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton                !self_var->LocationIsValidForFrame (m_parser_vars->m_exe_ctx->frame))
19023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
19033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
19043aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
19053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
19063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
19073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
19083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
190904c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser self_user_type(self_type->GetClangFullType(),
19103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
19113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
19123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
19133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
191458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan            void *pointer_target_type = NULL;
19153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
19163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
191727a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham                                                &pointer_target_type)
191819c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton                || pointer_target_type == NULL)
19193aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
19203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
19213aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
19223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
19233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
19243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
19253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
19263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
19273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
19283aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
19293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
19303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
19313aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
19323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            AddOneType(context, class_user_type, false);
19333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
19343aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
19353aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
1936427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1937427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
19383cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan
1939427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
19401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            AddOneVariable(context, pvar_sp);
19421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
19431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
19461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1947aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
19481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1949b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
19501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
19521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                AddOneRegister(context, reg_info);
19531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
19548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
1955a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1956aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
19576df0840c87be29724055716db951aa6d494ddabcSean Callanan
1958ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    if (type_sp)
1959ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
1960ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
19616df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
1962ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1963ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            StreamString strm;
1964ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            type_sp->Dump(&strm, true);
1965ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->PutCString (strm.GetData());
1966ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        }
19672403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
196804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        TypeFromUser user_type (type_sp->GetClangFullType(),
1969b01000fd063629facd45044f137446fb748ee179Greg Clayton                                type_sp->GetClangAST());
19706df0840c87be29724055716db951aa6d494ddabcSean Callanan
1971ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        AddOneType(context, user_type, false);
19726df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1974e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
19759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananclang::ExternalLoadResult
19769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context,
19779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  bool (*predicate)(Decl::Kind),
19789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                                                  llvm::SmallVectorImpl<Decl*> &decls)
1979e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{
19809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
19819b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
1982e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
19839b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
19849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const Decl *context_decl = dyn_cast<Decl>(decl_context);
19859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
19869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!context_decl)
19879b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
19889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
19899b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast_context = &context_decl->getASTContext();
19909b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
19919b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (log)
19929b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        log->Printf("Finding lexical decls in a '%s' with %s predicate", context_decl->getDeclKindName(), (predicate ? "non-null" : "null"));
19939b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
19949b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *original_decl = NULL;
19959b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *original_ctx = NULL;
19969b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
19979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context);
19989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
19999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer)
20009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
20019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx))
20039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
20049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
2005e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (log)
2006e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
20079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        std::string decl_print_string;
20089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        llvm::raw_string_ostream decl_print_stream(decl_print_string);
20099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        original_decl->print(decl_print_stream);
20109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        decl_print_stream.flush();
20119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        log->Printf("Original decl:\n%s", decl_print_string.c_str());
20129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    }
20139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl))
20159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    {
20169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        ExternalASTSource *external_source = original_ctx->getExternalSource();
2017336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
20189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!external_source)
20199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            return ELR_Failure;
20209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!original_tag_decl)
20229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            return ELR_Failure;
20239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        external_source->CompleteType (original_tag_decl);
2025e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2026e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
20279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl);
2028e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
20299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    if (!original_decl_context)
20309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        return ELR_Failure;
2031e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
20329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    for (TagDecl::decl_iterator iter = original_decl_context->decls_begin();
20339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         iter != original_decl_context->decls_end();
20349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan         ++iter)
2035e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
20369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        Decl *decl = *iter;
2037e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
20389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        if (!predicate || predicate(decl->getKind()))
2039e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        {
20409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            if (log)
20419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            {
20429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                std::string decl_print_string;
20439b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                llvm::raw_string_ostream decl_print_stream(decl_print_string);
20449b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                decl->print(decl_print_stream);
20459b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                decl_print_stream.flush();
20469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan                log->Printf("  Adding lexical decl %s", decl_print_string.c_str());
20479b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            }
20489b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20499b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl);
2050e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
20519b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan            decls.push_back(copied_decl);
2052e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        }
2053e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2054e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
20559b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return ELR_AlreadyLoaded;
20569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
20579b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
20599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl)
20609b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
20619b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
20629b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl);
20649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan}
20659b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid
20679b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl)
20689b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{
20699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    assert (m_parser_vars.get());
20709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan
20719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl);
2072e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton}
2073e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2074336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
20758de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
20768de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
20778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
2078696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP var,
20799b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context,
20808de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
20818de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
20828de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2084e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
20856184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2090810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2091810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
2092336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2099810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2100810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
2101336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2106b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2108810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2109810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
2110336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2113336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
2114336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2117178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
2118178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
2119178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
2120178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
2121178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
2122178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
2123eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
2124178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2127bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2129810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
2130810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
2131336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
2133b01000fd063629facd45044f137446fb748ee179Greg Clayton
213458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    void *type_to_use = NULL;
2135336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2136f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
2137f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
2138b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
2139f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
21404b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
21414b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
21424b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
21434b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
21444b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
21454b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
21464b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
21474b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
2148f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
2149f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
2150f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
2151336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
2152336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
21556916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
2161336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
2163336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
2168336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
2169336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2172aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->GetScalar() = load_addr;
217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->SetValueType(Value::eValueTypeLoadAddress);
217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2178f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
2179b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
2180336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2181336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
2182336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
2183336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2184336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
2185696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var)
2186336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
2187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2188aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2189e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2190336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2191f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
2192f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
2193336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
2194aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
21958de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
21968de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
21978de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
21988de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
2199336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
22004b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
22014b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
22024b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
22036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
22048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
2206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      entity_name,
2208427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      ut,
2209427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2210427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2211427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2212427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2213427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2214427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2215427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2216427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2217696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2219810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
22208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2221a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2222a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2223a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2224a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2225a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2226a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
22276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan
22289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //if (log->GetVerbose())
22299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //{
22309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    StreamString var_decl_dump_string;
22319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
22329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    log->Printf("%s\n", var_decl_dump_string.GetData());
22339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //}
22348de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
22358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
22368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
22378f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
2238a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
2239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                       ClangExpressionVariableSP &pvar_sp)
2240a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
2241e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
224245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2243427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
2244a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
2247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
2248427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
2249a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
22506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
22518c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2252427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
2253427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
2254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
2255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
2256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
225745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
225845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
2259a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
2260a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2261a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2262a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2263a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2264a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2265427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
2266a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
2267a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
2268a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
22691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
2270819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
2271819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              Symbol &symbol)
2272819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2273819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
2274819749647b1605f75753f625050cb240292c08b0Sean Callanan
2275819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2276819749647b1605f75753f625050cb240292c08b0Sean Callanan
22779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *scratch_ast_context = m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext();
2278819749647b1605f75753f625050cb240292c08b0Sean Callanan
2279fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)),
2280819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
2281819749647b1605f75753f625050cb240292c08b0Sean Callanan
2282fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)),
2283819749647b1605f75753f625050cb240292c08b0Sean Callanan                                context.GetASTContext());
2284819749647b1605f75753f625050cb240292c08b0Sean Callanan
2285fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
2286819749647b1605f75753f625050cb240292c08b0Sean Callanan
2287819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2288819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
2289819749647b1605f75753f625050cb240292c08b0Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2290819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
2291819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
2292819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2293819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2294819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
2295819749647b1605f75753f625050cb240292c08b0Sean Callanan
2296819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
2297819749647b1605f75753f625050cb240292c08b0Sean Callanan
2298819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddressRange &symbol_range = symbol.GetAddressRangeRef();
2299819749647b1605f75753f625050cb240292c08b0Sean Callanan    Address &symbol_address = symbol_range.GetBaseAddress();
2300819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(m_parser_vars->m_exe_ctx->target);
2301819749647b1605f75753f625050cb240292c08b0Sean Callanan
2302819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2303819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
2304819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2305819749647b1605f75753f625050cb240292c08b0Sean Callanan
2306fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    entity->EnableParserVars();
2307819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
2308819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
2309819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
2310819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
2311819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
2312fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    //entity->m_flags                      |= ClangExpressionVariable::EVUnknownType;
2313819749647b1605f75753f625050cb240292c08b0Sean Callanan
2314819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
2315819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2316819749647b1605f75753f625050cb240292c08b0Sean Callanan        std::string var_decl_print_string;
2317819749647b1605f75753f625050cb240292c08b0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2318819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl->print(var_decl_print_stream);
2319819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl_print_stream.flush();
2320819749647b1605f75753f625050cb240292c08b0Sean Callanan
2321819749647b1605f75753f625050cb240292c08b0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
2322819749647b1605f75753f625050cb240292c08b0Sean Callanan
23239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //if (log->GetVerbose())
23249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //{
23259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    StreamString var_decl_dump_string;
23269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
23279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //    log->Printf("%s\n", var_decl_dump_string.GetData());
23289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan        //}
2329819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2330819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2331819749647b1605f75753f625050cb240292c08b0Sean Callanan
2332fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
2333fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
2334fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
2335fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2336fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
23379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *scratch_ast_context = m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext();
2338fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2339fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
2340fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
2341fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
2342fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
2343fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
2344fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2345fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
2346fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
2347fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl;
2348fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
2349fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2350fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
2351fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2352fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
2353fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
2354fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
2355fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2356fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2357fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
2358fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
2359fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                std::string var_decl_print_string;
2360fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2361fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                var_decl->print(var_decl_print_stream);
2362fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                var_decl_print_stream.flush();
2363fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2364fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str());
2365fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
2366fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2367fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
2368fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
2369fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2370fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
2371fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2372fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
2373fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2374fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2375fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_parser_vars->m_parser_type = parser_type;
2376fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2377fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangAST(user_type.GetASTContext());
2378fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->SetClangType(user_type.GetOpaqueQualType());
2379fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2380fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
2381fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
2382fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
2383fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2384fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
2385fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
2386fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
2387819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
2388427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
2389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        const RegisterInfo *reg_info)
23901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
23911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
23921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
23931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
23941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
23951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
23961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
23971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
23981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
23991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
24001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
24011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
24021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2403427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
2404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
24051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
24061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
24071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2408fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
2409fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
24121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
2414427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
2415427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2416427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
2417427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2418427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2419427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
24201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
24211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (log)
24221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
24231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        std::string var_decl_print_string;
24241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
24251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl->print(var_decl_print_stream);
24261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl_print_stream.flush();
24271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
24281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
24291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
24301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
24311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
24329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananNamespaceDecl *
24336916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
24346916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
24356916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
24366916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2437e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    assert (m_parser_vars.get());
2438e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
24399b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(),
2440e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                                                                                namespace_decl.GetNamespaceDecl());
24416916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
24429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    return dyn_cast<NamespaceDecl>(copied_decl);
24436916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
24446916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2445a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
2446da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
2447da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Function* fun,
2448da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton                                        Symbol* symbol)
24498f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
2450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2451aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2452e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
24538f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
245458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    NamedDecl *fun_decl = NULL;
24550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
245658baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
24578f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
24580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
24590fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
24609b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *fun_ast_context = NULL;
24618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
24620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
24630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
24640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
24650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
24660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
24670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
24680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
24690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no type");
24700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
24710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
24720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
247304c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
24740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
24750fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
24760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
24770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
24780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no Clang type");
24790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
24800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
24810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
24820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
24830fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
2484b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
2485ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
24860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
24870fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
24880fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
24890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
24900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
24910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
24920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
24930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
24940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
24950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
24968f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
2497810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
24980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            log->PutCString("AddOneFunction called with no function and no symbol");
24998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
25008f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
25018f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
2502da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(m_parser_vars->m_exe_ctx->target);
25038f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
25048f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
25058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
2506fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2507fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2508427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2509427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
25108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2511427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
2512427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
2513427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
2514427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2515427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2516427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
2517427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2518427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
25198c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2520810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
25218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2522a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string fun_decl_print_string;
2523a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
2524a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl->print(fun_decl_print_stream);
2525a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl_print_stream.flush();
2526a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2527a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
25288de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
253093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
253193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
253293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
25333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
25343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
253593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
25369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *parser_ast_context = context.GetASTContext();
25379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *user_ast_context = ut.GetASTContext();
25383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
2539ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
25403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
25413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
254293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
25433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
25443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
25453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
25463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
25473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
25483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
25493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
25503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
25513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
25523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
25533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
25543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
255530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
25561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
25571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
25581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
255930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
256030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
25611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
25621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
25638de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
25641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
25651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
25661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
25671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
256830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
256930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
25703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
257193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
257293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
257393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
2574ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2575ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid *
2576ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
2577ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         ASTContext *source_context,
2578ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         void *clang_type)
2579ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{
2580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2582aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = true;
2583ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2584e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context);
2585e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2586e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    QualType ret_qual_type = importer->CopyType (source_context,
2587e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                                 QualType::getFromOpaquePtr(clang_type));
2588e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2589e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    void *ret = ret_qual_type.getAsOpaquePtr();
2590ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2591aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = false;
2592ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2593ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    return ret;
2594ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan}
2595