ClangExpressionDeclMap.cpp revision 061b79dbf1fefaf157d414747e98a463a0f32eda
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;
137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    clang::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
17105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    for (off_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,
206696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                           clang::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;
214696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    clang::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(
2768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::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
288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    clang::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(
3368de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::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(
4428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::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(
4758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::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,
4988de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
4998de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
500f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
501aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
502aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
503f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
50478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (m_parser_vars->m_exe_ctx->target == NULL)
50578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
50678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
507f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
508f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
509e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
51028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const bool include_symbols = true;
51128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const bool append = false;
51228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    m_parser_vars->m_sym_ctx.FindFunctionsByName(name, include_symbols, append, sc_list);
513f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
514e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
515f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
516f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
517f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
518e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
519f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
520f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    const Address *fun_address;
521f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
522f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
523f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
524f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
525f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
526f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
527f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
528f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
529aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
530f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
531f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
532f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
533f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
534c7674af9458fbad6f07fa73609c354abf93af2dcSean Callananbool
535c7674af9458fbad6f07fa73609c354abf93af2dcSean CallananClangExpressionDeclMap::GetSymbolAddress
536c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan(
537819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
538c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    const ConstString &name,
539c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    uint64_t &ptr
540c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan)
541c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
542c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
543c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
544819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
545c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
546c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    if (!sc_list.GetSize())
547c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan        return false;
548c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
549c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContext sym_ctx;
550c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    sc_list.GetContextAtIndex(0, sym_ctx);
551c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
552c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
553c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
554819749647b1605f75753f625050cb240292c08b0Sean Callanan    ptr = sym_address->GetLoadAddress(&target);
555c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
556c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    return true;
557c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
558c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
559819749647b1605f75753f625050cb240292c08b0Sean Callananbool
560819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::GetSymbolAddress
561819749647b1605f75753f625050cb240292c08b0Sean Callanan(
562819749647b1605f75753f625050cb240292c08b0Sean Callanan    const ConstString &name,
563819749647b1605f75753f625050cb240292c08b0Sean Callanan    uint64_t &ptr
564819749647b1605f75753f625050cb240292c08b0Sean Callanan)
565819749647b1605f75753f625050cb240292c08b0Sean Callanan{
566819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
567819749647b1605f75753f625050cb240292c08b0Sean Callanan
568819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (!m_parser_vars->m_exe_ctx ||
569819749647b1605f75753f625050cb240292c08b0Sean Callanan        !m_parser_vars->m_exe_ctx->target)
570819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
571819749647b1605f75753f625050cb240292c08b0Sean Callanan
572819749647b1605f75753f625050cb240292c08b0Sean Callanan    return GetSymbolAddress(*m_parser_vars->m_exe_ctx->target,
573819749647b1605f75753f625050cb240292c08b0Sean Callanan                            name,
574819749647b1605f75753f625050cb240292c08b0Sean Callanan                            ptr);
575819749647b1605f75753f625050cb240292c08b0Sean Callanan}
576819749647b1605f75753f625050cb240292c08b0Sean Callanan
577810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
578f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
579f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
5808de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
5818de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
582aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
5838de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
5848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
5858de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
586f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
587aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
588aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
589aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_process = exe_ctx.process;
590aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
5916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool result = DoMaterialize(false /* dematerialize */, exe_ctx, NULL, err);
592f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
593f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
594aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
595f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
596f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
597f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
598f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
599f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
6008de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
6018de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
6033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
604aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
605047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
606047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
6078de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
6083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
609aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
610aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
611aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
6123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
6133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
6143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
6153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
6163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
617aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
6183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
6193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
6203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
6213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
6223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
623696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP object_ptr_var = FindVariableInScope (*exe_ctx.frame,
624696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     object_name,
625696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                                                     (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
6263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
6273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
6283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
6293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
6303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
6313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
6323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
633aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
6343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
635aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
6363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
6373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
6383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
6393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
6403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
6413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
6423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
64350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    switch (location_value->GetValueType())
6443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
64550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    default:
64650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
64750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan        return false;
64850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeLoadAddress:
6493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
65050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
65150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
65250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder();
65350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
65450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
65550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                                                   m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
65650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
65750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
65850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
65950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
66050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
66150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            DataBufferHeap data;
66250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            data.SetByteSize(address_byte_size);
66350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            Error read_error;
66450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
66550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
66650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
66750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
66850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
66950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
67050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
67150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
67250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
67350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            uint32_t offset = 0;
67450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
67550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            object_ptr = extractor.GetPointer(&offset);
67650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
67750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
6783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
67950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan    case Value::eValueTypeScalar:
6803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
68150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
68250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
68350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                StreamString ss;
68450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                location_value->Dump(&ss);
68550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
68650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str());
68750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
68850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
68950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
690061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
69150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
692061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
69350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
69450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString());
69550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
69650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
69750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
698061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
69950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
700061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
70150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            {
702061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name);
70350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan                return false;
70450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            }
70550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
706061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB];
70750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
708061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0);
70950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan
71050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan            return true;
7113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
7123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
7133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
7143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7153c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
7168de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
7178de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
718aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
719427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
7208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
7218de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
722f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
723427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return DoMaterialize(true, exe_ctx, &result_sp, err);
724aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
725aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
726aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
727aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
728aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
729aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
730aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
731aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
732aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
733aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
734aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
735aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
736aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
737aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
738aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
739aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
740aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
741aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
742aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
743aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
744aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
745f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
746f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
74732824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
7488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
7498de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
750aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
7518de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
7528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
7538de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
75432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
755aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
756aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
757aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
758aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
75932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
76032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
76132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
76232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
76332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
764aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.process)
76532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
76632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
76732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
76832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
76932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
770aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.target)
77132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
77232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
77332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
77432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
77532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
7763371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
7773371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
7783371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
7793371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
7803371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
7813371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
782aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
78332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
78432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
785aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize())
78632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
78732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
78832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
78932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
79032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
791aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
79232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
793427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
794427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
795427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
79632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
797427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
79832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
799427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
800427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
801427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
802427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
8038c12720c108cd5e7ed792596749218d8400f647eSean Callanan
804427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
8058c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
8068c12720c108cd5e7ed792596749218d8400f647eSean Callanan
807427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
808427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
809427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
810427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
811427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
812427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
813427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
814427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
815427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
81632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
81732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
81832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
81932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
82032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
82132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
82232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
823f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
8248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
8258de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
8268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
827aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
828427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
8298de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
8308de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
831810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
832427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
833427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
834427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
835aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
836aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
837e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
83882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
839aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
840810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
841810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
842810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
843810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
844810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
845aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.frame)
84645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
84745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
84845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        return LLDB_INVALID_ADDRESS;
84945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
85045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
851427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables();
852aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
853aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
854e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
855e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
856e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
857e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
858aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = NULL;
859e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
860e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
861e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
862e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
863aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
864810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
865f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
866f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
867aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
868f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
869aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
870aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
871f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
872810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
8737a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
8747a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
8757a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
876aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
877aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
878aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
879f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
880f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
881f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
882f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
883aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
884f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
885810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
886aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
887810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
888aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
889aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
890810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
891427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
8928c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
8938c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
894810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
895427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
8964d0b110715d321d366dec1dc690300f713b63236Sean Callanan
897a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
898336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
899a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
900427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
9011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
9021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
9031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
904aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
9051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
9061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
9071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
9081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
909427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
910427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
911427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
912427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
913427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
914427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
9151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
9161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
9171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
9181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
919427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
9201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
9211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
922427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
923427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
9246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
9256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
926427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
927427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
9281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
9291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
9308c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
931a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
9328c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
933a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
934a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
935a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
93645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
9376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
938a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
939a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
940a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
941a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
9426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
943a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
944a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
9456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
946a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
947a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
948a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
9496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
950a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
951a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
952a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
953a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
954f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
955a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
956a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
957a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
9588c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
959a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
9608c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
961810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
962810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
963f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
964f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
965f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
9666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callananstatic bool WriteAddressInto
9676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan(
9686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ExecutionContext &exe_ctx,
9696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t target,
9706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t address,
9716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    Error &err
9726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan)
9736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan{
9746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
9756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    StreamString str (0 | Stream::eBinary,
9776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                      pointer_byte_size,
9786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                      exe_ctx.process->GetByteOrder());
9796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    switch (pointer_byte_size)
9816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
9826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        default:
9836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            assert(!"Unhandled byte size");
9846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        case 4:
9856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
9866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            uint32_t address32 = address & 0xffffffffll;
987cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton            str.PutRawBytes(&address32, sizeof(address32), endian::InlHostByteOrder(), eByteOrderInvalid);
9886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
9896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        break;
9906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        case 8:
9916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
9926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            uint64_t address64 = address;
993cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton            str.PutRawBytes(&address64, sizeof(address64), endian::InlHostByteOrder(), eByteOrderInvalid);
9946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
9956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        break;
9966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
9976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return (exe_ctx.process->WriteMemory (target, str.GetData(), pointer_byte_size, err) == pointer_byte_size);
9996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan}
10006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callananstatic lldb::addr_t ReadAddressFrom
10026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan(
10036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ExecutionContext &exe_ctx,
10046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t source,
10056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    Error &err
10066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan)
10076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan{
10086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
10096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    DataBufferHeap *buf = new DataBufferHeap(pointer_byte_size, 0);
10116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    DataBufferSP buf_sp(buf);
10126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (exe_ctx.process->ReadMemory (source, buf->GetBytes(), pointer_byte_size, err) != pointer_byte_size)
10146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return LLDB_INVALID_ADDRESS;
10156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    DataExtractor extractor (buf_sp, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
10176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    uint32_t offset = 0;
10196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return (lldb::addr_t)extractor.GetPointer(&offset);
10216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan}
10226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1023a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
10248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
10258de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
10268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
10278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1028427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
10298de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
10308de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
10318de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1032aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
10336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
10346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1035427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
1036a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
1037427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
1038a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
1039a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1040a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1041427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
1042a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1043427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
1044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
1045a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
1046a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
1047a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
1048a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
10496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
10506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1051a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
1052a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
10536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
10546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
10556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
10576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
10586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
10596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
10606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
10626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            mem = ReadAddressFrom(exe_ctx, addr, read_error);
10636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
10656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
10676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
10686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
10716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
10726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
10746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
10756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
107647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (),
107747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetASTContext(),
107847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetTypeFromUser().GetOpaqueQualType(),
107947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    var_sp->GetName(),
108047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    mem,
108147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    eAddressTypeLoad,
108247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                    pvar_byte_size);
10836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
10866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
10886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
10896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1091b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
10926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
10946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
10956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
109797678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
109897678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
10996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
11006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
11016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
11036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
11046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
11066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
11086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Read");
11096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
11116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
11126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
11146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
11156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
11166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
11186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
11196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
11216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
11226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
11236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
11246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
11266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
11276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
11286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
11306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
11326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
11336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
11346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
11356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
11366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
11376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
11386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
11396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
1140a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
11416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1142a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1143a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1144a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1145a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
1146a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
11476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
11486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
11496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
11516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
11526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
11536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
11556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            mem = exe_ctx.process->AllocateMemory(pvar_byte_size,
11576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
11586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  allocate_error);
11596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
11616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
11626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
11636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
11646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
11656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
11676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
11686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
11706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
117147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham            var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
117247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetASTContext(),
117347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetTypeFromUser().GetOpaqueQualType(),
117447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                var_sp->GetName(),
117547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                mem,
117647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                eAddressTypeLoad,
117747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                pvar_byte_size);
11786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
11806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
11826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
11836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
11856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
11876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
11886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
11896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
11906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
11916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
11926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
11946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
11956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
11966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
11976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
11996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
12016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
12026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
12036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
12046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
12056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
12066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
12086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
12096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
1210696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
1211a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
12126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1213a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1214a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1215a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1216a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1217a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1218a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1219a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1220f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
12218de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
12238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
12248de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
12258de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
12266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
12278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
12288de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
12298de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1230f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1231e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1232f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
123317c6a05cb96f7110332342326a90692d9505982eSean Callanan    if (!exe_ctx.frame || !exe_ctx.process)
1234cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
1235cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
12366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
12376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
12396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
12406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1241696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP var = FindVariableInScope (*exe_ctx.frame, name, &type);
1242819749647b1605f75753f625050cb240292c08b0Sean Callanan    Symbol *sym = FindGlobalDataSymbol(*exe_ctx.target, name);
1243f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1244819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<lldb_private::Value> location_value;
1245819749647b1605f75753f625050cb240292c08b0Sean Callanan
1246819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (var)
1247819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1248819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(GetVariableValue(exe_ctx,
1249819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              var,
1250819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              NULL));
1251819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1252819749647b1605f75753f625050cb240292c08b0Sean Callanan    else if (sym)
1253819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1254819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value.reset(new Value);
1255819749647b1605f75753f625050cb240292c08b0Sean Callanan
1256819749647b1605f75753f625050cb240292c08b0Sean Callanan        uint64_t location_load_addr;
1257819749647b1605f75753f625050cb240292c08b0Sean Callanan
1258819749647b1605f75753f625050cb240292c08b0Sean Callanan        if (!GetSymbolAddress(*exe_ctx.target, name, location_load_addr))
1259819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
1260819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (log)
1261819749647b1605f75753f625050cb240292c08b0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find value for global symbol %s", name.GetCString());
1262819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
1263819749647b1605f75753f625050cb240292c08b0Sean Callanan
1264819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->SetValueType(Value::eValueTypeLoadAddress);
1265819749647b1605f75753f625050cb240292c08b0Sean Callanan        location_value->GetScalar() = location_load_addr;
1266819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1267819749647b1605f75753f625050cb240292c08b0Sean Callanan    else
1268f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
12698de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
1270f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1271f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1272f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1273841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
12748de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
1275f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1276f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1277f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1278f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
12798de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1280f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1281f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
128217c6a05cb96f7110332342326a90692d9505982eSean Callanan
128317c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1284f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
12856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
12866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
128717c6a05cb96f7110332342326a90692d9505982eSean Callanan
128817c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
128917c6a05cb96f7110332342326a90692d9505982eSean Callanan
129017c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1291f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
129217c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1293f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
129417c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
129517c6a05cb96f7110332342326a90692d9505982eSean Callanan
129617c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
129717c6a05cb96f7110332342326a90692d9505982eSean Callanan
12988de27c761a22187ef63fb60000894be163e7285fGreg Clayton            err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
129917c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1300f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
130117c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
130217c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1303f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
13046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
130517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
13066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
13076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
13086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error error;
13096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
13106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!WriteAddressInto(exe_ctx,
13116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                      addr,
13126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                      value_addr,
13136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                      error))
13146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
13156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
13166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
13176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
131817c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1319f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
132017c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
132117c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1322f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
13236916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
132417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
132517c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
132617c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
132717c6a05cb96f7110332342326a90692d9505982eSean Callanan
13288de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
132917c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
133017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
133117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1332061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            lldb::addr_t reg_addr = LLDB_INVALID_ADDRESS; // The address of a spare memory area aused to hold the variable.
13336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1334061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterInfo *reg_info = location_value->GetRegisterInfo();
133517c6a05cb96f7110332342326a90692d9505982eSean Callanan
1336061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_info)
133717c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
13388de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
133917c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
134017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
134117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1342061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterValue reg_value;
1343061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1344061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
1345061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1346061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            if (!reg_ctx)
134717c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
1348061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), reg_info->name);
134917c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
135017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
135117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1352061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            uint32_t register_byte_size = reg_info->byte_size;
135317c6a05cb96f7110332342326a90692d9505982eSean Callanan
135417c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
135517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
13566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
13576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
13586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
13596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
13606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
13616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
13626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
13636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1364b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad)
13656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
13666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
13676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
13686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
13696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                reg_addr = expr_var->m_live_sp->GetValue().GetScalar().ULongLong();
137117c6a05cb96f7110332342326a90692d9505982eSean Callanan
1372061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err = reg_ctx->ReadRegisterValueFromMemory (reg_info, reg_addr, value_byte_size, reg_value);
1373061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
137417c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
1375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1376061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->WriteRegister (reg_info, reg_value))
137717c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    err.SetErrorStringWithFormat("Couldn't write %s to register %s", name.GetCString(), reg_info->name);
137917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
138017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
13816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
13826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
13836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1384061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                Error deallocate_error = exe_ctx.process->DeallocateMemory(reg_addr);
13856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
13866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
13876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
13886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't deallocate spare memory area for %s: %s", name.GetCString(), deallocate_error.AsCString());
13896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
13906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
13916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
13926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
139317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
139417c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
139517c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
13966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
13976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
13986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
13996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
14006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1401061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                reg_addr = exe_ctx.process->AllocateMemory (value_byte_size,
1402061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                            lldb::ePermissionsReadable | lldb::ePermissionsWritable,
1403061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                            allocate_error);
14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1405061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (reg_addr == LLDB_INVALID_ADDRESS)
14066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", name.GetCString(), allocate_error.AsCString());
14086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
14126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
141347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(),
141447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetASTContext(),
141547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      type.GetOpaqueQualType(),
141647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      name,
1417061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                                                      reg_addr,
141847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      eAddressTypeLoad,
141947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham                                                                      value_byte_size);
14206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
14236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error write_error;
1424061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!WriteAddressInto(exe_ctx, addr, reg_addr, write_error))
14256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
14266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), write_error.AsCString());
14276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
14286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
14296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
143017c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Moving from a register into addr
143117c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
143217c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 1: addr_byte_size and register_byte_size are the same
143317c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
143417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
143517c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Address contents
143617c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
143717c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 2: addr_byte_size is bigger than register_byte_size
143817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
143917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   Error!  (The register should always be big enough to hold the data)
144017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
144117c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 3: register_byte_size is bigger than addr_byte_size
144217c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
144317c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
144417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB|     Address contents on little-endian hardware
144517c6a05cb96f7110332342326a90692d9505982eSean Callanan                //       |CCDD| Address contents on big-endian hardware
144617c6a05cb96f7110332342326a90692d9505982eSean Callanan
14476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
144817c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1449061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), reg_info->name);
145017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
145117c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
145217c6a05cb96f7110332342326a90692d9505982eSean Callanan
145317c6a05cb96f7110332342326a90692d9505982eSean Callanan                uint32_t register_offset;
145417c6a05cb96f7110332342326a90692d9505982eSean Callanan
145517c6a05cb96f7110332342326a90692d9505982eSean Callanan                switch (exe_ctx.process->GetByteOrder())
145617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
145717c6a05cb96f7110332342326a90692d9505982eSean Callanan                    default:
14588de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
145917c6a05cb96f7110332342326a90692d9505982eSean Callanan                        return false;
146017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    case lldb::eByteOrderLittle:
146117c6a05cb96f7110332342326a90692d9505982eSean Callanan                        register_offset = 0;
146217c6a05cb96f7110332342326a90692d9505982eSean Callanan                        break;
146317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    case lldb::eByteOrderBig:
14646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        register_offset = register_byte_size - value_byte_size;
146517c6a05cb96f7110332342326a90692d9505982eSean Callanan                        break;
146617c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
1467061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1468061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                RegisterValue reg_value;
1469061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
1470061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (!reg_ctx->ReadRegister (reg_info, reg_value))
147117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
1472061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                    err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), reg_info->name);
147317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
147417c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
147517c6a05cb96f7110332342326a90692d9505982eSean Callanan
1476061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                err = reg_ctx->WriteRegisterValueToMemory(reg_info, reg_addr, value_byte_size, reg_value);
1477061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                if (err.Fail())
147817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
147917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1480f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1481f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1482f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1483f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1484810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
1485810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
14861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
14871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
14881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
14891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
14901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
14911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
1492b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    const RegisterInfo &reg_info,
14931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
14941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
14951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
14961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
14971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
1498061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    RegisterValue reg_value;
14991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
15001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
1501061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error read_error (reg_ctx.ReadRegisterValueFromMemory(&reg_info, addr, register_byte_size, reg_value));
1502061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (read_error.Fail())
15031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1504bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString());
15051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
15061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
15071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1508061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.WriteRegister (&reg_info, reg_value))
15091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1510061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name);
15111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
15121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
15131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
15141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
15151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
15161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1517061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (!reg_ctx.ReadRegister(&reg_info, reg_value))
15181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1519061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name);
15201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
15211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
15221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1523061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        Error write_error (reg_ctx.WriteRegisterValueToMemory(&reg_info, addr, register_byte_size, reg_value));
1524061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton        if (write_error.Fail())
15251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1526061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString());
15271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
15281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
15291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
15301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
15321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
15331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1534696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP
15358de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
15368de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
15378de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
15388de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
15398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
15408de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1541aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1542e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1543cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1544cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    VariableList *var_list = frame.GetVariableList(true);
1545cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (!var_list)
1547696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        return lldb::VariableSP();
1548bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
15493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    lldb::VariableSP var_sp (var_list->FindVariable(name));
15503bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
15513bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const bool append = true;
15523bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const uint32_t max_matches = 1;
15533bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (!var_sp)
1554cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
15553bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        // Look for globals elsewhere in the module for the frame
1556aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
15573bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (module_sp)
15583bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
15593bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            VariableList module_globals;
15603bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
15613bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                var_sp = module_globals.GetVariableAtIndex (0);
15623bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
1563cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
15643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
15653bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (!var_sp)
1566cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
15673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        // Look for globals elsewhere in the program (all images)
1568aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
15693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (target_sp)
15703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
15713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            VariableList program_globals;
15723bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
15733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                var_sp = program_globals.GetVariableAtIndex (0);
15743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
1575cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
15763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
15773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
15783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
15793bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
15803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
158104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType()))
1582696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan                return lldb::VariableSP();
15833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
15843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
15853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
15863bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
15873bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
1588696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan            return lldb::VariableSP();
15893bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
15903bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
15913bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
1592696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    return var_sp;
1593cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
1594336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1595819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol *
1596819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol
1597819749647b1605f75753f625050cb240292c08b0Sean Callanan(
1598819749647b1605f75753f625050cb240292c08b0Sean Callanan    Target &target,
1599819749647b1605f75753f625050cb240292c08b0Sean Callanan    const ConstString &name
1600819749647b1605f75753f625050cb240292c08b0Sean Callanan)
1601819749647b1605f75753f625050cb240292c08b0Sean Callanan{
1602819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
1603819749647b1605f75753f625050cb240292c08b0Sean Callanan
1604819749647b1605f75753f625050cb240292c08b0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name,
1605819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                   eSymbolTypeData,
1606819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                   sc_list);
1607819749647b1605f75753f625050cb240292c08b0Sean Callanan
1608819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (sc_list.GetSize())
1609819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1610819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
1611819749647b1605f75753f625050cb240292c08b0Sean Callanan        sc_list.GetContextAtIndex(0, sym_ctx);
1612819749647b1605f75753f625050cb240292c08b0Sean Callanan
1613819749647b1605f75753f625050cb240292c08b0Sean Callanan        return sym_ctx.symbol;
1614819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1615819749647b1605f75753f625050cb240292c08b0Sean Callanan
1616819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
1617819749647b1605f75753f625050cb240292c08b0Sean Callanan}
1618819749647b1605f75753f625050cb240292c08b0Sean Callanan
161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1621e5748d889fb7fb97b3ff07444894d7714776b609Greg ClaytonClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1623aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1624aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1625aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1626e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
16273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1628810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
16298de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("Hunting for a definition for '%s'", name.GetCString());
163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Back out in all cases where we're not fully initialized
1632aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_exe_ctx->frame == NULL)
163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
1634ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1635aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_ignore_lookups)
1636ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
1637ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
1638ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
1639ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
1640ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
16413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1642e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
16453bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
16463bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
16473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
16483bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
16498de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
16508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
16513bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr[0] != '$')
16520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
1653696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan        VariableSP var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
16548de27c761a22187ef63fb60000894be163e7285fGreg Clayton
16558de27c761a22187ef63fb60000894be163e7285fGreg Clayton        // If we found a variable in scope, no need to pull up function names
16568de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (var != NULL)
165792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
16588de27c761a22187ef63fb60000894be163e7285fGreg Clayton            AddOneVariable(context, var);
165992aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
16608de27c761a22187ef63fb60000894be163e7285fGreg Clayton        else
166192aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
166228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            const bool include_symbols = true;
166328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            const bool append = false;
166428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            m_parser_vars->m_sym_ctx.FindFunctionsByName (name,
166528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                                                          include_symbols,
166628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                                                          append,
166728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                                                          sc_list);
16688de27c761a22187ef63fb60000894be163e7285fGreg Clayton
1669819749647b1605f75753f625050cb240292c08b0Sean Callanan            if (sc_list.GetSize())
16708de27c761a22187ef63fb60000894be163e7285fGreg Clayton            {
1671819749647b1605f75753f625050cb240292c08b0Sean Callanan                bool found_specific = false;
1672819749647b1605f75753f625050cb240292c08b0Sean Callanan                Symbol *generic_symbol = NULL;
1673819749647b1605f75753f625050cb240292c08b0Sean Callanan                Symbol *non_extern_symbol = NULL;
1674819749647b1605f75753f625050cb240292c08b0Sean Callanan
1675819749647b1605f75753f625050cb240292c08b0Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
1676819749647b1605f75753f625050cb240292c08b0Sean Callanan                     index < num_indices;
1677819749647b1605f75753f625050cb240292c08b0Sean Callanan                     ++index)
16788de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
1679819749647b1605f75753f625050cb240292c08b0Sean Callanan                    SymbolContext sym_ctx;
1680819749647b1605f75753f625050cb240292c08b0Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
1681819749647b1605f75753f625050cb240292c08b0Sean Callanan
1682819749647b1605f75753f625050cb240292c08b0Sean Callanan                    if (sym_ctx.function)
1683819749647b1605f75753f625050cb240292c08b0Sean Callanan                    {
1684819749647b1605f75753f625050cb240292c08b0Sean Callanan                        // TODO only do this if it's a C function; C++ functions may be
1685819749647b1605f75753f625050cb240292c08b0Sean Callanan                        // overloaded
1686819749647b1605f75753f625050cb240292c08b0Sean Callanan                        if (!found_specific)
1687819749647b1605f75753f625050cb240292c08b0Sean Callanan                            AddOneFunction(context, sym_ctx.function, NULL);
1688819749647b1605f75753f625050cb240292c08b0Sean Callanan                        found_specific = true;
1689819749647b1605f75753f625050cb240292c08b0Sean Callanan                    }
1690819749647b1605f75753f625050cb240292c08b0Sean Callanan                    else if (sym_ctx.symbol)
1691819749647b1605f75753f625050cb240292c08b0Sean Callanan                    {
1692819749647b1605f75753f625050cb240292c08b0Sean Callanan                        if (sym_ctx.symbol->IsExternal())
1693819749647b1605f75753f625050cb240292c08b0Sean Callanan                            generic_symbol = sym_ctx.symbol;
1694819749647b1605f75753f625050cb240292c08b0Sean Callanan                        else
1695819749647b1605f75753f625050cb240292c08b0Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
1696819749647b1605f75753f625050cb240292c08b0Sean Callanan                    }
16978de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
1698819749647b1605f75753f625050cb240292c08b0Sean Callanan
1699819749647b1605f75753f625050cb240292c08b0Sean Callanan                if (!found_specific)
17008de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
1701819749647b1605f75753f625050cb240292c08b0Sean Callanan                    if (generic_symbol)
1702819749647b1605f75753f625050cb240292c08b0Sean Callanan                        AddOneFunction (context, NULL, generic_symbol);
1703819749647b1605f75753f625050cb240292c08b0Sean Callanan                    else if (non_extern_symbol)
1704819749647b1605f75753f625050cb240292c08b0Sean Callanan                        AddOneFunction (context, NULL, non_extern_symbol);
1705819749647b1605f75753f625050cb240292c08b0Sean Callanan                }
1706819749647b1605f75753f625050cb240292c08b0Sean Callanan
1707819749647b1605f75753f625050cb240292c08b0Sean Callanan                ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
1708819749647b1605f75753f625050cb240292c08b0Sean Callanan                if (namespace_decl)
1709819749647b1605f75753f625050cb240292c08b0Sean Callanan                {
1710819749647b1605f75753f625050cb240292c08b0Sean Callanan                    clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
1711819749647b1605f75753f625050cb240292c08b0Sean Callanan                    if (clang_namespace_decl)
1712819749647b1605f75753f625050cb240292c08b0Sean Callanan                        clang_namespace_decl->setHasExternalLexicalStorage();
17138de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
17148de27c761a22187ef63fb60000894be163e7285fGreg Clayton            }
1715819749647b1605f75753f625050cb240292c08b0Sean Callanan            else
17166916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            {
1717819749647b1605f75753f625050cb240292c08b0Sean Callanan                // We couldn't find a variable or function for this.  Now we'll hunt for a generic
1718819749647b1605f75753f625050cb240292c08b0Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
1719819749647b1605f75753f625050cb240292c08b0Sean Callanan
1720819749647b1605f75753f625050cb240292c08b0Sean Callanan                Symbol *data_symbol = FindGlobalDataSymbol(*m_parser_vars->m_exe_ctx->target, name);
1721819749647b1605f75753f625050cb240292c08b0Sean Callanan
1722819749647b1605f75753f625050cb240292c08b0Sean Callanan                if (data_symbol)
1723819749647b1605f75753f625050cb240292c08b0Sean Callanan                    AddOneGenericVariable(context, *data_symbol);
17246916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            }
172592aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
17260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
17278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    else
17283cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
172957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
173057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
173157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
173257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
173357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
1734aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
173557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
173657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
173757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
173857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
173957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
174057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
174157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_var)
174257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
174357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
174457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
174557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
174657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
174757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
174857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
17492403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            if (log)
17502403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
17512403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString ("Type for \"this\" is: ");
17522403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
17532403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
17542403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
17552403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
17562403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
175704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser this_user_type(this_type->GetClangFullType(),
175857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
175957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
1760aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
176157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
176257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            void *pointer_target_type;
176357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
176457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
176557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
176657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
176757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
176857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            TypeFromUser class_user_type(pointer_target_type,
176957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
177057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
17713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
17723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
17733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
17743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
17753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
17763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
17773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
17783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
177957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            AddOneType(context, class_user_type, true);
178057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
178157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
178257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
178357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
17843aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
17853aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
17863aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
17873aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
17883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
17893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
17903aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
17913aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
17923aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
17933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
17943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
17953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
17963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_var)
17973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
17983aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
17993aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
18003aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18013aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
18023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
18033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
180404c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton            TypeFromUser self_user_type(self_type->GetClangFullType(),
18053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
18063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
18083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18093aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            void *pointer_target_type;
18103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
18123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                                &pointer_target_type))
18133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
18143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
18163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
18173aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18183aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
18193aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
18203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
18213aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
18223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
18233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
18243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
18253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            AddOneType(context, class_user_type, false);
18273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
18283aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
18293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
1830427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1831427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
18323cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan
1833427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
18341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1835427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            AddOneVariable(context, pvar_sp);
18361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
18371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
18391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
18401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1841aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
18421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1843b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
18441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
18451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
18461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                AddOneRegister(context, reg_info);
18471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
18488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
1849a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1850aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
18516df0840c87be29724055716db951aa6d494ddabcSean Callanan
1852ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    if (type_sp)
1853ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
1854ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
18556df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
1856ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1857ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            StreamString strm;
1858ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            type_sp->Dump(&strm, true);
1859ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->PutCString (strm.GetData());
1860ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        }
18612403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
186204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        TypeFromUser user_type (type_sp->GetClangFullType(),
1863b01000fd063629facd45044f137446fb748ee179Greg Clayton                                type_sp->GetClangAST());
18646df0840c87be29724055716db951aa6d494ddabcSean Callanan
1865ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        AddOneType(context, user_type, false);
18666df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1868336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1869336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
18708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
18718de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
18728de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
1873696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    VariableSP var,
18748de27c761a22187ef63fb60000894be163e7285fGreg Clayton    clang::ASTContext *parser_ast_context,
18758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
18768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
18778de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1879e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
18806184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1885810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1886810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
1887336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton    clang_type_t var_opaque_type = var_type->GetClangFullType();
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1894810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1895810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
1896336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1899b01000fd063629facd45044f137446fb748ee179Greg Clayton    clang::ASTContext *ast = var_type->GetClangASTContext().getASTContext();
190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1901b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1903810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1904810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
1905336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1908336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
1909336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1912178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1913178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
1914178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
1915178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
1916178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
1917178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
1918eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
1919178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1922bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1924810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1925810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
1926336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1928b01000fd063629facd45044f137446fb748ee179Greg Clayton
1929336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    void *type_to_use;
1930336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1931f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
1932f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1933b01000fd063629facd45044f137446fb748ee179Greg Clayton        type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type);
1934f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
19354b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
19364b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
19374b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
19384b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
19394b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
19404b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
19414b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
19424b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
1943f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
1944f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1945f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1946336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
1947336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
19506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
1956336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
1958336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
1963336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
1964336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1967aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->GetScalar() = load_addr;
197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->SetValueType(Value::eValueTypeLoadAddress);
197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1973f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
1974b01000fd063629facd45044f137446fb748ee179Greg Clayton        *user_type = TypeFromUser(var_opaque_type, ast);
1975336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1976336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
1977336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
1978336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1979336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
1980696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var)
1981336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
1982aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1983aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1984e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1985336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1986f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
1987f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
1988336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1989aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
19908de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
19918de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
19928de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
19938de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
1994336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
19954b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
19964b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
19974b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
19986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
19998de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2000427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
2001fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2002fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      entity_name,
2003427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      ut,
2004427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2005427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2006427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
2007427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2008427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
2009427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2010427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2011427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
2012696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan    entity->m_parser_vars->m_lldb_var    = var;
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2014810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
20158de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2016a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2017a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2018a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2019a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2020a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2021a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
20226e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan
20236e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan        if (log->GetVerbose())
20246e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan        {
20256e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan            StreamString var_decl_dump_string;
20266e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan            ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
20276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan            log->Printf("%s\n", var_decl_dump_string.GetData());
20286e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan        }
20298de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
20308f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
20318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
20328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
2033a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
2034427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                       ClangExpressionVariableSP &pvar_sp)
2035a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
2036e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
203745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2038427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
2039a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2040427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
2041427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
2042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
2043427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
2044a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
20456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
20468c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2047427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
2048427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
2049427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
2050427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
2051427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
205245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
205345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
2054a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
2055a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
2056a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2057a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
2058a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
2059a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2060427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
2061a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
2062a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
2063a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
20641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
2065819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
2066819749647b1605f75753f625050cb240292c08b0Sean Callanan                                              Symbol &symbol)
2067819749647b1605f75753f625050cb240292c08b0Sean Callanan{
2068819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
2069819749647b1605f75753f625050cb240292c08b0Sean Callanan
2070819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2071819749647b1605f75753f625050cb240292c08b0Sean Callanan
2072819749647b1605f75753f625050cb240292c08b0Sean Callanan    clang::ASTContext *scratch_ast_context = m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext();
2073819749647b1605f75753f625050cb240292c08b0Sean Callanan
2074819749647b1605f75753f625050cb240292c08b0Sean Callanan    TypeFromUser user_type (ClangASTContext::GetVoidPtrType(scratch_ast_context, false),
2075819749647b1605f75753f625050cb240292c08b0Sean Callanan                            scratch_ast_context);
2076819749647b1605f75753f625050cb240292c08b0Sean Callanan
2077819749647b1605f75753f625050cb240292c08b0Sean Callanan    TypeFromParser parser_type (ClangASTContext::GetVoidPtrType(context.GetASTContext(), false),
2078819749647b1605f75753f625050cb240292c08b0Sean Callanan                                context.GetASTContext());
2079819749647b1605f75753f625050cb240292c08b0Sean Callanan
2080819749647b1605f75753f625050cb240292c08b0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
2081819749647b1605f75753f625050cb240292c08b0Sean Callanan
2082819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2083819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
2084819749647b1605f75753f625050cb240292c08b0Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2085819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
2086819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
2087819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2088819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2089819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
2090819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->EnableParserVars();
2091819749647b1605f75753f625050cb240292c08b0Sean Callanan
2092819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::auto_ptr<Value> symbol_location(new Value);
2093819749647b1605f75753f625050cb240292c08b0Sean Callanan
2094819749647b1605f75753f625050cb240292c08b0Sean Callanan    AddressRange &symbol_range = symbol.GetAddressRangeRef();
2095819749647b1605f75753f625050cb240292c08b0Sean Callanan    Address &symbol_address = symbol_range.GetBaseAddress();
2096819749647b1605f75753f625050cb240292c08b0Sean Callanan    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(m_parser_vars->m_exe_ctx->target);
2097819749647b1605f75753f625050cb240292c08b0Sean Callanan
2098819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
2099819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->GetScalar() = symbol_load_addr;
2100819749647b1605f75753f625050cb240292c08b0Sean Callanan    symbol_location->SetValueType(Value::eValueTypeLoadAddress);
2101819749647b1605f75753f625050cb240292c08b0Sean Callanan
2102819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_parser_type = parser_type;
2103819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_named_decl  = var_decl;
2104819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_llvm_value  = NULL;
2105819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_value  = symbol_location.release();
2106819749647b1605f75753f625050cb240292c08b0Sean Callanan    entity->m_parser_vars->m_lldb_sym    = &symbol;
2107819749647b1605f75753f625050cb240292c08b0Sean Callanan
2108819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
2109819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
2110819749647b1605f75753f625050cb240292c08b0Sean Callanan        std::string var_decl_print_string;
2111819749647b1605f75753f625050cb240292c08b0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
2112819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl->print(var_decl_print_stream);
2113819749647b1605f75753f625050cb240292c08b0Sean Callanan        var_decl_print_stream.flush();
2114819749647b1605f75753f625050cb240292c08b0Sean Callanan
2115819749647b1605f75753f625050cb240292c08b0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
2116819749647b1605f75753f625050cb240292c08b0Sean Callanan
2117819749647b1605f75753f625050cb240292c08b0Sean Callanan        if (log->GetVerbose())
2118819749647b1605f75753f625050cb240292c08b0Sean Callanan        {
2119819749647b1605f75753f625050cb240292c08b0Sean Callanan            StreamString var_decl_dump_string;
2120819749647b1605f75753f625050cb240292c08b0Sean Callanan            ASTDumper::DumpDecl(var_decl_dump_string, var_decl);
2121819749647b1605f75753f625050cb240292c08b0Sean Callanan            log->Printf("%s\n", var_decl_dump_string.GetData());
2122819749647b1605f75753f625050cb240292c08b0Sean Callanan        }
2123819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
2124819749647b1605f75753f625050cb240292c08b0Sean Callanan}
2125819749647b1605f75753f625050cb240292c08b0Sean Callanan
2126819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
2127427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
2128427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        const RegisterInfo *reg_info)
21291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
21301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
21311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
21321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
21331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
21341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
21351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
21361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
21371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
21381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
21391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
21401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
21411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2142427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
2143427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
21441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
21451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
21461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
2147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(),
2148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2149427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2150427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
21511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
2152427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
2153427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
2154427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2155427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
2156427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
2157427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2158427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
21591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
21601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (log)
21611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
21621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        std::string var_decl_print_string;
21631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
21641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl->print(var_decl_print_stream);
21651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl_print_stream.flush();
21661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
21671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
21681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
21691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
21701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
21716916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::NamespaceDecl *
21726916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
21736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
21746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
21756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
21766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(),
21776916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                                                          namespace_decl.GetASTContext(),
21786916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                                                          namespace_decl.GetNamespaceDecl());
21796916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
21806916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return dyn_cast<clang::NamespaceDecl>(copied_decl);
21816916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
21826916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
2183a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
21848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
21850fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Function* fun,
21860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Symbol* symbol)
21878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
2188aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2189aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2190e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
21918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
21920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    NamedDecl *fun_decl;
21930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
21940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    const Address *fun_address;
21958f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
21960fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
21970fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
21980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    clang::ASTContext *fun_ast_context = NULL;
21998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
22000fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
22010fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
22020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
22030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
22040fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
22050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
22060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
22070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no type");
22080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
22090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
22100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
221104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton        fun_opaque_type = fun_type->GetClangFullType();
22120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
22130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
22140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
22150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
22160fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no Clang type");
22170fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
22180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
22190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
22200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
22210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
2222b01000fd063629facd45044f137446fb748ee179Greg Clayton        fun_ast_context = fun_type->GetClangASTContext().getASTContext();
2223ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
22240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
22250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
22260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
22270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
22280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
22290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
22300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
22310fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
22320fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
22330fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
22348f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
2235810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
22360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            log->PutCString("AddOneFunction called with no function and no symbol");
22378f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
22388f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
22398f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
2240aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target);
22418f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
22428f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
22438f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
2244fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (),
2245fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
22488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
2250427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
2251427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
2252427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2253427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
2255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
22578c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2258810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
22598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2260a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string fun_decl_print_string;
2261a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
2262a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl->print(fun_decl_print_stream);
2263a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl_print_stream.flush();
2264a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2265a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
22668de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
226893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
226993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
227093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
22713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
22723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
227393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
22743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *parser_ast_context = context.GetASTContext();
22753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *user_ast_context = ut.GetASTContext();
22763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
2277ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
22783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
22793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
228093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
22813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
22823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
22833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
22843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
22853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
22863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
22873c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
22883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
22893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
22903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
22913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
22923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
229330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
22941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
22951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
22961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
229730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
229830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
22991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
23001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
23018de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
23021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
23031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
23041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
23051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
230630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
230730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
23083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
230993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
231093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
231193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
2312ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2313ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid *
2314ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
2315ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         ASTContext *source_context,
2316ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         void *clang_type)
2317ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{
2318aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2319aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2320aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = true;
2321ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2322ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *ret = ClangASTContext::CopyType (dest_context,
2323ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                           source_context,
2324ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                           clang_type);
2325ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2326aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = false;
2327ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2328ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    return ret;
2329ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan}
2330