ClangExpressionDeclMap.cpp revision 8de27c761a22187ef63fb60000894be163e7285f
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"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
19810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h"
206184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
23a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
33f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
34810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
3517c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
37f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
428de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::ClangExpressionDeclMap (ExecutionContext *exe_ctx) :
438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_exe_ctx (),
468de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_sym_ctx (),
478de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_persistent_vars (NULL),
488de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_alignment (0),
498de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_size (0),
508de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_laid_out (false),
518de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_enable_lookups (false),
528de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_allocated_area (0),
538de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_materialized_location (0),
548de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_result_name (),
558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_object_pointer_type (),
568de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_lookedup_types ()
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    if (exe_ctx)
598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
608de27c761a22187ef63fb60000894be163e7285fGreg Clayton        m_exe_ctx = *exe_ctx;
618de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (exe_ctx->frame)
628de27c761a22187ef63fb60000894be163e7285fGreg Clayton            m_sym_ctx = exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything);
638de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (exe_ctx->process)
648de27c761a22187ef63fb60000894be163e7285fGreg Clayton            m_persistent_vars = &exe_ctx->process->GetPersistentVariables();
658de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
698c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t entity_index = 0, num_entities = m_found_entities.Size();
718c12720c108cd5e7ed792596749218d8400f647eSean Callanan         entity_index < num_entities;
728c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++entity_index)
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
748c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(entity_index));
758c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (entity.m_parser_vars.get() &&
768c12720c108cd5e7ed792596749218d8400f647eSean Callanan            entity.m_parser_vars->m_lldb_value)
778c12720c108cd5e7ed792596749218d8400f647eSean Callanan            delete entity.m_parser_vars->m_lldb_value;
7845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
7945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        entity.DisableParserVars();
8045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    }
8145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
8245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    for (uint64_t pvar_index = 0, num_pvars = m_persistent_vars->Size();
8345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan         pvar_index < num_pvars;
8445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan         ++pvar_index)
8545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    {
8645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        ClangExpressionVariable &pvar(m_persistent_vars->VariableAtIndex(pvar_index));
8745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        pvar.DisableParserVars();
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
907a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    if (m_materialized_location)
917a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    {
928de27c761a22187ef63fb60000894be163e7285fGreg Clayton        m_exe_ctx.process->DeallocateMemory(m_materialized_location);
937a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        m_materialized_location = 0;
947a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
998de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString &
1008de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName ()
10182b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
1028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    if (!m_result_name)
1038de27c761a22187ef63fb60000894be163e7285fGreg Clayton        m_persistent_vars->GetNextResultName(m_result_name);
1048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    return m_result_name;
10582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
10682b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
1078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1088de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
1098de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
1118de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
1128de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser parser_type
1138de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
114a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
1158de27c761a22187ef63fb60000894be163e7285fGreg Clayton    clang::ASTContext *context(m_exe_ctx.target->GetScratchClangASTContext()->getASTContext());
116a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
117a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
11882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
11982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
120a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                            context);
121a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1228c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!m_persistent_vars->CreatePersistentVariable (name, user_type))
1238c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1248c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1258c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *var = m_persistent_vars->GetVariable(name);
1268c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1278c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
1288c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1298c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1308c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->EnableParserVars();
1318c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1328c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_named_decl = decl;
1338c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_parser_type = parser_type;
1348c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1358c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
136a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
137a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
138a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
1398de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
1408de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1418de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
1428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
1438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
1448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
1458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
1468de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
1478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
14845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
14945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_laid_out = false;
1518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1528c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
1538c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
1548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1558c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *var = m_found_entities.GetVariable(decl);
1568c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1578c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
1588c12720c108cd5e7ed792596749218d8400f647eSean Callanan        var = m_persistent_vars->GetVariable(decl);
1598c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1608c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
1618c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1628c12720c108cd5e7ed792596749218d8400f647eSean Callanan
16345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
16445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
16545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
1668de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
1678de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    var->m_name.GetCString());
16845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1698c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
1708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
1718c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_llvm_value = value;
1728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1738c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->EnableJITVars();
1748c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_jit_vars->m_alignment = alignment;
1758c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_jit_vars->m_size = size;
1768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1778c12720c108cd5e7ed792596749218d8400f647eSean Callanan    m_struct_members.AddVariable(*var);
1788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
1808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
1818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
1848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
1858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (m_struct_laid_out)
1868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
1878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
1898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1908bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_alignment = 0;
1918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_size = 0;
1928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1938c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
1948c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
1958c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
1978c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member(m_struct_members.VariableAtIndex(member_index));
1988c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1998c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (!member.m_jit_vars.get())
2008c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
2018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2028c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
2038c12720c108cd5e7ed792596749218d8400f647eSean Callanan            m_struct_alignment = member.m_jit_vars->m_alignment;
2048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2058c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (cursor % member.m_jit_vars->m_alignment)
2068c12720c108cd5e7ed792596749218d8400f647eSean Callanan            cursor += (member.m_jit_vars->m_alignment - (cursor % member.m_jit_vars->m_alignment));
2078c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2088c12720c108cd5e7ed792596749218d8400f647eSean Callanan        member.m_jit_vars->m_offset = cursor;
2098c12720c108cd5e7ed792596749218d8400f647eSean Callanan        cursor += member.m_jit_vars->m_size;
2108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
2118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_size = cursor;
2138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_laid_out = true;
2158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
2168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
2178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2188de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
2198de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
2218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
2228de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
2238de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2248bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
2258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (!m_struct_laid_out)
2268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2288c12720c108cd5e7ed792596749218d8400f647eSean Callanan    num_elements = m_struct_members.Size();
2298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    size = m_struct_size;
2308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    alignment = m_struct_alignment;
2318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
2338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
2348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
2368de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
2378de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2388de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *&decl,
2398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
2408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
2418de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
2428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
2438de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
2448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
2458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (!m_struct_laid_out)
2468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2488c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (index >= m_struct_members.Size())
2498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2518c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &member(m_struct_members.VariableAtIndex(index));
2528c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2538c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!member.m_parser_vars.get() ||
2548c12720c108cd5e7ed792596749218d8400f647eSean Callanan        !member.m_jit_vars.get())
2558c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
2568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2578c12720c108cd5e7ed792596749218d8400f647eSean Callanan    decl = member.m_parser_vars->m_named_decl;
2588c12720c108cd5e7ed792596749218d8400f647eSean Callanan    value = member.m_parser_vars->m_llvm_value;
2598c12720c108cd5e7ed792596749218d8400f647eSean Callanan    offset = member.m_jit_vars->m_offset;
2608de27c761a22187ef63fb60000894be163e7285fGreg Clayton    name = member.m_name;
2618c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
2638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
2648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
26502fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
2668de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
2678de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const clang::NamedDecl *decl,
2698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value**& value,
2708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
2718de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
272ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
2738c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *entity = m_found_entities.GetVariable(decl);
2748c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2758c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!entity)
2768c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
277ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
2788c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
2798c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
280ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
2818c12720c108cd5e7ed792596749218d8400f647eSean Callanan    value = &entity->m_parser_vars->m_llvm_value;
2828c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ptr = entity->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
2838c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2848c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
285ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
286ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
287f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
2888de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
2898de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
2908de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
2918de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
2928de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
293f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
294f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
2958de27c761a22187ef63fb60000894be163e7285fGreg Clayton    if (m_exe_ctx.frame == NULL)
296f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
297f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
298f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContextList sym_ctxs;
299f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
3008de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_sym_ctx.FindFunctionsByName(name, false, sym_ctxs);
301f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
302f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (!sym_ctxs.GetSize())
303f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
304f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
305f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
306f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    sym_ctxs.GetContextAtIndex(0, sym_ctx);
307f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
308f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    const Address *fun_address;
309f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
310f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
311f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
312f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
313f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
314f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
315f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
316f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
3178de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ptr = fun_address->GetLoadAddress (m_exe_ctx.target);
318f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
319f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
320f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
321f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
322810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
323f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
324f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
3258de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize
3268de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext *exe_ctx,
3288de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &struct_address,
3298de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
3308de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
331f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
332f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool result = DoMaterialize(false, exe_ctx, NULL, err);
333f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
334f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
335f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        struct_address = m_materialized_location;
336f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
337f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
338f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
339f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
340f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
3418de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer
3428de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3438de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t &object_ptr,
3448de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext *exe_ctx,
3458de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
3468de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
3473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
3483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!exe_ctx || !exe_ctx->frame || !exe_ctx->target || !exe_ctx->process)
3493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
3513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!m_object_pointer_type.GetOpaqueQualType())
3553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
3573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3608de27c761a22187ef63fb60000894be163e7285fGreg Clayton    static ConstString g_this_cs ("this");
3618de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Variable *object_ptr_var = FindVariableInScope(*exe_ctx->frame, g_this_cs, &m_object_pointer_type);
3623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3633c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
3643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't find 'this' with appropriate type in scope");
3663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(*exe_ctx,
3703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
3713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       m_object_pointer_type.GetASTContext()));
3723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
3743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't get the location for 'this'");
3763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (location_value->GetValueType() == Value::eValueTypeLoadAddress)
3803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
3823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        uint32_t address_byte_size = exe_ctx->target->GetArchitecture().GetAddressByteSize();
3833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        lldb::ByteOrder address_byte_order = exe_ctx->process->GetByteOrder();
3843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (ClangASTType::GetClangTypeBitWidth(m_object_pointer_type.GetASTContext(), m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
3863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
3873c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            err.SetErrorStringWithFormat("'this' is not of an expected pointer size");
3883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
3893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
3903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        DataBufferHeap data;
3923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        data.SetByteSize(address_byte_size);
3933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        Error read_error;
3943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (exe_ctx->process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
3963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
3973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            err.SetErrorStringWithFormat("Coldn't read 'this' from the target: %s", read_error.AsCString());
3983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
3993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
4003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
4023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        uint32_t offset = 0;
4043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        object_ptr = extractor.GetPointer(&offset);
4063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return true;
4083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
4093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    else
4103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
4113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("'this' is not in memory; LLDB must be extended to handle registers");
4123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
4133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
4143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
4153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
4163c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
4178de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize
4188de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4198de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext *exe_ctx,
4208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ClangExpressionVariable *&result,
4218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
4228de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
423f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
42482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan    return DoMaterialize(true, exe_ctx, &result, err);
425f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
426f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
42732824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
4288de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct
4298de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4308de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext *exe_ctx,
4318de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Stream &s,
4328de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
4338de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
43432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
43532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (!m_struct_laid_out)
43632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
43732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
43832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
43932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
44032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
44132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (!exe_ctx)
44232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
44332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Received null execution context");
44432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
44532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
44632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
44732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
44832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (!exe_ctx->process)
44932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
45032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
45132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
45232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
45332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
45432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (!exe_ctx->target)
45532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
45632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
45732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
45832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
45932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
46032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    lldb::DataBufferSP data(new DataBufferHeap(m_struct_size, 0));
46132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
46232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
46332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (exe_ctx->process->ReadMemory (m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize())
46432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
46532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
46632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
46732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
46832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
46932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    DataExtractor extractor(data, exe_ctx->process->GetByteOrder(), exe_ctx->target->GetArchitecture().GetAddressByteSize());
47032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
4718c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
4728c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
4738c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
47432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
4758c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member (m_struct_members.VariableAtIndex(member_index));
47632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
4778de27c761a22187ef63fb60000894be163e7285fGreg Clayton        s.Printf("[%s]\n", member.m_name.GetCString());
4788c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4798c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (!member.m_jit_vars.get())
4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan        extractor.Dump(&s,                                                      // stream
4838c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       member.m_jit_vars->m_offset,                             // offset
4848c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       lldb::eFormatBytesWithASCII,                             // format
4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       1,                                                       // byte size of individual entries
4868c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       member.m_jit_vars->m_size,                               // number of entries
4878c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       16,                                                      // entries per line
4888c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       m_materialized_location + member.m_jit_vars->m_offset,   // address to print
4898c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       0,                                                       // bit size (bitfields only; 0 means ignore)
4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       0);                                                      // bit alignment (bitfields only; 0 means ignore)
49132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
49232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
49332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
49432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
49532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
49632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
49732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
498f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
4998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize
5008de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
5028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext *exe_ctx,
5038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ClangExpressionVariable **result,
5048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
5058de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
506810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
507336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
50882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
509810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (!m_struct_laid_out)
510810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
511810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
512810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
513810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
514810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
515810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (!exe_ctx)
516810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
517810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Received null execution context");
518810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
519810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
520810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
52145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    if (!exe_ctx->frame)
52245839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
52345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
52445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        return LLDB_INVALID_ADDRESS;
52545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
52645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
527e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    if (!m_struct_size)
528e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
529e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
530e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
531e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
532e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        m_allocated_area = NULL;
533e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
534e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
535e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
536e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
537810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    const SymbolContext &sym_ctx(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything));
538810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
539f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
540f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
541f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (m_materialized_location)
542f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
543f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            exe_ctx->process->DeallocateMemory(m_materialized_location);
544f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            m_materialized_location = 0;
545f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
546810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
5477a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan        if (log)
5487a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan            log->PutCString("Allocating memory for materialized argument struct");
5497a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan
550f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t mem = exe_ctx->process->AllocateMemory(m_struct_alignment + m_struct_size,
551f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                            lldb::ePermissionsReadable | lldb::ePermissionsWritable,
552f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                            err);
553f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
554f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
555f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
556f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
557f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        m_allocated_area = mem;
558f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
559810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
560f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    m_materialized_location = m_allocated_area;
561810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
562f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (m_materialized_location % m_struct_alignment)
563f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        m_materialized_location += (m_struct_alignment - (m_materialized_location % m_struct_alignment));
564810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
5658c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
5668c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5678c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
568810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
5698c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member (m_struct_members.VariableAtIndex(member_index));
5708c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5718c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (!member.m_parser_vars.get())
5728c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
573810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
5748c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable *entity = m_found_entities.GetVariable(member.m_parser_vars->m_named_decl);
5758de27c761a22187ef63fb60000894be163e7285fGreg Clayton        ClangExpressionVariable *persistent_variable = m_persistent_vars->GetVariable(member.m_name);
5768c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5778c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (entity)
578336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
5798c12720c108cd5e7ed792596749218d8400f647eSean Callanan            if (!member.m_jit_vars.get())
5808c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
58182b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
5828de27c761a22187ef63fb60000894be163e7285fGreg Clayton            if (!DoMaterializeOneVariable(dematerialize, *exe_ctx, sym_ctx, member.m_name, member.m_user_type, m_materialized_location + member.m_jit_vars->m_offset, err))
583a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                return false;
5848c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
5858c12720c108cd5e7ed792596749218d8400f647eSean Callanan        else if (persistent_variable)
5868c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
5878de27c761a22187ef63fb60000894be163e7285fGreg Clayton            if (member.m_name == m_result_name)
58845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
58945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                if (!dematerialize)
59045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    continue;
5918c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5928c12720c108cd5e7ed792596749218d8400f647eSean Callanan                if (log)
5938c12720c108cd5e7ed792596749218d8400f647eSean Callanan                    log->PutCString("Found result member in the struct");
59445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
5958c12720c108cd5e7ed792596749218d8400f647eSean Callanan                *result = &member;
596f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
597f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
59845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            if (log)
5998de27c761a22187ef63fb60000894be163e7285fGreg Clayton                log->Printf("Searched for persistent variable %s and found %s", member.m_name.GetCString(), persistent_variable->m_name.GetCString());
60045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
6018de27c761a22187ef63fb60000894be163e7285fGreg Clayton            if (!DoMaterializeOnePersistentVariable(dematerialize, *exe_ctx, persistent_variable->m_name, m_materialized_location + member.m_jit_vars->m_offset, err))
6028c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
603336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        }
6048c12720c108cd5e7ed792596749218d8400f647eSean Callanan        else
6058c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
6068de27c761a22187ef63fb60000894be163e7285fGreg Clayton            err.SetErrorStringWithFormat("Unexpected variable %s", member.m_name.GetCString());
607336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return false;
6088c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
609810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
610810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
611f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
612f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
613f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
614a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
6158de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable
6168de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6178de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
6188de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
6198de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
6208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
6218de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
6228de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
62345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan{
624a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ClangExpressionVariable *pvar(m_persistent_vars->GetVariable(name));
625a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
626a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (!pvar)
627a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
6288de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Undefined persistent variable %s", name.GetCString());
629a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
630a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
631a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
632a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    size_t pvar_size = pvar->Size();
633a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
63466ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    if (!pvar->m_data_sp.get())
635a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
636a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
63766ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton    uint8_t *pvar_data = pvar->m_data_sp->GetBytes();
638a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
639a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
640a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
641a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
642a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        if (exe_ctx.process->ReadMemory (addr, pvar_data, pvar_size, error) != pvar_size)
643a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
644a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
645a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
646a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
647a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
648a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
649a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
650a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        if (exe_ctx.process->WriteMemory (addr, pvar_data, pvar_size, error) != pvar_size)
651a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
652a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
653a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
654a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
655a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
656a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
657a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
658a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
659a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
660f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
6618de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable
6628de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
6638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    bool dematerialize,
6648de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
6658de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const SymbolContext &sym_ctx,
6668de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
6678de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser type,
6688de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t addr,
6698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Error &err
6708de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
671f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
672f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
673f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
67417c6a05cb96f7110332342326a90692d9505982eSean Callanan    if (!exe_ctx.frame || !exe_ctx.process)
675cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
676cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
677cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    Variable *var = FindVariableInScope(*exe_ctx.frame, name, &type);
678f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
679f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!var)
680f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
6818de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString());
682f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
683f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
684f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
685841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
6868de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType());
687f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
688f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
689f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                       var,
690f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                       type.GetASTContext()));
691f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
692f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
693f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
6948de27c761a22187ef63fb60000894be163e7285fGreg Clayton        err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString());
695f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
696f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
69717c6a05cb96f7110332342326a90692d9505982eSean Callanan
69817c6a05cb96f7110332342326a90692d9505982eSean Callanan    // The size of the type contained in addr
699f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
70017c6a05cb96f7110332342326a90692d9505982eSean Callanan    size_t addr_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
70117c6a05cb96f7110332342326a90692d9505982eSean Callanan    size_t addr_byte_size = addr_bit_size % 8 ? ((addr_bit_size + 8) / 8) : (addr_bit_size / 8);
70217c6a05cb96f7110332342326a90692d9505982eSean Callanan
70317c6a05cb96f7110332342326a90692d9505982eSean Callanan    Value::ValueType value_type = location_value->GetValueType();
70417c6a05cb96f7110332342326a90692d9505982eSean Callanan
70517c6a05cb96f7110332342326a90692d9505982eSean Callanan    switch (value_type)
706f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
70717c6a05cb96f7110332342326a90692d9505982eSean Callanan    default:
708f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
70917c6a05cb96f7110332342326a90692d9505982eSean Callanan            StreamString ss;
71017c6a05cb96f7110332342326a90692d9505982eSean Callanan
71117c6a05cb96f7110332342326a90692d9505982eSean Callanan            location_value->Dump(&ss);
71217c6a05cb96f7110332342326a90692d9505982eSean Callanan
7138de27c761a22187ef63fb60000894be163e7285fGreg Clayton            err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
71417c6a05cb96f7110332342326a90692d9505982eSean Callanan            return false;
715f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
71617c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
71717c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeLoadAddress:
718f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
71917c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
72017c6a05cb96f7110332342326a90692d9505982eSean Callanan
72117c6a05cb96f7110332342326a90692d9505982eSean Callanan            DataBufferHeap data;
72217c6a05cb96f7110332342326a90692d9505982eSean Callanan            data.SetByteSize(addr_byte_size);
72317c6a05cb96f7110332342326a90692d9505982eSean Callanan
72417c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::addr_t src_addr;
72517c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::addr_t dest_addr;
72617c6a05cb96f7110332342326a90692d9505982eSean Callanan
72717c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
72817c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
72917c6a05cb96f7110332342326a90692d9505982eSean Callanan                src_addr = addr;
73017c6a05cb96f7110332342326a90692d9505982eSean Callanan                dest_addr = value_addr;
73117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
73217c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
73317c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
73417c6a05cb96f7110332342326a90692d9505982eSean Callanan                src_addr = value_addr;
73517c6a05cb96f7110332342326a90692d9505982eSean Callanan                dest_addr = addr;
73617c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
73717c6a05cb96f7110332342326a90692d9505982eSean Callanan
73817c6a05cb96f7110332342326a90692d9505982eSean Callanan            Error error;
73917c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size)
74017c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
7418de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
74217c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
74317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
74417c6a05cb96f7110332342326a90692d9505982eSean Callanan
74517c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size)
74617c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
7478de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString());
74817c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
74917c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
75017c6a05cb96f7110332342326a90692d9505982eSean Callanan
75117c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (log)
75217c6a05cb96f7110332342326a90692d9505982eSean Callanan                log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr);
753f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
75417c6a05cb96f7110332342326a90692d9505982eSean Callanan        break;
75517c6a05cb96f7110332342326a90692d9505982eSean Callanan    case Value::eValueTypeScalar:
756f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
75717c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (location_value->GetContextType() != Value::eContextTypeDCRegisterInfo)
75817c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
75917c6a05cb96f7110332342326a90692d9505982eSean Callanan                StreamString ss;
76017c6a05cb96f7110332342326a90692d9505982eSean Callanan
76117c6a05cb96f7110332342326a90692d9505982eSean Callanan                location_value->Dump(&ss);
76217c6a05cb96f7110332342326a90692d9505982eSean Callanan
7638de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str());
76417c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
76517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
76617c6a05cb96f7110332342326a90692d9505982eSean Callanan
76717c6a05cb96f7110332342326a90692d9505982eSean Callanan            lldb::RegisterInfo *register_info = location_value->GetRegisterInfo();
76817c6a05cb96f7110332342326a90692d9505982eSean Callanan
76917c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (!register_info)
77017c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
7718de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString());
77217c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
77317c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
77417c6a05cb96f7110332342326a90692d9505982eSean Callanan
77517c6a05cb96f7110332342326a90692d9505982eSean Callanan            RegisterContext *register_context = exe_ctx.GetRegisterContext();
77617c6a05cb96f7110332342326a90692d9505982eSean Callanan
77717c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (!register_context)
77817c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
7798de27c761a22187ef63fb60000894be163e7285fGreg Clayton                err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name);
78017c6a05cb96f7110332342326a90692d9505982eSean Callanan                return false;
78117c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
78217c6a05cb96f7110332342326a90692d9505982eSean Callanan
78317c6a05cb96f7110332342326a90692d9505982eSean Callanan            uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB];
78417c6a05cb96f7110332342326a90692d9505982eSean Callanan            uint32_t register_byte_size = register_info->byte_size;
78517c6a05cb96f7110332342326a90692d9505982eSean Callanan
78617c6a05cb96f7110332342326a90692d9505982eSean Callanan            if (dematerialize)
78717c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
78817c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Moving from addr into a register
78917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
79017c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 1: addr_byte_size and register_byte_size are the same
79117c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
79217c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Address contents
79317c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
79417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
79517c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 2: addr_byte_size is bigger than register_byte_size
79617c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
79717c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   Error!  (The register should always be big enough to hold the data)
79817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
79917c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 3: register_byte_size is bigger than addr_byte_size
80017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
80117c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB| Address contents
80217c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB0000| Register contents [on little-endian hardware]
80317c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |0000AABB| Register contents [on big-endian hardware]
80417c6a05cb96f7110332342326a90692d9505982eSean Callanan
80517c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (addr_byte_size > register_byte_size)
80617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
8078de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
80817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
80917c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
81017c6a05cb96f7110332342326a90692d9505982eSean Callanan
81117c6a05cb96f7110332342326a90692d9505982eSean Callanan                uint32_t register_offset;
81217c6a05cb96f7110332342326a90692d9505982eSean Callanan
81317c6a05cb96f7110332342326a90692d9505982eSean Callanan                switch (exe_ctx.process->GetByteOrder())
81417c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
81517c6a05cb96f7110332342326a90692d9505982eSean Callanan                default:
8168de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
81717c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
81817c6a05cb96f7110332342326a90692d9505982eSean Callanan                case lldb::eByteOrderLittle:
81917c6a05cb96f7110332342326a90692d9505982eSean Callanan                    register_offset = 0;
82017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    break;
82117c6a05cb96f7110332342326a90692d9505982eSean Callanan                case lldb::eByteOrderBig:
82217c6a05cb96f7110332342326a90692d9505982eSean Callanan                    register_offset = register_byte_size - addr_byte_size;
82317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    break;
82417c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
82517c6a05cb96f7110332342326a90692d9505982eSean Callanan
82617c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataBufferHeap register_data (register_byte_size, 0);
82717c6a05cb96f7110332342326a90692d9505982eSean Callanan
82817c6a05cb96f7110332342326a90692d9505982eSean Callanan                Error error;
82917c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes() + register_offset, addr_byte_size, error) != addr_byte_size)
83017c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
8318de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString());
83217c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
83317c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
83417c6a05cb96f7110332342326a90692d9505982eSean Callanan
83517c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize());
83617c6a05cb96f7110332342326a90692d9505982eSean Callanan
83717c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0))
83817c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
8398de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
84017c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
84117c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
84217c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
84317c6a05cb96f7110332342326a90692d9505982eSean Callanan            else
84417c6a05cb96f7110332342326a90692d9505982eSean Callanan            {
84517c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Moving from a register into addr
84617c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
84717c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 1: addr_byte_size and register_byte_size are the same
84817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
84917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
85017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Address contents
85117c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
85217c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 2: addr_byte_size is bigger than register_byte_size
85317c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
85417c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   Error!  (The register should always be big enough to hold the data)
85517c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
85617c6a05cb96f7110332342326a90692d9505982eSean Callanan                // Case 3: register_byte_size is bigger than addr_byte_size
85717c6a05cb96f7110332342326a90692d9505982eSean Callanan                //
85817c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABBCCDD| Register contents
85917c6a05cb96f7110332342326a90692d9505982eSean Callanan                //   |AABB|     Address contents on little-endian hardware
86017c6a05cb96f7110332342326a90692d9505982eSean Callanan                //       |CCDD| Address contents on big-endian hardware
86117c6a05cb96f7110332342326a90692d9505982eSean Callanan
86217c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (addr_byte_size > register_byte_size)
86317c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
8648de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name);
86517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
86617c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
86717c6a05cb96f7110332342326a90692d9505982eSean Callanan
86817c6a05cb96f7110332342326a90692d9505982eSean Callanan                uint32_t register_offset;
86917c6a05cb96f7110332342326a90692d9505982eSean Callanan
87017c6a05cb96f7110332342326a90692d9505982eSean Callanan                switch (exe_ctx.process->GetByteOrder())
87117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
87217c6a05cb96f7110332342326a90692d9505982eSean Callanan                    default:
8738de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString());
87417c6a05cb96f7110332342326a90692d9505982eSean Callanan                        return false;
87517c6a05cb96f7110332342326a90692d9505982eSean Callanan                    case lldb::eByteOrderLittle:
87617c6a05cb96f7110332342326a90692d9505982eSean Callanan                        register_offset = 0;
87717c6a05cb96f7110332342326a90692d9505982eSean Callanan                        break;
87817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    case lldb::eByteOrderBig:
87917c6a05cb96f7110332342326a90692d9505982eSean Callanan                        register_offset = register_byte_size - addr_byte_size;
88017c6a05cb96f7110332342326a90692d9505982eSean Callanan                        break;
88117c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
88217c6a05cb96f7110332342326a90692d9505982eSean Callanan
88317c6a05cb96f7110332342326a90692d9505982eSean Callanan                DataExtractor register_extractor;
88417c6a05cb96f7110332342326a90692d9505982eSean Callanan
88517c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_context->ReadRegisterBytes(register_number, register_extractor))
88617c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
8878de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name);
88817c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
88917c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
89017c6a05cb96f7110332342326a90692d9505982eSean Callanan
89117c6a05cb96f7110332342326a90692d9505982eSean Callanan                const void *register_data = register_extractor.GetData(&register_offset, addr_byte_size);
89217c6a05cb96f7110332342326a90692d9505982eSean Callanan
89317c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (!register_data)
89417c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
8958de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name);
89617c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
89717c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
89817c6a05cb96f7110332342326a90692d9505982eSean Callanan
89917c6a05cb96f7110332342326a90692d9505982eSean Callanan                Error error;
90017c6a05cb96f7110332342326a90692d9505982eSean Callanan                if (exe_ctx.process->WriteMemory (addr, register_data, addr_byte_size, error) != addr_byte_size)
90117c6a05cb96f7110332342326a90692d9505982eSean Callanan                {
90217c6a05cb96f7110332342326a90692d9505982eSean Callanan                    err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString());
90317c6a05cb96f7110332342326a90692d9505982eSean Callanan                    return false;
90417c6a05cb96f7110332342326a90692d9505982eSean Callanan                }
90517c6a05cb96f7110332342326a90692d9505982eSean Callanan            }
906f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
907f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
908f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
909f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
910810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
911810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
912cc0746247880e9c87711031ce8a535544f4499d7Sean CallananVariable *
9138de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope
9148de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
9158de27c761a22187ef63fb60000894be163e7285fGreg Clayton    StackFrame &frame,
9168de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
9178de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *type
9188de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
919cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan{
920cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
921cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
922cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    VariableList *var_list = frame.GetVariableList(true);
923cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
924bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton    if (!var_list)
925bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton        return NULL;
926bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
9278de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::VariableSP var = var_list->FindVariable(name);
928cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
929cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    if (!var)
930cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return NULL;
931cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
932cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    if (!type)
933cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return var.get();
934cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
935cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    if (type->GetASTContext() == var->GetType()->GetClangAST())
936cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
937462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var->GetType()->GetClangType()))
938cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan            return NULL;
939cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
940cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    else
941cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
942cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        if (log)
943cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan            log->PutCString("Skipping a candidate variable because of different AST contexts");
944cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return NULL;
945cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
946cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
947cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    return var.get();
948cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
949cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    return NULL;
950cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
951336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
9548de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetDecls
9558de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
9568de27c761a22187ef63fb60000894be163e7285fGreg Clayton    NameSearchContext &context,
9578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name
9588de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9606184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
9613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
962810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
9638de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("Hunting for a definition for '%s'", name.GetCString());
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Back out in all cases where we're not fully initialized
9668de27c761a22187ef63fb60000894be163e7285fGreg Clayton    if (m_exe_ctx.frame == NULL)
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
9683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    static ConstString g_lldb_class_name ("$__lldb_class");
9708de27c761a22187ef63fb60000894be163e7285fGreg Clayton    if (name == g_lldb_class_name)
9713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
9723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        // Clang is looking for the type of "this"
9733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9748de27c761a22187ef63fb60000894be163e7285fGreg Clayton        VariableList *vars = m_exe_ctx.frame->GetVariableList(false);
9753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (!vars)
9773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return;
9783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
9803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (!this_var)
9823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return;
9833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        Type *this_type = this_var->GetType();
9853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (!this_type)
9873c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return;
9883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
989462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        TypeFromUser this_user_type(this_type->GetClangType(),
9903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                    this_type->GetClangAST());
9913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        m_object_pointer_type = this_user_type;
9933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *pointer_target_type;
9953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
9963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
9973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                            &pointer_target_type))
9983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return;
9993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        TypeFromUser class_user_type(pointer_target_type,
10013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                     this_type->GetClangAST());
10023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        AddOneType(context, class_user_type, true);
10043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
10053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return;
10063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
1007cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
10080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    SymbolContextList sym_ctxs;
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
10118de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
10128de27c761a22187ef63fb60000894be163e7285fGreg Clayton    if (name.GetCString()[0] != '$')
10130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
10148de27c761a22187ef63fb60000894be163e7285fGreg Clayton
10158de27c761a22187ef63fb60000894be163e7285fGreg Clayton        Variable *var = FindVariableInScope(*m_exe_ctx.frame, name);
10168de27c761a22187ef63fb60000894be163e7285fGreg Clayton
10178de27c761a22187ef63fb60000894be163e7285fGreg Clayton        // If we found a variable in scope, no need to pull up function names
10188de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (var != NULL)
101992aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
10208de27c761a22187ef63fb60000894be163e7285fGreg Clayton            AddOneVariable(context, var);
102192aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
10228de27c761a22187ef63fb60000894be163e7285fGreg Clayton        else
102392aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
10248de27c761a22187ef63fb60000894be163e7285fGreg Clayton            m_sym_ctx.FindFunctionsByName (name, false, sym_ctxs);
10258de27c761a22187ef63fb60000894be163e7285fGreg Clayton
10268de27c761a22187ef63fb60000894be163e7285fGreg Clayton            bool found_specific = false;
10278de27c761a22187ef63fb60000894be163e7285fGreg Clayton            Symbol *generic_symbol = NULL;
10288de27c761a22187ef63fb60000894be163e7285fGreg Clayton            Symbol *non_extern_symbol = NULL;
10298de27c761a22187ef63fb60000894be163e7285fGreg Clayton
10308de27c761a22187ef63fb60000894be163e7285fGreg Clayton            for (uint32_t index = 0, num_indices = sym_ctxs.GetSize();
10318de27c761a22187ef63fb60000894be163e7285fGreg Clayton                 index < num_indices;
10328de27c761a22187ef63fb60000894be163e7285fGreg Clayton                 ++index)
10338de27c761a22187ef63fb60000894be163e7285fGreg Clayton            {
10348de27c761a22187ef63fb60000894be163e7285fGreg Clayton                SymbolContext sym_ctx;
10358de27c761a22187ef63fb60000894be163e7285fGreg Clayton                sym_ctxs.GetContextAtIndex(index, sym_ctx);
10368de27c761a22187ef63fb60000894be163e7285fGreg Clayton
10378de27c761a22187ef63fb60000894be163e7285fGreg Clayton                if (sym_ctx.function)
10388de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
10398de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    // TODO only do this if it's a C function; C++ functions may be
10408de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    // overloaded
10418de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    if (!found_specific)
10428de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        AddOneFunction(context, sym_ctx.function, NULL);
10438de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    found_specific = true;
10448de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
10458de27c761a22187ef63fb60000894be163e7285fGreg Clayton                else if (sym_ctx.symbol)
10468de27c761a22187ef63fb60000894be163e7285fGreg Clayton                {
10478de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    if (sym_ctx.symbol->IsExternal())
10488de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        generic_symbol = sym_ctx.symbol;
10498de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    else
10508de27c761a22187ef63fb60000894be163e7285fGreg Clayton                        non_extern_symbol = sym_ctx.symbol;
10518de27c761a22187ef63fb60000894be163e7285fGreg Clayton                }
10528de27c761a22187ef63fb60000894be163e7285fGreg Clayton            }
10538de27c761a22187ef63fb60000894be163e7285fGreg Clayton
10548de27c761a22187ef63fb60000894be163e7285fGreg Clayton            if (!found_specific)
10558de27c761a22187ef63fb60000894be163e7285fGreg Clayton            {
10568de27c761a22187ef63fb60000894be163e7285fGreg Clayton                if (generic_symbol)
10578de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    AddOneFunction(context, NULL, generic_symbol);
10588de27c761a22187ef63fb60000894be163e7285fGreg Clayton                else if (non_extern_symbol)
10598de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    AddOneFunction(context, NULL, non_extern_symbol);
10608de27c761a22187ef63fb60000894be163e7285fGreg Clayton            }
106192aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
10620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
10638de27c761a22187ef63fb60000894be163e7285fGreg Clayton    else
10643cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
10658de27c761a22187ef63fb60000894be163e7285fGreg Clayton        ClangExpressionVariable *pvar(m_persistent_vars->GetVariable(name));
10663cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan
10678de27c761a22187ef63fb60000894be163e7285fGreg Clayton        if (pvar)
10688de27c761a22187ef63fb60000894be163e7285fGreg Clayton            AddOneVariable(context, pvar);
10698de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
1070a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
107193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
10726df0840c87be29724055716db951aa6d494ddabcSean Callanan    // See information on gating of this operation next to the definition for
10736df0840c87be29724055716db951aa6d494ddabcSean Callanan    // m_lookedup_types.
10746df0840c87be29724055716db951aa6d494ddabcSean Callanan
10758de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const char *name_uniq = name.GetCString();
10766df0840c87be29724055716db951aa6d494ddabcSean Callanan
10776df0840c87be29724055716db951aa6d494ddabcSean Callanan    if (m_lookedup_types.find(name_uniq) == m_lookedup_types.end())
10786df0840c87be29724055716db951aa6d494ddabcSean Callanan    {
10796df0840c87be29724055716db951aa6d494ddabcSean Callanan        // 1 The name is added to m_lookedup_types.
10806df0840c87be29724055716db951aa6d494ddabcSean Callanan        m_lookedup_types.insert(std::pair<const char*, bool>(name_uniq, true));
10816df0840c87be29724055716db951aa6d494ddabcSean Callanan
10826df0840c87be29724055716db951aa6d494ddabcSean Callanan        // 2 The type is looked up and added, potentially causing more type loookups.
10838de27c761a22187ef63fb60000894be163e7285fGreg Clayton        lldb::TypeSP type = m_sym_ctx.FindTypeByName (name);
10846df0840c87be29724055716db951aa6d494ddabcSean Callanan
10856df0840c87be29724055716db951aa6d494ddabcSean Callanan        if (type.get())
10866df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
1087462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            TypeFromUser user_type(type->GetClangType(),
10886df0840c87be29724055716db951aa6d494ddabcSean Callanan                                   type->GetClangAST());
10896df0840c87be29724055716db951aa6d494ddabcSean Callanan
10906df0840c87be29724055716db951aa6d494ddabcSean Callanan            AddOneType(context, user_type, false);
10916df0840c87be29724055716db951aa6d494ddabcSean Callanan        }
10926df0840c87be29724055716db951aa6d494ddabcSean Callanan
10936df0840c87be29724055716db951aa6d494ddabcSean Callanan        // 3 The name is removed from m_lookedup_types.
10946df0840c87be29724055716db951aa6d494ddabcSean Callanan        m_lookedup_types.erase(name_uniq);
10956df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1097336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1098336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
10998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue
11008de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
11018de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ExecutionContext &exe_ctx,
11028de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Variable *var,
11038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    clang::ASTContext *parser_ast_context,
11048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromUser *user_type,
11058de27c761a22187ef63fb60000894be163e7285fGreg Clayton    TypeFromParser *parser_type
11068de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11086184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
11096184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1114810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1115810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
1116336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1119462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    void *var_opaque_type = var_type->GetClangType();
112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1123810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1124810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
1125336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TypeList *type_list = var_type->GetTypeList();
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!type_list)
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1132810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1133810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because the type has no associated type list");
1134336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext();
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!exe_ast_ctx)
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1141810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1142810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
1143336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1146336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
1147336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1150178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1151178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
1152178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
1153178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
1154178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
1155178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
1156eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
1157178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1160178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, loclist_base_load_addr, NULL, *var_location.get(), &err))
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1162810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1163810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
1164336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1167810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext();
1168810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
1169336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    void *type_to_use;
1170336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1171f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
1172f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
1173f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        type_to_use = ClangASTContext::CopyType(parser_ast_context, var_ast_context, var_opaque_type);
1174f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
1175f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
1176f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
1177f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
1178336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
1179336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
1182336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        var_location.get()->SetContext(Value::eContextTypeOpaqueClangQualType, type_to_use);
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
1188336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
1190336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
1195336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
1196336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11998de27c761a22187ef63fb60000894be163e7285fGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(m_exe_ctx.target);
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->GetScalar() = load_addr;
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->SetValueType(Value::eValueTypeLoadAddress);
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1205f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
1206f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        *user_type = TypeFromUser(var_opaque_type, var_ast_context);
1207336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1208336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
1209336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
1210336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1211336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
1212336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
12133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                       Variable* var)
1214336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
1215336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
1216336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1217f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
1218f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
1219336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
12208de27c761a22187ef63fb60000894be163e7285fGreg Clayton    Value *var_location = GetVariableValue (m_exe_ctx,
12218de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            var,
12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            context.GetASTContext(),
12238de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &ut,
12248de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                            &pt);
1225336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
12263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12288c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable()));
12298de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
12308de27c761a22187ef63fb60000894be163e7285fGreg Clayton    entity.m_name.SetCString (decl_name.c_str());
12318de27c761a22187ef63fb60000894be163e7285fGreg Clayton    entity.m_user_type = ut;
123224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12338c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.EnableParserVars();
12348c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_parser_type = pt;
12358c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_named_decl  = var_decl;
12368c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_llvm_value  = NULL;
12378c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_lldb_value  = var_location;
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1239810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
12408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
12418de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("Found variable %s, returned (NamedDecl)%p", decl_name.c_str(), var_decl);
12428de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
12438f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
12448f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
12458f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
1246a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
1247a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                                       ClangExpressionVariable *pvar)
1248a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
124945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
125045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1251a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    TypeFromUser user_type = pvar->m_user_type;
1252a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1253a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromParser parser_type(ClangASTContext::CopyType(context.GetASTContext(),
1254a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                                         user_type.GetASTContext(),
1255a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                                         user_type.GetOpaqueQualType()),
1256a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                               context.GetASTContext());
1257a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
12588c12720c108cd5e7ed792596749218d8400f647eSean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
12598c12720c108cd5e7ed792596749218d8400f647eSean Callanan
12608c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->EnableParserVars();
12618c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_parser_type = parser_type;
12628c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_named_decl  = var_decl;
12638c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_llvm_value  = NULL;
12648c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_lldb_value  = NULL;
126545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
126645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
12678de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("Added pvar %s, returned (NamedDecl)%p", pvar->m_name.GetCString(), var_decl);
1268a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1269a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1270a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
12718f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
12720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Function* fun,
12730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Symbol* symbol)
12748f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
12756184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
12768f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
12770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    NamedDecl *fun_decl;
12780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
12790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    const Address *fun_address;
12808f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
12810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
12820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
12830fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    clang::ASTContext *fun_ast_context = NULL;
12848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
12850fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
12860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
128755261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan#define BROKEN_OVERLOADING
128855261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan        // Awaiting a fix on the Clang side
128955261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan#ifndef BROKEN_OVERLOADING
12900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
12910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
12920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
12930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
12940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
12950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no type");
12960fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
12970fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
12980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
1299462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        fun_opaque_type = fun_type->GetClangType();
13000fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
13010fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
13020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
13030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
13040fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no Clang type");
13050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
13060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
13070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
13080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
13090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
13100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        TypeList *type_list = fun_type->GetTypeList();
13110fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_ast_context = type_list->GetClangASTContext().getASTContext();
13120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
13130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
13140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
131555261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan#else
131655261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
131755261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan
131855261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan        fun_decl = context.AddGenericFunDecl();
131955261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan#endif
13200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
13210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
13220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
13230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
13240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
13250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
13260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
13270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
13288f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
1329810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
13300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            log->PutCString("AddOneFunction called with no function and no symbol");
13318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
13328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
13338f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
13348de27c761a22187ef63fb60000894be163e7285fGreg Clayton    lldb::addr_t load_addr = fun_address->GetLoadAddress(m_exe_ctx.target);
13358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
13368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
13378f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
13388c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable()));
13398de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
13408de27c761a22187ef63fb60000894be163e7285fGreg Clayton    entity.m_name.SetCString(decl_name.c_str());
13418c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_user_type  = TypeFromUser(fun_opaque_type, fun_ast_context);;
13428f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
13438c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.EnableParserVars();
13448c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_named_decl  = fun_decl;
13458c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_llvm_value  = NULL;
13468c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_lldb_value  = fun_location.release();
13478c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1348810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
13498de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
13508de27c761a22187ef63fb60000894be163e7285fGreg Clayton        log->Printf("Found %s function %s, returned (NamedDecl)%p", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl);
13518de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
135393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
135493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
135593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
13563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
13573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
135893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
13593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *parser_ast_context = context.GetASTContext();
13603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *user_ast_context = ut.GetASTContext();
13613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
13623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    void *copied_type = ClangASTContext::CopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
13633c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
13643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
136593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
13663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
13673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
13683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
13693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
13703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
13713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
13723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
13733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
13743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
13753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
13763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
13773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
137830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
13791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
13801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
13811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
138230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
138330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
13841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
13851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
13868de27c761a22187ef63fb60000894be163e7285fGreg Clayton                                                   "$__lldb_expr",
13871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
13881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
13891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
13901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
139130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
139230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
13933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
139493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
139593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
139693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
1397