ClangExpressionDeclMap.cpp revision 97678d17ac9bcb66f7092178109271991ab16533
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"
2305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
25a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
276916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
36f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
37810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
3817c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
40f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
42a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
443bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) :
498de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
51aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    m_struct_vars (),
536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    m_keep_result_in_memory (keep_result_in_memory)
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
61aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
64427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
65427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
668c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
67aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
68aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_exe_ctx = &exe_ctx;
6945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (exe_ctx.frame)
71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything);
7278b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    else if (exe_ctx.thread)
7378b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
7478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham
75427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (exe_ctx.target)
76427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_parser_vars->m_persistent_vars = &exe_ctx.target->GetPersistentVariables();
77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
78c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
79427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid
80427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
81aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
82aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
83aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
84427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
85aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
86aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
87aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
88427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
89427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (var_sp &&
90427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars.get() &&
91427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                var_sp->m_parser_vars->m_lldb_value)
92427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                delete var_sp->m_parser_vars->m_lldb_value;
93aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
94427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            var_sp->DisableParserVars();
95aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
96aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
97427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
98aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
99aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
100aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
102427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                pvar_sp->DisableParserVars();
104aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
105aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
106aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1077a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1128de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1138de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
11482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    {
119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        Target *target = m_parser_vars->GetTarget();
120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        assert (target);
121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName();
122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    }
123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
12482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
12582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
12605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP
12705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name,
12805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              lldb_private::TypeFromParser type,
12905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                              const llvm::APInt& value)
13005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{
13105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    assert (m_parser_vars.get());
13205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
13305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
13405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
13505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
13605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetASTContext(),
13705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                                                     type.GetOpaqueQualType()),
13805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan                           context);
13905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
1400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name,
1410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     user_type,
1420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                                                                     m_parser_vars->m_exe_ctx->process->GetAddressByteSize()))
1440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
1450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
1460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
1470e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
1480e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (!pvar_sp)
1490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
15005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
1510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    uint8_t *pvar_data = pvar_sp->GetValueBytes();
1520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    if (pvar_data == NULL)
1530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan        return lldb::ClangExpressionVariableSP();
15405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
15505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    uint64_t value64 = value.getLimitedValue();
15605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
15705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    ByteOrder byte_order = m_parser_vars->m_exe_ctx->process->GetByteOrder();
15805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
15905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_val_bytes = sizeof(value64);
1600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    size_t num_data_bytes = pvar_sp->GetByteSize();
16105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
16205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    size_t num_bytes = num_val_bytes;
16305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    if (num_bytes > num_data_bytes)
16405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        num_bytes = num_data_bytes;
16505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
16605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    for (off_t byte_idx = 0;
16705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         byte_idx < num_bytes;
16805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan         ++byte_idx)
16905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    {
17005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t shift = byte_idx * 8;
17105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint64_t mask = 0xffll << shift;
17205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift);
17305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
17405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        switch (byte_order)
17505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        {
1760e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderBig:
1770e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                //                    High         Low
1780e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Original:         |AABBCCDDEEFFGGHH|
1790e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |EEFFGGHH|
1800e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
1810e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte;
1820e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
1830e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            case eByteOrderLittle:
1840e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                // Target:                   |HHGGFFEE|
1850e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                pvar_data[byte_idx] = cur_byte;
1860e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                break;
1870e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan            default:
1880e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan                return lldb::ClangExpressionVariableSP();
18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan        }
19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan    }
1916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
1926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried;
1930e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan
1940e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan    return pvar_sp;
19505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan}
19605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan
1978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1988de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
1998de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2008de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
2018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
2026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
2036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
2046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
2058de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
206a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
207aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
208aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
211aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
212a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
213a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
21482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
21582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
21697678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
217a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
218427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name,
219427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     user_type,
220427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     m_parser_vars->m_exe_ctx->process->GetByteOrder(),
221427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                     m_parser_vars->m_exe_ctx->process->GetAddressByteSize()))
2228c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
2238c12720c108cd5e7ed792596749218d8400f647eSean Callanan
224427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name));
2258c12720c108cd5e7ed792596749218d8400f647eSean Callanan
226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
2278c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
2288c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
2306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
2316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
2326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
2336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
2356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
2366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
2376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
2386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
2396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
2406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
2416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
2436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
2456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
2466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableParserVars();
2488c12720c108cd5e7ed792596749218d8400f647eSean Callanan
249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_named_decl = decl;
250427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_parser_type = parser_type;
2518c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2528c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
253a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
254a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
255a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
2568de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
2578de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
2598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
2608de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
2618de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
2628de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
2638de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
265aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
266aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
267aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
268e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
26945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
270aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
2718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2728c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
2738c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
2748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
275427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl));
2768c12720c108cd5e7ed792596749218d8400f647eSean Callanan
277427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
278427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl);
2798c12720c108cd5e7ed792596749218d8400f647eSean Callanan
280427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
2818c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
2828c12720c108cd5e7ed792596749218d8400f647eSean Callanan
28345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
28445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
28545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
2868de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
28845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
2898c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
2908c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
291427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_parser_vars->m_llvm_value = value;
2928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->EnableJITVars();
294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_alignment = alignment;
295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    var_sp->m_jit_vars->m_size = size;
2968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
2988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
3008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
3018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
3038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
3048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
305aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
306aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
307aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
3088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
3098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
3118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
312aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
313aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
3148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_index = 0, num_members = m_struct_members.GetSize();
3168c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
3178c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
3188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
319427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
320427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
321427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
322427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
3248c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
3258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3268c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment;
3288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
329427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (cursor % member_sp->m_jit_vars->m_alignment)
330427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment));
3318c12720c108cd5e7ed792596749218d8400f647eSean Callanan
332427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        member_sp->m_jit_vars->m_offset = cursor;
333427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        cursor += member_sp->m_jit_vars->m_size;
3348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
3358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
336aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
3378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
338aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
3398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
3408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
3418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3428de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
3438de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
3458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
3468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
3478de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
3488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
349aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
350aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
351aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
3528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
3538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
354427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
355aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
356aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
3578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
3598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
3608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
3628de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
3638de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *&decl,
3658de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
3668de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
3678de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
3688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
3698de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
3708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
371aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
372aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
373aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
3748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
3758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
376427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
3778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
3788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
379427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
3808c12720c108cd5e7ed792596749218d8400f647eSean Callanan
381427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!member_sp ||
382427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_parser_vars.get() ||
383427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        !member_sp->m_jit_vars.get())
3848c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
3858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
386427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    decl = member_sp->m_parser_vars->m_named_decl;
387427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = member_sp->m_parser_vars->m_llvm_value;
388427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    offset = member_sp->m_jit_vars->m_offset;
389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
3908c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
3928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
3938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
39402fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
3958de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
3968de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3978de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
3988de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value**& value,
3998de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
4008de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
401ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl));
4038c12720c108cd5e7ed792596749218d8400f647eSean Callanan
404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
4058c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
406ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
4078c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
4088c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
409ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    value = &entity_sp->m_parser_vars->m_llvm_value;
411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
4128c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4138c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
414ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
415ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
416f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
4178de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
4188de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4198de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
4208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
4218de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
422f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
423aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
424aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
425f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
42678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (m_parser_vars->m_exe_ctx->target == NULL)
42778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
42878b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
429f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
430f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
431e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
432f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
433aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_sym_ctx.FindFunctionsByName(name, false, sc_list);
434f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
435e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
436f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
437f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
438f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
439e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
440f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
441f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    const Address *fun_address;
442f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
443f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
444f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
445f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
446f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
447f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
448f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
449f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
451f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
452f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
453f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
454f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
455810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
456f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
457f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
4588de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
4598de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
460aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
4618de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
4628de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
4638de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
464f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
465aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
466aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
467aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_process = exe_ctx.process;
468aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
4696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool result = DoMaterialize(false /* dematerialize */, exe_ctx, NULL, err);
470f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
471f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
472aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
473f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
474f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
475f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
476f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
477f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
4788de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
4798de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4808de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
4813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
482aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
483047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Error &err,
484047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    bool suppress_type_check
4858de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
487aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
488aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
489aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
4903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
4913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
4923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
4933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
4943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
495aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
4963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
4973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
4983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
4993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
5003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
501047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan    Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame,
502047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan                                                    object_name,
503047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan                                                    (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type));
5043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
5063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
5073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
5083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
5093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
5103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
511aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
5123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
513aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
5143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
5163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
5173aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
5183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
5193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
5203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (location_value->GetValueType() == Value::eValueTypeLoadAddress)
5223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
5233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
525aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder();
5263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
527aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
528aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                               m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
5293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
5303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
5313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
5323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
5333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        DataBufferHeap data;
5353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        data.SetByteSize(address_byte_size);
5363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        Error read_error;
5373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
538aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
5393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
5403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
5413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
5423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
5433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
5453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        uint32_t offset = 0;
5473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        object_ptr = extractor.GetPointer(&offset);
5493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return true;
5513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
5523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    else
5533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
5543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
5553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
5563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
5573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
5583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
5593c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
5608de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
5618de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
562aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
563427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &result_sp,
5648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
5658de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
566f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
567427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    return DoMaterialize(true, exe_ctx, &result_sp, err);
568aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
569aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
570aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
571aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
572aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
573aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
574aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
575aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
576aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
577aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
578aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
579aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
582aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
583aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
584aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
585aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
586aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
587aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
588aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
589f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
590f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
59132824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
5928de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
5938de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
594aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
5958de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
5968de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
5978de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
59832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
599aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
600aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
601aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
602aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
60332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
60432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
60532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
60632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
60732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
608aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.process)
60932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
61032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
61132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
61232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
61332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
614aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.target)
61532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
61632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
61732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
61832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
61932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
6203371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
6213371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
6223371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
6233371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
6243371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
6253371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
626aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
62732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
62832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
629aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize())
63032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
63132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
63232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
63332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
63432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
635aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
63632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
637427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (size_t member_idx = 0, num_members = m_struct_members.GetSize();
638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         member_idx < num_members;
639427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton         ++member_idx)
64032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
641427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx));
64232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
643427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp)
644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            return false;
645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        s.Printf("[%s]\n", member_sp->GetName().GetCString());
6478c12720c108cd5e7ed792596749218d8400f647eSean Callanan
648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (!member_sp->m_jit_vars.get())
6498c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
6508c12720c108cd5e7ed792596749218d8400f647eSean Callanan
651427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        extractor.Dump (&s,                                                                          // stream
652427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_offset,                                             // offset
653427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        lldb::eFormatBytesWithASCII,                                                 // format
654427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        1,                                                                           // byte size of individual entries
655427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        member_sp->m_jit_vars->m_size,                                               // number of entries
656427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        16,                                                                          // entries per line
657427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,  // address to print
658427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0,                                                                           // bit size (bitfields only; 0 means ignore)
659427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                        0);                                                                          // bit alignment (bitfields only; 0 means ignore)
66032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
66132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
66232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
66332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
66432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
66532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
66632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
6688de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
6698de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
671aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
672427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    lldb::ClangExpressionVariableSP *result_sp_ptr,
6738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
6748de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
675810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
676427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (result_sp_ptr)
677427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        result_sp_ptr->reset();
678427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
679aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
680aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
681e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
68282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
683aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
684810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
685810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
686810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
687810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
688810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
689aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.frame)
69045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
69145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
69245839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        return LLDB_INVALID_ADDRESS;
69345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
69445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
695427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables();
696aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
697aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
698e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
699e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
700e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
701e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
702aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = NULL;
703e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
704e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
705e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
706e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
707aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
708810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
709f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
710f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
711aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
712f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
713aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
714aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
715f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
716810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
7177a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
7187a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
7197a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
720aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
721aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
722aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
723f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
724f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
725f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
726f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
727aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
728f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
729810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
730aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
731810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
732aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
733aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
734810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
735427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    for (uint64_t member_index = 0, num_members = m_struct_members.GetSize();
7368c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
7378c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
738810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index));
7404d0b110715d321d366dec1dc690300f713b63236Sean Callanan
741a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        if (m_found_entities.ContainsVariable (member_sp))
742336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
743a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            RegisterInfo *reg_info = member_sp->GetRegisterInfo ();
744427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (reg_info)
7451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
7461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
7471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
748aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
7491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
7501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
7511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
7521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
753427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneRegister (dematerialize,
754427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
755427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_ctx,
756427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               *reg_info,
757427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
758427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
7591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
7601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
7611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
7621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
763427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!member_sp->m_jit_vars.get())
7641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
7651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
766427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                if (!DoMaterializeOneVariable (dematerialize,
767427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               exe_ctx,
7686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               sym_ctx,
7696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                               member_sp,
770427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
771427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                               err))
7721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
7731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
7748c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
775a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton        else
7768c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
777a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // No need to look for presistent variables if the name doesn't start
778a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            // with with a '$' character...
779a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp))
78045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
7816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                bool keep_this_in_memory = false;
7826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
783a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (member_sp->GetName() == m_struct_vars->m_result_name)
784a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                {
785a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (log)
786a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        log->PutCString("Found result member in the struct");
7876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
788a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    if (result_sp_ptr)
789a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                        *result_sp_ptr = member_sp;
7906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
7916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    keep_this_in_memory = m_keep_result_in_memory;
792a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                }
793a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton
794a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                if (!DoMaterializeOnePersistentVariable (dematerialize,
7956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                         exe_ctx,
796a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         member_sp,
797a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset,
798a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                                                         err))
799a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                    return false;
800f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
801a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            else
802a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            {
803a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton                err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString());
8048c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
805a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton            }
8068c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
807810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
808810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
809f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
810f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
811f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
8126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callananstatic bool WriteAddressInto
8136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan(
8146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ExecutionContext &exe_ctx,
8156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t target,
8166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t address,
8176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    Error &err
8186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan)
8196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan{
8206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
8216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    StreamString str (0 | Stream::eBinary,
8236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                      pointer_byte_size,
8246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                      exe_ctx.process->GetByteOrder());
8256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    switch (pointer_byte_size)
8276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
8286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        default:
8296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            assert(!"Unhandled byte size");
8306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        case 4:
8316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
8326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            uint32_t address32 = address & 0xffffffffll;
8336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            str.PutRawBytes(&address32, sizeof(address32), eByteOrderHost, eByteOrderInvalid);
8346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
8356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        break;
8366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        case 8:
8376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
8386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            uint64_t address64 = address;
8396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            str.PutRawBytes(&address64, sizeof(address64), eByteOrderHost, eByteOrderInvalid);
8406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
8416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        break;
8426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
8436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return (exe_ctx.process->WriteMemory (target, str.GetData(), pointer_byte_size, err) == pointer_byte_size);
8456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan}
8466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callananstatic lldb::addr_t ReadAddressFrom
8486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan(
8496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ExecutionContext &exe_ctx,
8506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t source,
8516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    Error &err
8526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan)
8536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan{
8546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize();
8556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    DataBufferHeap *buf = new DataBufferHeap(pointer_byte_size, 0);
8576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    DataBufferSP buf_sp(buf);
8586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (exe_ctx.process->ReadMemory (source, buf->GetBytes(), pointer_byte_size, err) != pointer_byte_size)
8606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        return LLDB_INVALID_ADDRESS;
8616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    DataExtractor extractor (buf_sp, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
8636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    uint32_t offset = 0;
8656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
8666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    return (lldb::addr_t)extractor.GetPointer(&offset);
8676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan}
8686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
869a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
8708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
8718de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
8728de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
8738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
874427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP &var_sp,
8758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
8768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
8778de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
878aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
8796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
8806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
881427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
882a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        err.SetErrorString("Invalid persistent variable");
884a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
885a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
886a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
887427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    const size_t pvar_byte_size = var_sp->GetByteSize();
888a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
889427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    uint8_t *pvar_data = var_sp->GetValueBytes();
890427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (pvar_data == NULL)
891a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
892a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
893a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
894a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
8956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable.
8966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
897a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
898a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
8996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
9006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags);
9016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) ||
9036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference))
9046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
9056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Get the location of the target out of the struct.
9066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error read_error;
9086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            mem = ReadAddressFrom(exe_ctx, addr, read_error);
9096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
9116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
9126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString());
9136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
9146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
9156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference &&
9176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !var_sp->m_live_sp)
9186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
9196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // If the reference comes from the program, then the ClangExpressionVariable's
9206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // live variable data hasn't been set up yet.  Do this now.
9216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_live_sp.reset(new lldb_private::ValueObjectConstResult(var_sp->GetTypeFromUser().GetASTContext(),
9236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                 var_sp->GetTypeFromUser().GetOpaqueQualType(),
9246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                 var_sp->GetName(),
9256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                 mem,
9266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                 lldb::eAddressTypeLoad,
9276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                 pvar_byte_size));
9286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
9296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!var_sp->m_live_sp)
9316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
9326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString());
9336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
9346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
9356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_live_sp->GetValue().GetValueAddressType() != lldb::eAddressTypeLoad)
9376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
9386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString());
9396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
9406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
9416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
94297678d17ac9bcb66f7092178109271991ab16533Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry ||
94397678d17ac9bcb66f7092178109271991ab16533Sean Callanan                var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
9446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
9456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
9466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
9486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
9496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Read the contents of the spare memory area
9516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (log)
9536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    log->Printf("Read");
9546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->ValueUpdated ();
9566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
9576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
9586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
9596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
9606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
9616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry;
9636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
9646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation &&
9666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget))
9676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
9686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (m_keep_result_in_memory)
9696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
9706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
9716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
9726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                else
9736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
9746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
9756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    if (!err.Success())
9776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    {
9786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString());
9796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        return false;
9806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    }
9816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
9826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
9836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
9846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else
985a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
9866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
987a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
988a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
989a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
990a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
991a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
9926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (log)
9936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags);
9946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation)
9966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
9976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Allocate a spare memory area to store the persistent variable's contents.
9986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
9996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error allocate_error;
10006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            mem = exe_ctx.process->AllocateMemory(pvar_byte_size,
10026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  lldb::ePermissionsReadable | lldb::ePermissionsWritable,
10036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                  allocate_error);
10046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (mem == LLDB_INVALID_ADDRESS)
10066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString());
10086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
10096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
10126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem);
10136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Put the location of the spare memory into the live data of the ValueObject.
10156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_live_sp.reset(new lldb_private::ValueObjectConstResult(var_sp->GetTypeFromUser().GetASTContext(),
10176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                             var_sp->GetTypeFromUser().GetOpaqueQualType(),
10186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                             var_sp->GetName(),
10196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                             mem,
10206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                             lldb::eAddressTypeLoad,
10216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                             pvar_byte_size));
10226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Clear the flag if the variable will never be deallocated.
10246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)
10266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation;
10276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Write the contents of the variable to the area.
10296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size)
10316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
10336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
10346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
10366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) ||
10386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated)
10396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        {
10406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong();
10416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            // Now write the location of the area into the struct.
10436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            Error write_error;
10456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
10466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            {
10476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString());
10486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                return false;
10496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            }
10506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (log)
10526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem);
10536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        }
10546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        else if (!var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)
1055a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
10566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported.");
1057a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
1058a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
1059a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
1060a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1061a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
1062a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1063a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1064f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
10658de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
10668de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
10678de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
10688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
10698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
10706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    ClangExpressionVariableSP &expr_var,
10718de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
10728de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
10738de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1074f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
1075e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1076f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
107717c6a05cb96f7110332342326a90692d9505982eSean Callanan    if (!exe_ctx.frame || !exe_ctx.process)
1078cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
1079cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
10806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    // Vital information about the value
10816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    const ConstString &name(expr_var->GetName());
10836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromUser type(expr_var->GetTypeFromUser());
10846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
10853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type);
1086f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1087f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!var)
1088f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
10898de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
1090f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1091f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1092f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1093841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
10948de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
1095f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1096f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
1097f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                       var,
1098aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
1099f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1100f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
1101f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
11028de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
1103f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
1104f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
110517c6a05cb96f7110332342326a90692d9505982eSean Callanan
110617c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
1107f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
11086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
11096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8);
111017c6a05cb96f7110332342326a90692d9505982eSean Callanan
111117c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
111217c6a05cb96f7110332342326a90692d9505982eSean Callanan
111317c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
1114f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
111517c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
1116f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
111717c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
111817c6a05cb96f7110332342326a90692d9505982eSean Callanan
111917c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
112017c6a05cb96f7110332342326a90692d9505982eSean Callanan
11218de27c761a22187ef63fb60000894be163e7285fGreg Clayton            err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
112217c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
1123f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
112417c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
112517c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
1126f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
11276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            if (!dematerialize)
112817c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
11296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
11306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error error;
11326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!WriteAddressInto(exe_ctx,
11346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                      addr,
11356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                      value_addr,
11366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                      error))
11376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
11396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
11406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
114117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1142f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
114317c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
114417c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
1145f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
11466916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
114717c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
114817c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
114917c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
115017c6a05cb96f7110332342326a90692d9505982eSean Callanan
11518de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
115217c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
115317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
115417c6a05cb96f7110332342326a90692d9505982eSean Callanan
11556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan            lldb::addr_t mem; // The address of a spare memory area aused to hold the variable.
11566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
115717c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::RegisterInfo *register_info = location_value->GetRegisterInfo();
115817c6a05cb96f7110332342326a90692d9505982eSean Callanan
115917c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (!register_info)
116017c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
11618de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
116217c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
116317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
116417c6a05cb96f7110332342326a90692d9505982eSean Callanan
116517c6a05cb96f7110332342326a90692d9505982eSean Callanan            RegisterContext *register_context = exe_ctx.GetRegisterContext();
116617c6a05cb96f7110332342326a90692d9505982eSean Callanan
116717c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (!register_context)
116817c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
11698de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name);
117017c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
117117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
117217c6a05cb96f7110332342326a90692d9505982eSean Callanan
117317c6a05cb96f7110332342326a90692d9505982eSean Callanan            uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
117417c6a05cb96f7110332342326a90692d9505982eSean Callanan            uint32_t register_byte_size = register_info->byte_size;
117517c6a05cb96f7110332342326a90692d9505982eSean Callanan
117617c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
117717c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
11786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Get the location of the spare memory area out of the variable's live data.
11796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!expr_var->m_live_sp)
11816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString());
11836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
11846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
11856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (expr_var->m_live_sp->GetValue().GetValueAddressType() != lldb::eAddressTypeLoad)
11876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
11886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString());
11896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
11906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
11916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
11926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = expr_var->m_live_sp->GetValue().GetScalar().ULongLong();
11936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
119417c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Moving from addr into a register
119517c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
119617c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 1: addr_byte_size and register_byte_size are the same
119717c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
119817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Address contents
119917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
120017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
120117c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 2: addr_byte_size is bigger than register_byte_size
120217c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
120317c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   Error!  (The register should always be big enough to hold the data)
120417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
120517c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 3: register_byte_size is bigger than addr_byte_size
120617c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
120717c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB| Address contents
120817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB0000| Register contents [on little-endian hardware]
120917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |0000AABB| Register contents [on big-endian hardware]
121017c6a05cb96f7110332342326a90692d9505982eSean Callanan
12116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
121217c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
12138de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
121417c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
121517c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
121617c6a05cb96f7110332342326a90692d9505982eSean Callanan
121717c6a05cb96f7110332342326a90692d9505982eSean Callanan                uint32_t register_offset;
121817c6a05cb96f7110332342326a90692d9505982eSean Callanan
121917c6a05cb96f7110332342326a90692d9505982eSean Callanan                switch (exe_ctx.process->GetByteOrder())
122017c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
122117c6a05cb96f7110332342326a90692d9505982eSean Callanan                default:
12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
122317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
122417c6a05cb96f7110332342326a90692d9505982eSean Callanan                case lldb::eByteOrderLittle:
122517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    register_offset = 0;
122617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    break;
122717c6a05cb96f7110332342326a90692d9505982eSean Callanan                case lldb::eByteOrderBig:
12286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    register_offset = register_byte_size - value_byte_size;
122917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    break;
123017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
123117c6a05cb96f7110332342326a90692d9505982eSean Callanan
123217c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataBufferHeap register_data (register_byte_size, 0);
123317c6a05cb96f7110332342326a90692d9505982eSean Callanan
123417c6a05cb96f7110332342326a90692d9505982eSean Callanan                Error error;
12356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (exe_ctx.process->ReadMemory (mem, register_data.GetBytes() + register_offset, value_byte_size, error) != value_byte_size)
123617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
12378de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
123817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
123917c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
124017c6a05cb96f7110332342326a90692d9505982eSean Callanan
124117c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
124217c6a05cb96f7110332342326a90692d9505982eSean Callanan
124317c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0))
124417c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
12458de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
124617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
124717c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
12486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Deallocate the spare area and clear the variable's live data.
12506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error deallocate_error = exe_ctx.process->DeallocateMemory(mem);
12526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!deallocate_error.Success())
12546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
12556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't deallocate spare memory area for %s: %s", name.GetCString(), deallocate_error.AsCString());
12566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
12576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
12586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset();
126017c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
126117c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
126217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
12636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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
12646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // struct.
12656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error allocate_error;
12676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                mem = exe_ctx.process->AllocateMemory(value_byte_size,
12696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                      lldb::ePermissionsReadable | lldb::ePermissionsWritable,
12706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                      allocate_error);
12716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (mem == LLDB_INVALID_ADDRESS)
12736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
12746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", name.GetCString(), allocate_error.AsCString());
12756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
12766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
12776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Put the location of the spare memory into the live data of the ValueObject.
12796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                expr_var->m_live_sp.reset(new lldb_private::ValueObjectConstResult(type.GetASTContext(),
12816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                   type.GetOpaqueQualType(),
12826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                   name,
12836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                   mem,
12846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                   lldb::eAddressTypeLoad,
12856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                                                                                   value_byte_size));
12866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                // Now write the location of the area into the struct.
12886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
12896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                Error write_error;
12906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (!WriteAddressInto(exe_ctx, addr, mem, write_error))
12916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                {
12926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), write_error.AsCString());
12936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    return false;
12946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                }
12956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
129617c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Moving from a register into addr
129717c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
129817c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 1: addr_byte_size and register_byte_size are the same
129917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
130017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
130117c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Address contents
130217c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
130317c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 2: addr_byte_size is bigger than register_byte_size
130417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
130517c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   Error!  (The register should always be big enough to hold the data)
130617c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
130717c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 3: register_byte_size is bigger than addr_byte_size
130817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
130917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
131017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB|     Address contents on little-endian hardware
131117c6a05cb96f7110332342326a90692d9505982eSean Callanan                //       |CCDD| Address contents on big-endian hardware
131217c6a05cb96f7110332342326a90692d9505982eSean Callanan
13136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (value_byte_size > register_byte_size)
131417c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
13158de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
131617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
131717c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
131817c6a05cb96f7110332342326a90692d9505982eSean Callanan
131917c6a05cb96f7110332342326a90692d9505982eSean Callanan                uint32_t register_offset;
132017c6a05cb96f7110332342326a90692d9505982eSean Callanan
132117c6a05cb96f7110332342326a90692d9505982eSean Callanan                switch (exe_ctx.process->GetByteOrder())
132217c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
132317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    default:
13248de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
132517c6a05cb96f7110332342326a90692d9505982eSean Callanan                        return false;
132617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    case lldb::eByteOrderLittle:
132717c6a05cb96f7110332342326a90692d9505982eSean Callanan                        register_offset = 0;
132817c6a05cb96f7110332342326a90692d9505982eSean Callanan                        break;
132917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    case lldb::eByteOrderBig:
13306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                        register_offset = register_byte_size - value_byte_size;
133117c6a05cb96f7110332342326a90692d9505982eSean Callanan                        break;
133217c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
133317c6a05cb96f7110332342326a90692d9505982eSean Callanan
133417c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataExtractor register_extractor;
133517c6a05cb96f7110332342326a90692d9505982eSean Callanan
133617c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_context->ReadRegisterBytes(register_number, register_extractor))
133717c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
13388de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
133917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
134017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
134117c6a05cb96f7110332342326a90692d9505982eSean Callanan
13426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                const void *register_data = register_extractor.GetData(&register_offset, value_byte_size);
134317c6a05cb96f7110332342326a90692d9505982eSean Callanan
134417c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_data)
134517c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
13468de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name);
134717c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
134817c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
134917c6a05cb96f7110332342326a90692d9505982eSean Callanan
13506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                if (exe_ctx.process->WriteMemory (mem, register_data, value_byte_size, write_error) != value_byte_size)
135117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
13526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString());
135317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
135417c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
135517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
1356f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
1357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1358f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1359f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
1360810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
1361810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
13621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
13631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
13641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
13651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
13661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
13671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
13681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    const lldb::RegisterInfo &reg_info,
13691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
13701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
13711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
13721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
13731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB];
13741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
13751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error error;
13771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
13791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
13801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        DataBufferHeap register_data (register_byte_size, 0);
13811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        Error error;
13831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, error) != register_byte_size)
13841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
13851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, error.AsCString());
13861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
13871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
13881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
13901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0))
13921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
13931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
13941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
13951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
13961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
13971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
13981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
13991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        DataExtractor register_extractor;
14001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
14011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor))
14021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
14031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
14041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
14051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
14061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
14071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        uint32_t register_offset = 0;
14081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
14091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const void *register_data = register_extractor.GetData(&register_offset, register_byte_size);
14101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
14111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (!register_data)
14121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
14131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name);
14141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
14151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
14161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
14171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        Error error;
14181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size)
14191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
14201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
14211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
14221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
14231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
14241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
14251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
14261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
14271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1428cc0746247880e9c87711031ce8a535544f4499d7Sean CallananVariable *
14298de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
14308de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
14318de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
14328de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
14338de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
14348de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1435aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1436e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1437cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1438cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    VariableList *var_list = frame.GetVariableList(true);
1439cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1440bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (!var_list)
1441bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        return NULL;
1442bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
14433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    lldb::VariableSP var_sp (var_list->FindVariable(name));
14443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
14453bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const bool append = true;
14463bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const uint32_t max_matches = 1;
14473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (!var_sp)
1448cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
14493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        // Look for globals elsewhere in the module for the frame
1450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
14513bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (module_sp)
14523bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
14533bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            VariableList module_globals;
14543bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
14553bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                var_sp = module_globals.GetVariableAtIndex (0);
14563bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
1457cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
14583bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
14593bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (!var_sp)
1460cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
14613bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        // Look for globals elsewhere in the program (all images)
1462aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
14633bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (target_sp)
14643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
14653bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            VariableList program_globals;
14663bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
14673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                var_sp = program_globals.GetVariableAtIndex (0);
14683bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
1469cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
14703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
14713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
14723bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
14733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
14743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
14753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangType()))
14763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                return NULL;
14773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
14783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
14793bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
14803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
14813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
14823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            return NULL;
14833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
14843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
14853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
14863bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    return var_sp.get();
1487cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
1488336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1491e5748d889fb7fb97b3ff07444894d7714776b609Greg ClaytonClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1493aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1494aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1495aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1496e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
14973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1498810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
14998de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("Hunting for a definition for '%s'", name.GetCString());
150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Back out in all cases where we're not fully initialized
1502aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_exe_ctx->frame == NULL)
150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
1504ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1505aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_ignore_lookups)
1506ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
1507ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
1508ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
1509ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
1510ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
15113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1512e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15143bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
15153bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
15163bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
15173bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
15183bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
15198de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
15208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
15213bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr[0] != '$')
15220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
1523aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
15248de27c761a22187ef63fb60000894be163e7285fGreg Clayton
15258de27c761a22187ef63fb60000894be163e7285fGreg Clayton        // If we found a variable in scope, no need to pull up function names
15268de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (var != NULL)
152792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
15288de27c761a22187ef63fb60000894be163e7285fGreg Clayton            AddOneVariable(context, var);
152992aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
15308de27c761a22187ef63fb60000894be163e7285fGreg Clayton        else
153192aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
1532aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_parser_vars->m_sym_ctx.FindFunctionsByName (name, false, sc_list);
15338de27c761a22187ef63fb60000894be163e7285fGreg Clayton
15348de27c761a22187ef63fb60000894be163e7285fGreg Clayton            bool found_specific = false;
15358de27c761a22187ef63fb60000894be163e7285fGreg Clayton            Symbol *generic_symbol = NULL;
15368de27c761a22187ef63fb60000894be163e7285fGreg Clayton            Symbol *non_extern_symbol = NULL;
15378de27c761a22187ef63fb60000894be163e7285fGreg Clayton
1538e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton            for (uint32_t index = 0, num_indices = sc_list.GetSize();
15398de27c761a22187ef63fb60000894be163e7285fGreg Clayton                 index < num_indices;
15408de27c761a22187ef63fb60000894be163e7285fGreg Clayton                 ++index)
15418de27c761a22187ef63fb60000894be163e7285fGreg Clayton            {
15428de27c761a22187ef63fb60000894be163e7285fGreg Clayton                SymbolContext sym_ctx;
1543e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton                sc_list.GetContextAtIndex(index, sym_ctx);
15448de27c761a22187ef63fb60000894be163e7285fGreg Clayton
15458de27c761a22187ef63fb60000894be163e7285fGreg Clayton                if (sym_ctx.function)
15468de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
15478de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    // TODO only do this if it's a C function; C++ functions may be
15488de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    // overloaded
15498de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    if (!found_specific)
15508de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        AddOneFunction(context, sym_ctx.function, NULL);
15518de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    found_specific = true;
15528de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
15538de27c761a22187ef63fb60000894be163e7285fGreg Clayton                else if (sym_ctx.symbol)
15548de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
15558de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    if (sym_ctx.symbol->IsExternal())
15568de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        generic_symbol = sym_ctx.symbol;
15578de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    else
15588de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        non_extern_symbol = sym_ctx.symbol;
15598de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
15608de27c761a22187ef63fb60000894be163e7285fGreg Clayton            }
15618de27c761a22187ef63fb60000894be163e7285fGreg Clayton
15628de27c761a22187ef63fb60000894be163e7285fGreg Clayton            if (!found_specific)
15638de27c761a22187ef63fb60000894be163e7285fGreg Clayton            {
15648de27c761a22187ef63fb60000894be163e7285fGreg Clayton                if (generic_symbol)
15658de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    AddOneFunction(context, NULL, generic_symbol);
15668de27c761a22187ef63fb60000894be163e7285fGreg Clayton                else if (non_extern_symbol)
15678de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    AddOneFunction(context, NULL, non_extern_symbol);
15688de27c761a22187ef63fb60000894be163e7285fGreg Clayton            }
15696916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
1570aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
15716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (namespace_decl)
15726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            {
15739ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
15749ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                if (clang_namespace_decl)
15759ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                    clang_namespace_decl->setHasExternalLexicalStorage();
15766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            }
157792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
15780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
15798de27c761a22187ef63fb60000894be163e7285fGreg Clayton    else
15803cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
158157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
158257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
158357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
158457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
158557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
1586aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
158757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
158857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
158957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
159057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
159157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
159257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
159357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_var)
159457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
159557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
159657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
159757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
159857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
159957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
160057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
16012403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            if (log)
16022403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
16032403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString ("Type for \"this\" is: ");
16042403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
16052403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
16062403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
16072403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
16082403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
160957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            TypeFromUser this_user_type(this_type->GetClangType(),
161057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
161157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
1612aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
161357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
161457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            void *pointer_target_type;
161557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
161657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
161757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
161857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
161957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
162057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            TypeFromUser class_user_type(pointer_target_type,
162157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
162257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
16233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
16243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
16253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
16263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
16273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
16283aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
16293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
16303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
163157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            AddOneType(context, class_user_type, true);
163257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
163357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
163457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
163557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
16363aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
16373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
16383aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
16393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
16403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16413aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
16423aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
16443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
16453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16463aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
16473aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16483aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_var)
16493aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
16503aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16513aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
16523aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16533aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
16543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
16553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16563aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser self_user_type(self_type->GetClangType(),
16573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
16583aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16593aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
16603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16613aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            void *pointer_target_type;
16623aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16633aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
16643aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                                &pointer_target_type))
16653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
16663aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
16683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
16693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
16713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
16723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
16733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
16743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
16753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
16763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
16773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            AddOneType(context, class_user_type, false);
16793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
16803aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
16813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
1682427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1683427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
16843cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan
1685427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
16861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1687427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            AddOneVariable(context, pvar_sp);
16881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
16891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
16901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
16911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
16921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1693aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
16941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1695aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            const lldb::RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
16961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
16971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
16981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                AddOneRegister(context, reg_info);
16991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
17008de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
1701a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1702aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
17036df0840c87be29724055716db951aa6d494ddabcSean Callanan
1704ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    if (type_sp)
1705ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
1706ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
17076df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
1708ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1709ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            StreamString strm;
1710ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            type_sp->Dump(&strm, true);
1711ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->PutCString (strm.GetData());
1712ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        }
17132403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
1714ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        TypeFromUser user_type(type_sp->GetClangType(),
17152403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                                   type_sp->GetClangAST());
17166df0840c87be29724055716db951aa6d494ddabcSean Callanan
1717ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        AddOneType(context, user_type, false);
17186df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1720336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1721336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
17228de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
17238de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
17248de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
17258de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Variable *var,
17268de27c761a22187ef63fb60000894be163e7285fGreg Clayton    clang::ASTContext *parser_ast_context,
17278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
17288de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
17298de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1731e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
17326184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1737810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1738810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
1739336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1742462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    void *var_opaque_type = var_type->GetClangType();
174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1746810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1747810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
1748336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TypeList *type_list = var_type->GetTypeList();
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!type_list)
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1755810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1756810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because the type has no associated type list");
1757336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext();
176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!exe_ast_ctx)
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1764810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1765810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
1766336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1769336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
1770336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1773178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1774178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
1775178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
1776178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
1777178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
1778178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
1779eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
1780178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17838e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1785810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1786810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
1787336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1790810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext();
1791810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1792336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    void *type_to_use;
1793336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1794f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
1795f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1796ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        type_to_use = GuardedCopyType(parser_ast_context, var_ast_context, var_opaque_type);
1797f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
17984b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
17994b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
18004b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
18014b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
18024b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
18034b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
18044b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
18054b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
1806f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
1807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1808f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1809336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
1810336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
18136916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
1819336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
1821336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
1826336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
1827336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1830aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->GetScalar() = load_addr;
183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->SetValueType(Value::eValueTypeLoadAddress);
183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1836f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
1837f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        *user_type = TypeFromUser(var_opaque_type, var_ast_context);
1838336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1839336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
1840336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
1841336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1842336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
1843336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
18443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                       Variable* var)
1845336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
1846aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1847aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1848e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1849336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1850f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
1851f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
1852336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1853aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
18548de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
18558de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
18568de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
18578de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
1858336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
18594b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
18604b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
18614b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
18626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType()));
18638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
1864427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
1865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (entity_name,
1866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      ut,
1867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
1870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
1871427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = pt;
1872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
1873427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
1874427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = var_location;
187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1876810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
18778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
1878a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
1879a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1880a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
1881a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
1882a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
1883a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
18848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
18858f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
18868f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
18878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
1888a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
1889427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                       ClangExpressionVariableSP &pvar_sp)
1890a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
1891e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
189245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
1894a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1895427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(),
1896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetASTContext(),
1897427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                user_type.GetOpaqueQualType()),
1898427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
1899a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
19006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType()));
19018c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1902427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->EnableParserVars();
1903427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_parser_type = parser_type;
1904427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_named_decl  = var_decl;
1905427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_llvm_value  = NULL;
1906427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    pvar_sp->m_parser_vars->m_lldb_value  = NULL;
190745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
190845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
1909a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
1910a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
1911a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1912a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
1913a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
1914a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
1915427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str());
1916a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
1917a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1918a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
19191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
1920427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
1921427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                        const RegisterInfo *reg_info)
19221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
19231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
19241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
19261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
19271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
19281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
19301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
19311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
19321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
19331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
19341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1935427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromParser parser_type (ast_type,
1936427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                context.GetASTContext());
19371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
19391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1940427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->process->GetByteOrder(),
1941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
1942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
19431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
1944427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
1945427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
1946427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
1947427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_parser_type = parser_type;
1948427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = var_decl;
1949427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
1950427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = NULL;
19511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (log)
19531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
19541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        std::string var_decl_print_string;
19551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
19561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl->print(var_decl_print_stream);
19571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl_print_stream.flush();
19581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
19601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
19611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
19621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
19636916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::NamespaceDecl *
19646916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
19656916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
19666916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
19676916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
19686916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
19696916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(),
19706916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                                                          namespace_decl.GetASTContext(),
19716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                                                          namespace_decl.GetNamespaceDecl());
19726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
19736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return dyn_cast<clang::NamespaceDecl>(copied_decl);
19746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
19756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
1976a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
19778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
19780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Function* fun,
19790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Symbol* symbol)
19808f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
1981aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1982aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1983e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
19848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
19850fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    NamedDecl *fun_decl;
19860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
19870fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    const Address *fun_address;
19888f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
19890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
19900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
19910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    clang::ASTContext *fun_ast_context = NULL;
19928f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
19930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
19940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
19950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
19960fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
19970fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
19980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
19990fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
20000fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no type");
20010fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
20020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
20030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
2004462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        fun_opaque_type = fun_type->GetClangType();
20050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
20060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
20070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
20080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
20090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no Clang type");
20100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
20110fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
20120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
20130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
20140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
20150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        TypeList *type_list = fun_type->GetTypeList();
20160fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_ast_context = type_list->GetClangASTContext().getASTContext();
2017ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
20180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
20190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
20200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
20210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
20220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
20230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
20240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
20250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
20260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
20270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
20288f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
2029810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
20300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            log->PutCString("AddOneFunction called with no function and no symbol");
20318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
20328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
20338f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
2034aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target);
20358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
20368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
20378f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
2038427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->process->GetByteOrder(),
2039427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                                                                      m_parser_vars->m_exe_ctx->process->GetAddressByteSize()));
2040427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
20418de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
2042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName(ConstString(decl_name.c_str()));
2043427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangType (fun_opaque_type);
2044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetClangAST (fun_ast_context);
2045427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
2046427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->EnableParserVars();
2047427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_named_decl  = fun_decl;
2048427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_llvm_value  = NULL;
2049427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->m_parser_vars->m_lldb_value  = fun_location.release();
20508c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2051810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
20528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
2053a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string fun_decl_print_string;
2054a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
2055a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl->print(fun_decl_print_stream);
2056a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl_print_stream.flush();
2057a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
2058a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
20598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
206193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
206293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
206393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
20643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
20653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
206693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
20673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *parser_ast_context = context.GetASTContext();
20683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *user_ast_context = ut.GetASTContext();
20693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
2070ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
20713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
20723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
207393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
20743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
20753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
20763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
20773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
20783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
20793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
20803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
20813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
20823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
20833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
20843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
20853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
208630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
20871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
20881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
20891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
209030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
209130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
20921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
20931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
20948de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
20951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
20961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
20971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
20981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
209930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
210030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
21013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
210293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
210393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
210493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
2105ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2106ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid *
2107ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
2108ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         ASTContext *source_context,
2109ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         void *clang_type)
2110ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{
2111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
2112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
2113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = true;
2114ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2115ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *ret = ClangASTContext::CopyType (dest_context,
2116ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                           source_context,
2117ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                           clang_type);
2118ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = false;
2120ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
2121ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    return ret;
2122ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan}
2123