ClangExpressionDeclMap.cpp revision 3aa7da5cb3327792415de44405e0896c6bdc305b
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"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
24a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
266916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
35f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
36810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
3717c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
39f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4078b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
41a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
433bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap () :
488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
498de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
50aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
51aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars ()
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
57aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
58aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
61aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx)
638c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
65aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_exe_ctx = &exe_ctx;
6645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
67aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (exe_ctx.frame)
68aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything);
6978b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    else if (exe_ctx.thread)
7078b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
7178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham
72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (exe_ctx.process)
73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars->m_persistent_vars = &exe_ctx.process->GetPersistentVariables();
74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
75c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid ClangExpressionDeclMap::DidParse()
77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
78aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
79aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
80aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        for (uint64_t entity_index = 0, num_entities = m_found_entities.Size();
81aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
82aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
83aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
84aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(entity_index));
85aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            if (entity.m_parser_vars.get() &&
86aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                entity.m_parser_vars->m_lldb_value)
87aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                delete entity.m_parser_vars->m_lldb_value;
88aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
89aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            entity.DisableParserVars();
90aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
91aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
92aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        for (uint64_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->Size();
93aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
94aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
95aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
96aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            ClangExpressionVariable &pvar(m_parser_vars->m_persistent_vars->VariableAtIndex(pvar_index));
97aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            pvar.DisableParserVars();
98aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
99aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
100aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1017a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1068de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1078de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
10882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_result_name)
113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_parser_vars->m_persistent_vars->GetNextResultName(m_struct_vars->m_result_name);
114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    return m_struct_vars->m_result_name;
11682b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
11782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1198de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
1208de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
1228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
1238de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser parser_type
1248de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
125a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
129a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
130a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
13182b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
13282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
133a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                            context);
134a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name, user_type))
1368c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1378c12720c108cd5e7ed792596749218d8400f647eSean Callanan
138aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ClangExpressionVariable *var = m_parser_vars->m_persistent_vars->GetVariable(name);
1398c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1408c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
1418c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1428c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1438c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->EnableParserVars();
1448c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1458c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_named_decl = decl;
1468c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_parser_type = parser_type;
1478c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1488c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
149a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
150a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
151a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
1528de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
1538de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
1558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
1568de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
1578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
1588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
1598de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
161aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
162aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
163aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
164e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
16545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
166aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
1678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1688c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
1698c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
1708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1718c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *var = m_found_entities.GetVariable(decl);
1728c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1738c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        var = m_parser_vars->m_persistent_vars->GetVariable(decl);
1758c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1768c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
1778c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1788c12720c108cd5e7ed792596749218d8400f647eSean Callanan
17945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
18045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
18145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
1828de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
1838de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    var->m_name.GetCString());
18445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1858c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
1868c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
1878c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_llvm_value = value;
1888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1898c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->EnableJITVars();
1908c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_jit_vars->m_alignment = alignment;
1918c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_jit_vars->m_size = size;
1928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1938c12720c108cd5e7ed792596749218d8400f647eSean Callanan    m_struct_members.AddVariable(*var);
1948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
1968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
1978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
2008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
201aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
202aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
203aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
2048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
2058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
2078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
208aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_alignment = 0;
209aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = 0;
2108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2118c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
2128c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
2138c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
2148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
2158c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member(m_struct_members.VariableAtIndex(member_index));
2168c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2178c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (!member.m_jit_vars.get())
2188c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
2198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2208c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
221aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_struct_alignment = member.m_jit_vars->m_alignment;
2228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2238c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (cursor % member.m_jit_vars->m_alignment)
2248c12720c108cd5e7ed792596749218d8400f647eSean Callanan            cursor += (member.m_jit_vars->m_alignment - (cursor % member.m_jit_vars->m_alignment));
2258c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2268c12720c108cd5e7ed792596749218d8400f647eSean Callanan        member.m_jit_vars->m_offset = cursor;
2278c12720c108cd5e7ed792596749218d8400f647eSean Callanan        cursor += member.m_jit_vars->m_size;
2288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
2298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
230aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_size = cursor;
2318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
232aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
2338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
2348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
2358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2368de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
2378de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2388de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
2398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
2408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
2418de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
243aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
244aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
245aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
2468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2488c12720c108cd5e7ed792596749218d8400f647eSean Callanan    num_elements = m_struct_members.Size();
249aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
250aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
2518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
2538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
2548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
2568de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
2578de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *&decl,
2598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
2608de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
2618de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
2628de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
2638de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
265aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
266aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
267aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
2688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (index >= m_struct_members.Size())
2718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2738c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &member(m_struct_members.VariableAtIndex(index));
2748c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2758c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!member.m_parser_vars.get() ||
2768c12720c108cd5e7ed792596749218d8400f647eSean Callanan        !member.m_jit_vars.get())
2778c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
2788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2798c12720c108cd5e7ed792596749218d8400f647eSean Callanan    decl = member.m_parser_vars->m_named_decl;
2808c12720c108cd5e7ed792596749218d8400f647eSean Callanan    value = member.m_parser_vars->m_llvm_value;
2818c12720c108cd5e7ed792596749218d8400f647eSean Callanan    offset = member.m_jit_vars->m_offset;
2828de27c761a22187ef63fb60000894be163e7285fGreg Clayton    name = member.m_name;
2838c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
2858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
2868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
28702fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
2888de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
2898de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2908de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
2918de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value**& value,
2928de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
2938de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
294ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
2958c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *entity = m_found_entities.GetVariable(decl);
2968c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2978c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!entity)
2988c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
299ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
3008c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
3018c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
302ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
3038c12720c108cd5e7ed792596749218d8400f647eSean Callanan    value = &entity->m_parser_vars->m_llvm_value;
3048c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ptr = entity->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
3058c12720c108cd5e7ed792596749218d8400f647eSean Callanan
3068c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
307ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
308ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
309f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
3108de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
3118de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3128de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
3138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
3148de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
315f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
316aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
317aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
318f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
31978b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (m_parser_vars->m_exe_ctx->target == NULL)
32078b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
32178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
322f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
323f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
324e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
325f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
326aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_sym_ctx.FindFunctionsByName(name, false, sc_list);
327f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
328e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
329f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
330f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
331f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
332e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
333f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
334f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    const Address *fun_address;
335f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
336f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
337f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
338f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
339f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
340f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
341f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
342f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
343aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target);
344f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
345f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
346f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
347f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
348810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
349f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
350f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
3518de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
3528de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
353aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
3548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
3558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
3568de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
358aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableMaterialVars();
359aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
360aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_process = exe_ctx.process;
361aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
362f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool result = DoMaterialize(false, exe_ctx, NULL, err);
363f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
364f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
365aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        struct_address = m_material_vars->m_materialized_location;
366f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
369f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
370f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
3718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
3728de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
3743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    ConstString &object_name,
375aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
3768de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
3778de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
3783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
379aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
380aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
381aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process)
3823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
3843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
387aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType())
3883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
3903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan    Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame, object_name, &m_struct_vars->m_object_pointer_type);
3943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
3963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString());
3983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
4003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
401aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
4023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
403aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
4043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
4063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
4073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString());
4083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
4093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
4103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (location_value->GetValueType() == Value::eValueTypeLoadAddress)
4123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
4133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
414aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize();
415aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder();
4163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
417aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(),
418aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                               m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
4193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
4203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString());
4213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
4223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
4233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        DataBufferHeap data;
4253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        data.SetByteSize(address_byte_size);
4263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        Error read_error;
4273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
428aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
4293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
4303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString());
4313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
4323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
4333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
4353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        uint32_t offset = 0;
4373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        object_ptr = extractor.GetPointer(&offset);
4393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return true;
4413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
4423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    else
4433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
4443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString());
4453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
4463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
4473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
4483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4493c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
4508de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
4518de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
452aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
4538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ClangExpressionVariable *&result,
4548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
4558de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
456f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
45782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan    return DoMaterialize(true, exe_ctx, &result, err);
458aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
459aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DidDematerialize();
460aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
461aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
462aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid
463aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize()
464aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
465aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars.get())
466aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
467aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
468aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
469aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            //#define SINGLE_STEP_EXPRESSIONS
470aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
471aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS
472aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location);
473aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif
474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
476aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
477aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableMaterialVars();
478aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    }
479f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
480f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
48132824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
4828de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
4838de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
484aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
4858de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
4868de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
4878de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
48832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
489aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
490aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_material_vars.get());
491aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
492aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
49332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
49432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
49532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
49632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
49732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
498aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.process)
49932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
50032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
50132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
50232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
50332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
504aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.target)
50532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
50632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
50732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
50832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
50932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
5103371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    if (!m_material_vars->m_materialized_location)
5113371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    {
5123371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        err.SetErrorString("No materialized location");
5133371102ecdff827087df3c27549e57760a6bbc97Sean Callanan        return false;
5143371102ecdff827087df3c27549e57760a6bbc97Sean Callanan    }
5153371102ecdff827087df3c27549e57760a6bbc97Sean Callanan
516aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0));
51732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
51832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
519aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize())
52032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
52132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
52232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
52332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
52432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
525aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize());
52632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
5278c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
5288c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5298c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
53032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
5318c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member (m_struct_members.VariableAtIndex(member_index));
53232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
5338de27c761a22187ef63fb60000894be163e7285fGreg Clayton        s.Printf("[%s]\n", member.m_name.GetCString());
5348c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (!member.m_jit_vars.get())
5368c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
5378c12720c108cd5e7ed792596749218d8400f647eSean Callanan
538aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        extractor.Dump(&s,                                                                      // stream
539aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                       member.m_jit_vars->m_offset,                                             // offset
540aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                       lldb::eFormatBytesWithASCII,                                             // format
541aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                       1,                                                                       // byte size of individual entries
542aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                       member.m_jit_vars->m_size,                                               // number of entries
543aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                       16,                                                                      // entries per line
544aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                       m_material_vars->m_materialized_location + member.m_jit_vars->m_offset,  // address to print
545aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                       0,                                                                       // bit size (bitfields only; 0 means ignore)
546aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                       0);                                                                      // bit alignment (bitfields only; 0 means ignore)
54732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
54832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
54932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
55032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
55132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
55232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
55332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
554f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
5558de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
5568de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
558aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ExecutionContext &exe_ctx,
5598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ClangExpressionVariable **result,
5608de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
5618de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
562810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
563aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
565e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
56682b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
567aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
568810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
569810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
570810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
571810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
572810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
573aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!exe_ctx.frame)
57445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
57545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
57645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        return LLDB_INVALID_ADDRESS;
57745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
57845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
579aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ClangPersistentVariables &persistent_vars = exe_ctx.process->GetPersistentVariables();
580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_size)
582e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
583e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
584e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
585e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
586aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = NULL;
587e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
588e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
589e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
590e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
591aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything));
592810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
593f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
594f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
595aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_material_vars->m_materialized_location)
596f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
597aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location);
598aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_material_vars->m_materialized_location = 0;
599f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
600810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
6017a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
6027a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
6037a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
604aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size,
605aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           lldb::ePermissionsReadable | lldb::ePermissionsWritable,
606aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                           err);
607f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
608f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
609f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
610f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
611aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        m_material_vars->m_allocated_area = mem;
612f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
613810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
614aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_material_vars->m_materialized_location = m_material_vars->m_allocated_area;
615810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
616aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)
617aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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));
618810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
6198c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
6208c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
6218c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
622810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
6238c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member (m_struct_members.VariableAtIndex(member_index));
6248c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6254d0b110715d321d366dec1dc690300f713b63236Sean Callanan        ClangExpressionVariable *entity = NULL;
6264d0b110715d321d366dec1dc690300f713b63236Sean Callanan
627aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        /*
6284d0b110715d321d366dec1dc690300f713b63236Sean Callanan        if (member.m_parser_vars.get())
6294d0b110715d321d366dec1dc690300f713b63236Sean Callanan            entity = m_found_entities.GetVariable(member.m_parser_vars->m_named_decl);
630aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        */
631810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
632aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        entity = m_found_entities.GetVariable(member.m_name);
633aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
634aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ClangExpressionVariable *persistent_variable = persistent_vars.GetVariable(member.m_name);
6358c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6368c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (entity)
637336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
6381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (entity->m_register_info)
6391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
6401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                // This is a register variable
6411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
642aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                RegisterContext *reg_ctx = exe_ctx.GetRegisterContext();
6431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
6441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!reg_ctx)
6451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
6461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                if (!DoMaterializeOneRegister(dematerialize, exe_ctx, *reg_ctx, *entity->m_register_info, m_material_vars->m_materialized_location + member.m_jit_vars->m_offset, err))
6481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
6491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
6501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            else
6511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            {
6521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                if (!member.m_jit_vars.get())
6531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
6541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
655aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                if (!DoMaterializeOneVariable(dematerialize, exe_ctx, sym_ctx, member.m_name, member.m_user_type, m_material_vars->m_materialized_location + member.m_jit_vars->m_offset, err))
6561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                    return false;
6571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            }
6588c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
6598c12720c108cd5e7ed792596749218d8400f647eSean Callanan        else if (persistent_variable)
6608c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
661aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            if (member.m_name == m_struct_vars->m_result_name)
66245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
66345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                if (!dematerialize)
66445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    continue;
6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan
6668c12720c108cd5e7ed792596749218d8400f647eSean Callanan                if (log)
6678c12720c108cd5e7ed792596749218d8400f647eSean Callanan                    log->PutCString("Found result member in the struct");
66845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
6698c12720c108cd5e7ed792596749218d8400f647eSean Callanan                *result = &member;
670f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
671f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
67245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            if (log)
6738de27c761a22187ef63fb60000894be163e7285fGreg Clayton                log->Printf("Searched for persistent variable %s and found %s", member.m_name.GetCString(), persistent_variable->m_name.GetCString());
67445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
675aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            if (!DoMaterializeOnePersistentVariable(dematerialize, exe_ctx, persistent_variable->m_name, m_material_vars->m_materialized_location + member.m_jit_vars->m_offset, err))
6768c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
677336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        }
6788c12720c108cd5e7ed792596749218d8400f647eSean Callanan        else
6798c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
6808de27c761a22187ef63fb60000894be163e7285fGreg Clayton            err.SetErrorStringWithFormat("Unexpected variable %s", member.m_name.GetCString());
681336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return false;
6828c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
683810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
684810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
685f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
686f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
687f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
688a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
6898de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
6908de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6918de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
6928de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
6938de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
6948de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
6958de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
6968de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
697aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
698aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ClangPersistentVariables &persistent_vars = exe_ctx.process->GetPersistentVariables();
699aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
700aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    ClangExpressionVariable *pvar(persistent_vars.GetVariable(name));
701a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
702a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (!pvar)
703a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
7048de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Undefined persistent variable %s", name.GetCString());
705a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
706a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
707a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
708a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    size_t pvar_size = pvar->Size();
709a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
71066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    if (!pvar->m_data_sp.get())
711a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
712a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
71366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint8_t *pvar_data = pvar->m_data_sp->GetBytes();
714a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
715a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
716a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
717a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
718a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        if (exe_ctx.process->ReadMemory (addr, pvar_data, pvar_size, error) != pvar_size)
719a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
720a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
721a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
722a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
723a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
724a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
725a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
726a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        if (exe_ctx.process->WriteMemory (addr, pvar_data, pvar_size, error) != pvar_size)
727a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
728a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
729a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
730a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
731a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
732a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
733a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
734a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
735a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
736f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
7378de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
7388de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
7398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
7408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
7418de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
7428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
7438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser type,
7448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
7458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
7468de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
747f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
748e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
749f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
75017c6a05cb96f7110332342326a90692d9505982eSean Callanan    if (!exe_ctx.frame || !exe_ctx.process)
751cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
752cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
7533bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type);
754f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
755f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!var)
756f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
7578de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
758f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
759f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
760f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
761841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
7628de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
763f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
764f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
765f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                       var,
766aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan                                                                       NULL));
767f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
768f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
769f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
7708de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
771f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
772f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
77317c6a05cb96f7110332342326a90692d9505982eSean Callanan
77417c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
775f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
77617c6a05cb96f7110332342326a90692d9505982eSean Callanan    size_t addr_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
77717c6a05cb96f7110332342326a90692d9505982eSean Callanan    size_t addr_byte_size = addr_bit_size % 8 ? ((addr_bit_size + 8) / 8) : (addr_bit_size / 8);
77817c6a05cb96f7110332342326a90692d9505982eSean Callanan
77917c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
78017c6a05cb96f7110332342326a90692d9505982eSean Callanan
78117c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
782f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
78317c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
784f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
78517c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
78617c6a05cb96f7110332342326a90692d9505982eSean Callanan
78717c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
78817c6a05cb96f7110332342326a90692d9505982eSean Callanan
7898de27c761a22187ef63fb60000894be163e7285fGreg Clayton            err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
79017c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
791f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
79217c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
79317c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
794f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
79517c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
79617c6a05cb96f7110332342326a90692d9505982eSean Callanan
79717c6a05cb96f7110332342326a90692d9505982eSean Callanan            DataBufferHeap data;
79817c6a05cb96f7110332342326a90692d9505982eSean Callanan            data.SetByteSize(addr_byte_size);
79917c6a05cb96f7110332342326a90692d9505982eSean Callanan
80017c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::addr_t src_addr;
80117c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::addr_t dest_addr;
80217c6a05cb96f7110332342326a90692d9505982eSean Callanan
80317c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
80417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
80517c6a05cb96f7110332342326a90692d9505982eSean Callanan                src_addr = addr;
80617c6a05cb96f7110332342326a90692d9505982eSean Callanan                dest_addr = value_addr;
80717c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
80817c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
80917c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
81017c6a05cb96f7110332342326a90692d9505982eSean Callanan                src_addr = value_addr;
81117c6a05cb96f7110332342326a90692d9505982eSean Callanan                dest_addr = addr;
81217c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
81317c6a05cb96f7110332342326a90692d9505982eSean Callanan
81417c6a05cb96f7110332342326a90692d9505982eSean Callanan            Error error;
81517c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size)
81617c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
8178de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
81817c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
81917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
82017c6a05cb96f7110332342326a90692d9505982eSean Callanan
82117c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size)
82217c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
8238de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
82417c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
82517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
82617c6a05cb96f7110332342326a90692d9505982eSean Callanan
82717c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (log)
82817c6a05cb96f7110332342326a90692d9505982eSean Callanan                log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr);
829f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
83017c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
83117c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
832f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
8336916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (location_value->GetContextType() != Value::eContextTypeRegisterInfo)
83417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
83517c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
83617c6a05cb96f7110332342326a90692d9505982eSean Callanan
83717c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
83817c6a05cb96f7110332342326a90692d9505982eSean Callanan
8398de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
84017c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
84117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
84217c6a05cb96f7110332342326a90692d9505982eSean Callanan
84317c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::RegisterInfo *register_info = location_value->GetRegisterInfo();
84417c6a05cb96f7110332342326a90692d9505982eSean Callanan
84517c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (!register_info)
84617c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
8478de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
84817c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
84917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
85017c6a05cb96f7110332342326a90692d9505982eSean Callanan
85117c6a05cb96f7110332342326a90692d9505982eSean Callanan            RegisterContext *register_context = exe_ctx.GetRegisterContext();
85217c6a05cb96f7110332342326a90692d9505982eSean Callanan
85317c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (!register_context)
85417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
8558de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name);
85617c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
85717c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
85817c6a05cb96f7110332342326a90692d9505982eSean Callanan
85917c6a05cb96f7110332342326a90692d9505982eSean Callanan            uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
86017c6a05cb96f7110332342326a90692d9505982eSean Callanan            uint32_t register_byte_size = register_info->byte_size;
86117c6a05cb96f7110332342326a90692d9505982eSean Callanan
86217c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
86317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
86417c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Moving from addr into a register
86517c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
86617c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 1: addr_byte_size and register_byte_size are the same
86717c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
86817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Address contents
86917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
87017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
87117c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 2: addr_byte_size is bigger than register_byte_size
87217c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
87317c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   Error!  (The register should always be big enough to hold the data)
87417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
87517c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 3: register_byte_size is bigger than addr_byte_size
87617c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
87717c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB| Address contents
87817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB0000| Register contents [on little-endian hardware]
87917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |0000AABB| Register contents [on big-endian hardware]
88017c6a05cb96f7110332342326a90692d9505982eSean Callanan
88117c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (addr_byte_size > register_byte_size)
88217c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
8838de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
88417c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
88517c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
88617c6a05cb96f7110332342326a90692d9505982eSean Callanan
88717c6a05cb96f7110332342326a90692d9505982eSean Callanan                uint32_t register_offset;
88817c6a05cb96f7110332342326a90692d9505982eSean Callanan
88917c6a05cb96f7110332342326a90692d9505982eSean Callanan                switch (exe_ctx.process->GetByteOrder())
89017c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
89117c6a05cb96f7110332342326a90692d9505982eSean Callanan                default:
8928de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
89317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
89417c6a05cb96f7110332342326a90692d9505982eSean Callanan                case lldb::eByteOrderLittle:
89517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    register_offset = 0;
89617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    break;
89717c6a05cb96f7110332342326a90692d9505982eSean Callanan                case lldb::eByteOrderBig:
89817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    register_offset = register_byte_size - addr_byte_size;
89917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    break;
90017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
90117c6a05cb96f7110332342326a90692d9505982eSean Callanan
90217c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataBufferHeap register_data (register_byte_size, 0);
90317c6a05cb96f7110332342326a90692d9505982eSean Callanan
90417c6a05cb96f7110332342326a90692d9505982eSean Callanan                Error error;
90517c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes() + register_offset, addr_byte_size, error) != addr_byte_size)
90617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
9078de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
90817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
90917c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
91017c6a05cb96f7110332342326a90692d9505982eSean Callanan
91117c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
91217c6a05cb96f7110332342326a90692d9505982eSean Callanan
91317c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0))
91417c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
9158de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
91617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
91717c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
91817c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
91917c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
92017c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
92117c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Moving from a register into addr
92217c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
92317c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 1: addr_byte_size and register_byte_size are the same
92417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
92517c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
92617c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Address contents
92717c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
92817c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 2: addr_byte_size is bigger than register_byte_size
92917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
93017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   Error!  (The register should always be big enough to hold the data)
93117c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
93217c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 3: register_byte_size is bigger than addr_byte_size
93317c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
93417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
93517c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB|     Address contents on little-endian hardware
93617c6a05cb96f7110332342326a90692d9505982eSean Callanan                //       |CCDD| Address contents on big-endian hardware
93717c6a05cb96f7110332342326a90692d9505982eSean Callanan
93817c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (addr_byte_size > register_byte_size)
93917c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
9408de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
94117c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
94217c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
94317c6a05cb96f7110332342326a90692d9505982eSean Callanan
94417c6a05cb96f7110332342326a90692d9505982eSean Callanan                uint32_t register_offset;
94517c6a05cb96f7110332342326a90692d9505982eSean Callanan
94617c6a05cb96f7110332342326a90692d9505982eSean Callanan                switch (exe_ctx.process->GetByteOrder())
94717c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
94817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    default:
9498de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
95017c6a05cb96f7110332342326a90692d9505982eSean Callanan                        return false;
95117c6a05cb96f7110332342326a90692d9505982eSean Callanan                    case lldb::eByteOrderLittle:
95217c6a05cb96f7110332342326a90692d9505982eSean Callanan                        register_offset = 0;
95317c6a05cb96f7110332342326a90692d9505982eSean Callanan                        break;
95417c6a05cb96f7110332342326a90692d9505982eSean Callanan                    case lldb::eByteOrderBig:
95517c6a05cb96f7110332342326a90692d9505982eSean Callanan                        register_offset = register_byte_size - addr_byte_size;
95617c6a05cb96f7110332342326a90692d9505982eSean Callanan                        break;
95717c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
95817c6a05cb96f7110332342326a90692d9505982eSean Callanan
95917c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataExtractor register_extractor;
96017c6a05cb96f7110332342326a90692d9505982eSean Callanan
96117c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_context->ReadRegisterBytes(register_number, register_extractor))
96217c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
9638de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
96417c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
96517c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
96617c6a05cb96f7110332342326a90692d9505982eSean Callanan
96717c6a05cb96f7110332342326a90692d9505982eSean Callanan                const void *register_data = register_extractor.GetData(&register_offset, addr_byte_size);
96817c6a05cb96f7110332342326a90692d9505982eSean Callanan
96917c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_data)
97017c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
9718de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name);
97217c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
97317c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
97417c6a05cb96f7110332342326a90692d9505982eSean Callanan
97517c6a05cb96f7110332342326a90692d9505982eSean Callanan                Error error;
97617c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (exe_ctx.process->WriteMemory (addr, register_data, addr_byte_size, error) != addr_byte_size)
97717c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
97817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
97917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
98017c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
98117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
982f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
983f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
984f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
985f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
986810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
987810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
9881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool
9891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister
9901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan(
9911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    bool dematerialize,
9921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ExecutionContext &exe_ctx,
9931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    RegisterContext &reg_ctx,
9941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    const lldb::RegisterInfo &reg_info,
9951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::addr_t addr,
9961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error &err
9971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan)
9981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
9991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB];
10001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    uint32_t register_byte_size = reg_info.byte_size;
10011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    Error error;
10031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (dematerialize)
10051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
10061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        DataBufferHeap register_data (register_byte_size, 0);
10071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        Error error;
10091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, error) != register_byte_size)
10101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
10111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, error.AsCString());
10121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
10131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
10141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
10161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0))
10181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
10191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
10201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
10211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
10221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
10231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    else
10241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
10251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        DataExtractor register_extractor;
10261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor))
10281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
10291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name);
10301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
10311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
10321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        uint32_t register_offset = 0;
10341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const void *register_data = register_extractor.GetData(&register_offset, register_byte_size);
10361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (!register_data)
10381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
10391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name);
10401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
10411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
10421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        Error error;
10441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size)
10451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
10461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
10471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return false;
10481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
10491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
10501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
10511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    return true;
10521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
10531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1054cc0746247880e9c87711031ce8a535544f4499d7Sean CallananVariable *
10558de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
10568de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
10578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
10588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
10598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
10608de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1061aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
1062e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1063cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1064cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    VariableList *var_list = frame.GetVariableList(true);
1065cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
1066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (!var_list)
1067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        return NULL;
1068bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
10693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    lldb::VariableSP var_sp (var_list->FindVariable(name));
10703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
10713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const bool append = true;
10723bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const uint32_t max_matches = 1;
10733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (!var_sp)
1074cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
10753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        // Look for globals elsewhere in the module for the frame
1076aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp);
10773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (module_sp)
10783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
10793bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            VariableList module_globals;
10803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals))
10813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                var_sp = module_globals.GetVariableAtIndex (0);
10823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
1083cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
10843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
10853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (!var_sp)
1086cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
10873bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        // Look for globals elsewhere in the program (all images)
1088aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp);
10893bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (target_sp)
10903bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
10913bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            VariableList program_globals;
10923bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals))
10933bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                var_sp = program_globals.GetVariableAtIndex (0);
10943bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
1095cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
10963bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
10973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (var_sp && type)
10983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    {
10993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        if (type->GetASTContext() == var_sp->GetType()->GetClangAST())
11003bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
11013bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangType()))
11023bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                return NULL;
11033bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
11043bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        else
11053bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        {
11063bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            if (log)
11073bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton                log->PutCString("Skipping a candidate variable because of different AST contexts");
11083bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton            return NULL;
11093bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        }
11103bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    }
11113bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
11123bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    return var_sp.get();
1113cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
1114336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1117e5748d889fb7fb97b3ff07444894d7714776b609Greg ClaytonClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name)
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
1120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1122e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
11233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1124810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
11258de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("Hunting for a definition for '%s'", name.GetCString());
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Back out in all cases where we're not fully initialized
1128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_exe_ctx->frame == NULL)
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
1130ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars->m_ignore_lookups)
1132ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
1133ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
1134ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
1135ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
1136ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
11373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1138e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11403bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
11413bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
11423bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
11433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
11443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
11458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
11468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
11473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr[0] != '$')
11480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
1149aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name);
11508de27c761a22187ef63fb60000894be163e7285fGreg Clayton
11518de27c761a22187ef63fb60000894be163e7285fGreg Clayton        // If we found a variable in scope, no need to pull up function names
11528de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (var != NULL)
115392aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
11548de27c761a22187ef63fb60000894be163e7285fGreg Clayton            AddOneVariable(context, var);
115592aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
11568de27c761a22187ef63fb60000894be163e7285fGreg Clayton        else
115792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
1158aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_parser_vars->m_sym_ctx.FindFunctionsByName (name, false, sc_list);
11598de27c761a22187ef63fb60000894be163e7285fGreg Clayton
11608de27c761a22187ef63fb60000894be163e7285fGreg Clayton            bool found_specific = false;
11618de27c761a22187ef63fb60000894be163e7285fGreg Clayton            Symbol *generic_symbol = NULL;
11628de27c761a22187ef63fb60000894be163e7285fGreg Clayton            Symbol *non_extern_symbol = NULL;
11638de27c761a22187ef63fb60000894be163e7285fGreg Clayton
1164e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton            for (uint32_t index = 0, num_indices = sc_list.GetSize();
11658de27c761a22187ef63fb60000894be163e7285fGreg Clayton                 index < num_indices;
11668de27c761a22187ef63fb60000894be163e7285fGreg Clayton                 ++index)
11678de27c761a22187ef63fb60000894be163e7285fGreg Clayton            {
11688de27c761a22187ef63fb60000894be163e7285fGreg Clayton                SymbolContext sym_ctx;
1169e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton                sc_list.GetContextAtIndex(index, sym_ctx);
11708de27c761a22187ef63fb60000894be163e7285fGreg Clayton
11718de27c761a22187ef63fb60000894be163e7285fGreg Clayton                if (sym_ctx.function)
11728de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
11738de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    // TODO only do this if it's a C function; C++ functions may be
11748de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    // overloaded
11758de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    if (!found_specific)
11768de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        AddOneFunction(context, sym_ctx.function, NULL);
11778de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    found_specific = true;
11788de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
11798de27c761a22187ef63fb60000894be163e7285fGreg Clayton                else if (sym_ctx.symbol)
11808de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
11818de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    if (sym_ctx.symbol->IsExternal())
11828de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        generic_symbol = sym_ctx.symbol;
11838de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    else
11848de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        non_extern_symbol = sym_ctx.symbol;
11858de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
11868de27c761a22187ef63fb60000894be163e7285fGreg Clayton            }
11878de27c761a22187ef63fb60000894be163e7285fGreg Clayton
11888de27c761a22187ef63fb60000894be163e7285fGreg Clayton            if (!found_specific)
11898de27c761a22187ef63fb60000894be163e7285fGreg Clayton            {
11908de27c761a22187ef63fb60000894be163e7285fGreg Clayton                if (generic_symbol)
11918de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    AddOneFunction(context, NULL, generic_symbol);
11928de27c761a22187ef63fb60000894be163e7285fGreg Clayton                else if (non_extern_symbol)
11938de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    AddOneFunction(context, NULL, non_extern_symbol);
11948de27c761a22187ef63fb60000894be163e7285fGreg Clayton            }
11956916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
1196aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name));
11976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            if (namespace_decl)
11986916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            {
11999ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl);
12009ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                if (clang_namespace_decl)
12019ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                {
12029ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                    // TODO: is this how we get the decl lookups to be called for
12039ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                    // this namespace??
12049ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                    clang_namespace_decl->setHasExternalLexicalStorage();
12059ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton                }
12066916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton            }
120792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
12080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
12098de27c761a22187ef63fb60000894be163e7285fGreg Clayton    else
12103cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
121157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
121257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
121357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
121457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
121557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
1216aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
121757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
121857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!vars)
121957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
122057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
122157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
122257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
122357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_var)
122457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
122557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
122657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            Type *this_type = this_var->GetType();
122757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
122857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!this_type)
122957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
123057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
12312403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            if (log)
12322403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            {
12332403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString ("Type for \"this\" is: ");
12342403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                StreamString strm;
12352403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                this_type->Dump(&strm, true);
12362403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                log->PutCString (strm.GetData());
12372403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton            }
12382403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
123957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            TypeFromUser this_user_type(this_type->GetClangType(),
124057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                        this_type->GetClangAST());
124157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
1242aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            m_struct_vars->m_object_pointer_type = this_user_type;
124357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
124457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            void *pointer_target_type;
124557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
124657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
124757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                                &pointer_target_type))
124857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
124957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
125057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            TypeFromUser class_user_type(pointer_target_type,
125157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                                         this_type->GetClangAST());
125257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
12533aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
12543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
12553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
12563aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
12573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
12583aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str());
12593aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
12603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
126157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            AddOneType(context, class_user_type, true);
126257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
126357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
126457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
126557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
12663aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
12673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
12683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
12693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
12703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false);
12723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!vars)
12743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
12753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
12773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_var)
12793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
12803aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            Type *self_type = self_var->GetType();
12823aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12833aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!self_type)
12843aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
12853aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12863aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser self_user_type(self_type->GetClangType(),
12873aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                        self_type->GetClangAST());
12883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            m_struct_vars->m_object_pointer_type = self_user_type;
12903aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12913aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            void *pointer_target_type;
12923aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(),
12943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                                &pointer_target_type))
12953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
12963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
12973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            TypeFromUser class_user_type(pointer_target_type,
12983aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                                         self_type->GetClangAST());
12993aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
13003aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            if (log)
13013aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
13023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                StreamString type_stream;
13033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                class_user_type.DumpTypeCode(&type_stream);
13043aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                type_stream.Flush();
13053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str());
13063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            }
13073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
13083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            AddOneType(context, class_user_type, false);
13093aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
13103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
13113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
13123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
1313aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        ClangExpressionVariable *pvar(m_parser_vars->m_persistent_vars->GetVariable(name));
13143cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan
13158de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (pvar)
13161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
13178de27c761a22187ef63fb60000894be163e7285fGreg Clayton            AddOneVariable(context, pvar);
13181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
13191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
13201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
13221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1323aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        if (m_parser_vars->m_exe_ctx->GetRegisterContext())
13241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1325aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan            const lldb::RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name));
13261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
13271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
13281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                AddOneRegister(context, reg_info);
13291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
13308de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
1331a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1332aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name));
13336df0840c87be29724055716db951aa6d494ddabcSean Callanan
1334ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    if (type_sp)
1335ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
1336ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        if (log)
13376df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
1338ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf ("Matching type found for \"%s\": ", name.GetCString());
1339ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            StreamString strm;
1340ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            type_sp->Dump(&strm, true);
1341ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->PutCString (strm.GetData());
1342ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        }
13432403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton
1344ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        TypeFromUser user_type(type_sp->GetClangType(),
13452403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton                                   type_sp->GetClangAST());
13466df0840c87be29724055716db951aa6d494ddabcSean Callanan
1347ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        AddOneType(context, user_type, false);
13486df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1350336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1351336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
13528de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
13538de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
13548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
13558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Variable *var,
13568de27c761a22187ef63fb60000894be163e7285fGreg Clayton    clang::ASTContext *parser_ast_context,
13578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
13588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
13598de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1361e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
13626184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1367810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1368810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
1369336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1372462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    void *var_opaque_type = var_type->GetClangType();
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1376810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1377810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
1378336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TypeList *type_list = var_type->GetTypeList();
138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!type_list)
138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1385810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1386810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because the type has no associated type list");
1387336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext();
139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!exe_ast_ctx)
139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1394810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1395810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
1396336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1399336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
1400336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1403178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1404178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
1405178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
1406178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
1407178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
1408178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
1409eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
1410178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14138e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda    if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err))
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1415810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1416810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
1417336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1420810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext();
1421810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1422336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    void *type_to_use;
1423336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1424f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
1425f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1426ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        type_to_use = GuardedCopyType(parser_ast_context, var_ast_context, var_opaque_type);
1427f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
14284b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        if (!type_to_use)
14294b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        {
14304b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            if (log)
14314b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan                log->Printf("Couldn't copy a variable's type into the parser's AST context");
14324b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
14334b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan            return NULL;
14344b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        }
14354b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
1436f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
1437f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1438f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1439336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
1440336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
14436916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton        var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use);
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
1449336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
1451336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
1456336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
1457336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1460aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target);
146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->GetScalar() = load_addr;
146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->SetValueType(Value::eValueTypeLoadAddress);
146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1466f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
1467f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        *user_type = TypeFromUser(var_opaque_type, var_ast_context);
1468336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1469336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
1470336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
1471336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1472336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
1473336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
14743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                       Variable* var)
1475336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
1476aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1477aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1478e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1479336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1480f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
1481f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
1482336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1483aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx,
14848de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
14858de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
14868de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
14878de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
1488336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
14894b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan    if (!var_location)
14904b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan        return;
14914b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
14923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14948c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable()));
14958de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
14968de27c761a22187ef63fb60000894be163e7285fGreg Clayton    entity.m_name.SetCString (decl_name.c_str());
14978de27c761a22187ef63fb60000894be163e7285fGreg Clayton    entity.m_user_type = ut;
149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14998c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.EnableParserVars();
15008c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_parser_type = pt;
15018c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_named_decl  = var_decl;
15028c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_llvm_value  = NULL;
15038c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_lldb_value  = var_location;
150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1505810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
15068de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
1507a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
1508a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1509a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
1510a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
1511a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
1512a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str());
15138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
15148f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
15158f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
15168f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
1517a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
1518a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                                       ClangExpressionVariable *pvar)
1519a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
1520e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
152145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1522a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    TypeFromUser user_type = pvar->m_user_type;
1523a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1524ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    TypeFromParser parser_type(GuardedCopyType(context.GetASTContext(),
1525ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                               user_type.GetASTContext(),
1526ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                               user_type.GetOpaqueQualType()),
1527a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                               context.GetASTContext());
1528a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
15298c12720c108cd5e7ed792596749218d8400f647eSean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
15308c12720c108cd5e7ed792596749218d8400f647eSean Callanan
15318c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->EnableParserVars();
15328c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_parser_type = parser_type;
15338c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_named_decl  = var_decl;
15348c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_llvm_value  = NULL;
15358c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_lldb_value  = NULL;
153645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
153745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
1538a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
1539a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string var_decl_print_string;
1540a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
1541a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl->print(var_decl_print_stream);
1542a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        var_decl_print_stream.flush();
1543a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
1544a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Added pvar %s, returned %s", pvar->m_name.GetCString(), var_decl_print_string.c_str());
1545a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
1546a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1547a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
15481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
15491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::AddOneRegister(NameSearchContext &context,
15501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                       const RegisterInfo *reg_info)
15511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
15521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
15531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(),
15551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->encoding,
15561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                                                                          reg_info->byte_size * 8);
15571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (!ast_type)
15591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
15601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
15611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
15621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
15631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    TypeFromParser parser_type(ast_type,
15651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan                               context.GetASTContext());
15661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
15681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable()));
15701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
15711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    entity.m_name.SetCString (decl_name.c_str());
15721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    entity.m_register_info = reg_info;
15731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    entity.EnableParserVars();
15751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    entity.m_parser_vars->m_parser_type = parser_type;
15761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    entity.m_parser_vars->m_named_decl  = var_decl;
15771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    entity.m_parser_vars->m_llvm_value  = NULL;
15781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    entity.m_parser_vars->m_lldb_value  = NULL;
15791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    if (log)
15811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
15821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        std::string var_decl_print_string;
15831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string);
15841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl->print(var_decl_print_stream);
15851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        var_decl_print_stream.flush();
15861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str());
15881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
15891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
15901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
15916916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::NamespaceDecl *
15926916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl)
15936916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{
15946916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
15956916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
15966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
15976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(),
15986916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                                                          namespace_decl.GetASTContext(),
15996916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                                                          namespace_decl.GetNamespaceDecl());
16006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
16016916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return dyn_cast<clang::NamespaceDecl>(copied_decl);
16026916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
16036916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
1604a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
16058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
16060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Function* fun,
16070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Symbol* symbol)
16088f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
1609aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1610aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1611e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
16128f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
16130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    NamedDecl *fun_decl;
16140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
16150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    const Address *fun_address;
16168f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
16170fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
16180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
16190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    clang::ASTContext *fun_ast_context = NULL;
16208f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
16210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
16220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
16230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
16240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
16250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
16260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
16270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
16280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no type");
16290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
16300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
16310fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
1632462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        fun_opaque_type = fun_type->GetClangType();
16330fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
16340fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
16350fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
16360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
16370fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no Clang type");
16380fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
16390fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
16400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
16410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
16420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
16430fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        TypeList *type_list = fun_type->GetTypeList();
16440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_ast_context = type_list->GetClangASTContext().getASTContext();
1645ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
16460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
16470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
16480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
16490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
16500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
16510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
16520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
16530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
16540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
16550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
16568f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
1657810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
16580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            log->PutCString("AddOneFunction called with no function and no symbol");
16598f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
16608f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
16618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
1662aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target);
16638f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
16648f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
16658f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
16668c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable()));
16678de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
16688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    entity.m_name.SetCString(decl_name.c_str());
16698c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_user_type  = TypeFromUser(fun_opaque_type, fun_ast_context);;
16708f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
16718c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.EnableParserVars();
16728c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_named_decl  = fun_decl;
16738c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_llvm_value  = NULL;
16748c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_lldb_value  = fun_location.release();
16758c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1676810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
16778de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
1678a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        std::string fun_decl_print_string;
1679a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string);
1680a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl->print(fun_decl_print_stream);
1681a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        fun_decl_print_stream.flush();
1682a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
1683a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan        log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str());
16848de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
168693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
168793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
168893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
16893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
16903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
169193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
16923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *parser_ast_context = context.GetASTContext();
16933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *user_ast_context = ut.GetASTContext();
16943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
1695ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
16963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
16973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
169893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
16993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
17003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
17013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
17023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
17033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
17043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
17053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
17063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
17073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
17083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
17093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
17103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
171130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
17121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
17131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
17141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
171530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
171630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
17171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
17181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
17198de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
17201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
17211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
17221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
17231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
172430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
172530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
17263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
172793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
172893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
172993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
1730ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1731ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid *
1732ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context,
1733ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         ASTContext *source_context,
1734ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                         void *clang_type)
1735ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{
1736aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1737aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1738aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = true;
1739ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1740ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    void *ret = ClangASTContext::CopyType (dest_context,
1741ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                           source_context,
1742ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan                                           clang_type);
1743ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1744aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars->m_ignore_lookups = false;
1745ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan
1746ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    return ret;
1747ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan}
1748