ClangExpressionDeclMap.cpp revision 30449d50f5328ca745d09d943b7e3b1ba41bff08
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"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
36f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap(ExecutionContext *exe_ctx) :
42a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    m_exe_ctx(exe_ctx),    m_struct_laid_out(false),
43810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    m_materialized_location(0)
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (exe_ctx && exe_ctx->frame)
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_sym_ctx = new SymbolContext(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything));
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_sym_ctx = NULL;
49a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
50a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (exe_ctx && exe_ctx->process)
51a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        m_persistent_vars = &exe_ctx->process->GetPersistentVariables();
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
558c12720c108cd5e7ed792596749218d8400f647eSean Callanan{
568c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t entity_index = 0, num_entities = m_found_entities.Size();
578c12720c108cd5e7ed792596749218d8400f647eSean Callanan         entity_index < num_entities;
588c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++entity_index)
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
608c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(entity_index));
618c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (entity.m_parser_vars.get() &&
628c12720c108cd5e7ed792596749218d8400f647eSean Callanan            entity.m_parser_vars->m_lldb_value)
638c12720c108cd5e7ed792596749218d8400f647eSean Callanan            delete entity.m_parser_vars->m_lldb_value;
6445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
6545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        entity.DisableParserVars();
6645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    }
6745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
6845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    for (uint64_t pvar_index = 0, num_pvars = m_persistent_vars->Size();
6945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan         pvar_index < num_pvars;
7045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan         ++pvar_index)
7145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    {
7245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        ClangExpressionVariable &pvar(m_persistent_vars->VariableAtIndex(pvar_index));
7345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        pvar.DisableParserVars();
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
768c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_sym_ctx)
778c12720c108cd5e7ed792596749218d8400f647eSean Callanan        delete m_sym_ctx;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
8282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callananvoid
8382b74c85f719be67b78f9284a6a1341d47f7ac9cSean CallananClangExpressionDeclMap::GetPersistentResultName (std::string &name)
8482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{
8582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan    m_persistent_vars->GetNextResultName(m_result_name);
8682b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
8782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan    name = m_result_name;
8882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan}
8982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
908bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
918c12720c108cd5e7ed792596749218d8400f647eSean CallananClangExpressionDeclMap::AddPersistentVariable (const clang::NamedDecl *decl,
928c12720c108cd5e7ed792596749218d8400f647eSean Callanan                                               const char *name,
938c12720c108cd5e7ed792596749218d8400f647eSean Callanan                                               TypeFromParser parser_type)
94a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
95a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    clang::ASTContext *context(m_exe_ctx->target->GetScratchClangASTContext()->getASTContext());
96a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
97a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromUser user_type(ClangASTContext::CopyType(context,
9882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetASTContext(),
9982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan                                                     parser_type.GetOpaqueQualType()),
100a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                            context);
101a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1028c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!m_persistent_vars->CreatePersistentVariable (name, user_type))
1038c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1048c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1058c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *var = m_persistent_vars->GetVariable(name);
1068c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1078c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
1088c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1098c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1108c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->EnableParserVars();
1118c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1128c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_named_decl = decl;
1138c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_parser_type = parser_type;
1148c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1158c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
116a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
117a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
118a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
1198c12720c108cd5e7ed792596749218d8400f647eSean CallananClangExpressionDeclMap::AddValueToStruct (const clang::NamedDecl *decl,
12045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                                          const char *name,
1218c12720c108cd5e7ed792596749218d8400f647eSean Callanan                                          llvm::Value *value,
1228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          size_t size,
1238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          off_t alignment)
1248bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
12545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
12645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_laid_out = false;
1288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1298c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (m_struct_members.GetVariable(decl))
1308c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
1318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1328c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *var = m_found_entities.GetVariable(decl);
1338c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1348c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
1358c12720c108cd5e7ed792596749218d8400f647eSean Callanan        var = m_persistent_vars->GetVariable(decl);
1368c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1378c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!var)
1388c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
1398c12720c108cd5e7ed792596749218d8400f647eSean Callanan
14045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
14145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Adding value for decl %p [%s - %s] to the structure",
14245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
14345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    name,
14445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    var->m_name.c_str());
14545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1468c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
1478c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
1488c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_parser_vars->m_llvm_value = value;
1498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1508c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->EnableJITVars();
1518c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_jit_vars->m_alignment = alignment;
1528c12720c108cd5e7ed792596749218d8400f647eSean Callanan    var->m_jit_vars->m_size = size;
1538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1548c12720c108cd5e7ed792596749218d8400f647eSean Callanan    m_struct_members.AddVariable(*var);
1558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
1578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
1588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
1618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
1628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (m_struct_laid_out)
1638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
1648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
1668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_alignment = 0;
1688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_size = 0;
1698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1708c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
1718c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
1728c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
1738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
1748c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member(m_struct_members.VariableAtIndex(member_index));
1758c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1768c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (!member.m_jit_vars.get())
1778c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
1788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1798c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (member_index == 0)
1808c12720c108cd5e7ed792596749218d8400f647eSean Callanan            m_struct_alignment = member.m_jit_vars->m_alignment;
1818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1828c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (cursor % member.m_jit_vars->m_alignment)
1838c12720c108cd5e7ed792596749218d8400f647eSean Callanan            cursor += (member.m_jit_vars->m_alignment - (cursor % member.m_jit_vars->m_alignment));
1848c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1858c12720c108cd5e7ed792596749218d8400f647eSean Callanan        member.m_jit_vars->m_offset = cursor;
1868c12720c108cd5e7ed792596749218d8400f647eSean Callanan        cursor += member.m_jit_vars->m_size;
1878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
1888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_size = cursor;
1908bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_laid_out = true;
1928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
1938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
1948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool ClangExpressionDeclMap::GetStructInfo (uint32_t &num_elements,
1968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                            size_t &size,
1978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                            off_t &alignment)
1988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
1998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (!m_struct_laid_out)
2008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2028c12720c108cd5e7ed792596749218d8400f647eSean Callanan    num_elements = m_struct_members.Size();
2038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    size = m_struct_size;
2048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    alignment = m_struct_alignment;
2058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
2078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
2088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
2108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::GetStructElement (const clang::NamedDecl *&decl,
2118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          llvm::Value *&value,
2128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          off_t &offset,
21345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                                          const char *&name,
2148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          uint32_t index)
2158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
2168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (!m_struct_laid_out)
2178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2198c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (index >= m_struct_members.Size())
2208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
2218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2228c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &member(m_struct_members.VariableAtIndex(index));
2238c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2248c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!member.m_parser_vars.get() ||
2258c12720c108cd5e7ed792596749218d8400f647eSean Callanan        !member.m_jit_vars.get())
2268c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
2278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
2288c12720c108cd5e7ed792596749218d8400f647eSean Callanan    decl = member.m_parser_vars->m_named_decl;
2298c12720c108cd5e7ed792596749218d8400f647eSean Callanan    value = member.m_parser_vars->m_llvm_value;
2308c12720c108cd5e7ed792596749218d8400f647eSean Callanan    offset = member.m_jit_vars->m_offset;
23145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    name = member.m_name.c_str();
2328c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
2348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
2358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
23602fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
23702fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean CallananClangExpressionDeclMap::GetFunctionInfo (const clang::NamedDecl *decl,
23802fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan                                         llvm::Value**& value,
23902fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan                                         uint64_t &ptr)
240ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
2418c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable *entity = m_found_entities.GetVariable(decl);
2428c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2438c12720c108cd5e7ed792596749218d8400f647eSean Callanan    if (!entity)
2448c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
245ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
2468c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
2478c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
248ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
2498c12720c108cd5e7ed792596749218d8400f647eSean Callanan    value = &entity->m_parser_vars->m_llvm_value;
2508c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ptr = entity->m_parser_vars->m_lldb_value->GetScalar().ULongLong();
2518c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2528c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
253ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
254ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
255f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
256f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean CallananClangExpressionDeclMap::GetFunctionAddress (const char *name,
257f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan                                            uint64_t &ptr)
258f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
259f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
260f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (!m_exe_ctx || !m_exe_ctx->frame || !m_sym_ctx)
261f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
262f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
263f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    ConstString name_cs(name);
264f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContextList sym_ctxs;
265f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
266f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    m_sym_ctx->FindFunctionsByName(name_cs, false, sym_ctxs);
267f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
268f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (!sym_ctxs.GetSize())
269f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
270f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
271f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
272f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    sym_ctxs.GetContextAtIndex(0, sym_ctx);
273f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
274f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    const Address *fun_address;
275f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
276f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
277f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress();
278f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else if (sym_ctx.symbol)
279f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress();
280f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    else
281f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
282f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
283eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    ptr = fun_address->GetLoadAddress(m_exe_ctx->target);
284f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
285f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
286f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
287f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
288810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
289f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
290f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
291f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::Materialize (ExecutionContext *exe_ctx,
292f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                     lldb::addr_t &struct_address,
293f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                     Error &err)
294f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
295f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool result = DoMaterialize(false, exe_ctx, NULL, err);
296f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
297f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
298f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        struct_address = m_materialized_location;
299f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
300f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
301f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
302f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
303f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
3043c9c5eb466869ede185e879d14a47335fb43194dSean CallananClangExpressionDeclMap::GetObjectPointer(lldb::addr_t &object_ptr,
3053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                         ExecutionContext *exe_ctx,
3063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                         Error &err)
3073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{
3083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!exe_ctx || !exe_ctx->frame || !exe_ctx->target || !exe_ctx->process)
3093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because the context is incomplete");
3113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!m_object_pointer_type.GetOpaqueQualType())
3153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't load 'this' because its type is unknown");
3173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    Variable *object_ptr_var = FindVariableInScope(*exe_ctx->frame, "this", &m_object_pointer_type);
3213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!object_ptr_var)
3233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't find 'this' with appropriate type in scope");
3253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(*exe_ctx,
3293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       object_ptr_var,
3303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                       m_object_pointer_type.GetASTContext()));
3313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!location_value.get())
3333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("Couldn't get the location for 'this'");
3353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (location_value->GetValueType() == Value::eValueTypeLoadAddress)
3393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
3413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        uint32_t address_byte_size = exe_ctx->target->GetArchitecture().GetAddressByteSize();
3423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        lldb::ByteOrder address_byte_order = exe_ctx->process->GetByteOrder();
3433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (ClangASTType::GetClangTypeBitWidth(m_object_pointer_type.GetASTContext(), m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8)
3453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
3463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            err.SetErrorStringWithFormat("'this' is not of an expected pointer size");
3473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
3483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
3493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        DataBufferHeap data;
3513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        data.SetByteSize(address_byte_size);
3523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        Error read_error;
3533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (exe_ctx->process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size)
3553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        {
3563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            err.SetErrorStringWithFormat("Coldn't read 'this' from the target: %s", read_error.AsCString());
3573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return false;
3583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        }
3593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size);
3613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        uint32_t offset = 0;
3633c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        object_ptr = extractor.GetPointer(&offset);
3653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return true;
3673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    else
3693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
3703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        err.SetErrorString("'this' is not in memory; LLDB must be extended to handle registers");
3713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return false;
3723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
3733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan}
3743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
3753c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool
376f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::Dematerialize (ExecutionContext *exe_ctx,
377a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                                       ClangExpressionVariable *&result,
378f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                       Error &err)
379f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
38082b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan    return DoMaterialize(true, exe_ctx, &result, err);
381f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
382f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
38332824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool
38432824aa43fdc8393d829c16f126f32ca8d3582adSean CallananClangExpressionDeclMap::DumpMaterializedStruct(ExecutionContext *exe_ctx,
38532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan                                               Stream &s,
38632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan                                               Error &err)
38732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{
38832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (!m_struct_laid_out)
38932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
39032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
39132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
39232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
39332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
39432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (!exe_ctx)
39532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
39632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Received null execution context");
39732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
39832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
39932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
40032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
40132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (!exe_ctx->process)
40232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
40332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the process");
40432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
40532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
40632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
40732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (!exe_ctx->target)
40832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
40932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorString("Couldn't find the target");
41032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
41132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
41232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
41332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    lldb::DataBufferSP data(new DataBufferHeap(m_struct_size, 0));
41432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
41532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    Error error;
41632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    if (exe_ctx->process->ReadMemory (m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize())
41732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
41832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString());
41932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        return false;
42032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
42132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
42232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    DataExtractor extractor(data, exe_ctx->process->GetByteOrder(), exe_ctx->target->GetArchitecture().GetAddressByteSize());
42332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
4248c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
4258c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
4268c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
42732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    {
4288c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member (m_struct_members.VariableAtIndex(member_index));
42932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
4308c12720c108cd5e7ed792596749218d8400f647eSean Callanan        s.Printf("[%s]\n", member.m_name.c_str());
4318c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4328c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (!member.m_jit_vars.get())
4338c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
4348c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4358c12720c108cd5e7ed792596749218d8400f647eSean Callanan        extractor.Dump(&s,                                                      // stream
4368c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       member.m_jit_vars->m_offset,                             // offset
4378c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       lldb::eFormatBytesWithASCII,                             // format
4388c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       1,                                                       // byte size of individual entries
4398c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       member.m_jit_vars->m_size,                               // number of entries
4408c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       16,                                                      // entries per line
4418c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       m_materialized_location + member.m_jit_vars->m_offset,   // address to print
4428c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       0,                                                       // bit size (bitfields only; 0 means ignore)
4438c12720c108cd5e7ed792596749218d8400f647eSean Callanan                       0);                                                      // bit alignment (bitfields only; 0 means ignore)
44432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
44532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan        s.PutChar('\n');
44632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    }
44732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
44832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan    return true;
44932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan}
45032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan
451f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
452f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterialize (bool dematerialize,
453f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                       ExecutionContext *exe_ctx,
454a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                                       ClangExpressionVariable **result,
455f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                       Error &err)
456810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
457336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
45882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
459810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (!m_struct_laid_out)
460810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
461810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
462810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
463810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
464810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
465810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (!exe_ctx)
466810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
467810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Received null execution context");
468810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
469810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
470810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
47145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    if (!exe_ctx->frame)
47245839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    {
47345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        err.SetErrorString("Received null execution frame");
47445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan        return LLDB_INVALID_ADDRESS;
47545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan    }
47645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan
477e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    if (!m_struct_size)
478e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    {
479e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        if (log)
480e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan            log->PutCString("Not bothering to allocate a struct because no arguments are needed");
481e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
482e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        m_allocated_area = NULL;
483e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
484e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan        return true;
485e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan    }
486e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan
487810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    const SymbolContext &sym_ctx(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything));
488810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
489f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
490f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
491f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (m_materialized_location)
492f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
493f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            exe_ctx->process->DeallocateMemory(m_materialized_location);
494f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            m_materialized_location = 0;
495f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
496810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
497f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t mem = exe_ctx->process->AllocateMemory(m_struct_alignment + m_struct_size,
498f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                            lldb::ePermissionsReadable | lldb::ePermissionsWritable,
499f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                            err);
500f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
501f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
502f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
503f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
504f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        m_allocated_area = mem;
505f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
506810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
507f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    m_materialized_location = m_allocated_area;
508810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
509f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (m_materialized_location % m_struct_alignment)
510f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        m_materialized_location += (m_struct_alignment - (m_materialized_location % m_struct_alignment));
511810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
5128c12720c108cd5e7ed792596749218d8400f647eSean Callanan    for (uint64_t member_index = 0, num_members = m_struct_members.Size();
5138c12720c108cd5e7ed792596749218d8400f647eSean Callanan         member_index < num_members;
5148c12720c108cd5e7ed792596749218d8400f647eSean Callanan         ++member_index)
515810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
5168c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable &member (m_struct_members.VariableAtIndex(member_index));
5178c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5188c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (!member.m_parser_vars.get())
5198c12720c108cd5e7ed792596749218d8400f647eSean Callanan            return false;
520810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
5218c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable *entity = m_found_entities.GetVariable(member.m_parser_vars->m_named_decl);
5228c12720c108cd5e7ed792596749218d8400f647eSean Callanan        ClangExpressionVariable *persistent_variable = m_persistent_vars->GetVariable(member.m_name.c_str());
5238c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5248c12720c108cd5e7ed792596749218d8400f647eSean Callanan        if (entity)
525336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
5268c12720c108cd5e7ed792596749218d8400f647eSean Callanan            if (!member.m_jit_vars.get())
5278c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
52882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan
5298c12720c108cd5e7ed792596749218d8400f647eSean Callanan            if (!DoMaterializeOneVariable(dematerialize, *exe_ctx, sym_ctx, member.m_name.c_str(), member.m_user_type, m_materialized_location + member.m_jit_vars->m_offset, err))
530a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                return false;
5318c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
5328c12720c108cd5e7ed792596749218d8400f647eSean Callanan        else if (persistent_variable)
5338c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
53445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            if (!member.m_name.compare(m_result_name))
53545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            {
53645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                if (!dematerialize)
53745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    continue;
5388c12720c108cd5e7ed792596749218d8400f647eSean Callanan
5398c12720c108cd5e7ed792596749218d8400f647eSean Callanan                if (log)
5408c12720c108cd5e7ed792596749218d8400f647eSean Callanan                    log->PutCString("Found result member in the struct");
54145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
5428c12720c108cd5e7ed792596749218d8400f647eSean Callanan                *result = &member;
543f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
544f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
54545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan            if (log)
54645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                log->Printf("Searched for persistent variable %s and found %s", member.m_name.c_str(), persistent_variable->m_name.c_str());
54745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
5488c12720c108cd5e7ed792596749218d8400f647eSean Callanan            if (!DoMaterializeOnePersistentVariable(dematerialize, *exe_ctx, persistent_variable->m_name.c_str(), m_materialized_location + member.m_jit_vars->m_offset, err))
5498c12720c108cd5e7ed792596749218d8400f647eSean Callanan                return false;
550336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        }
5518c12720c108cd5e7ed792596749218d8400f647eSean Callanan        else
5528c12720c108cd5e7ed792596749218d8400f647eSean Callanan        {
5538c12720c108cd5e7ed792596749218d8400f647eSean Callanan            err.SetErrorStringWithFormat("Unexpected variable %s", member.m_name.c_str());
554336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return false;
5558c12720c108cd5e7ed792596749218d8400f647eSean Callanan        }
556810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
557810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
558f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
559f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
560f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
561a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
562a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::DoMaterializeOnePersistentVariable(bool dematerialize,
563a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                                           ExecutionContext &exe_ctx,
564a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                                           const char *name,
565a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                                           lldb::addr_t addr,
566a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                                           Error &err)
56745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan{
568a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ClangExpressionVariable *pvar(m_persistent_vars->GetVariable(name));
569a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
570a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (!pvar)
571a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
572a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        err.SetErrorStringWithFormat("Undefined persistent variable %s", name);
573a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        return LLDB_INVALID_ADDRESS;
574a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
575a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
576a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    size_t pvar_size = pvar->Size();
577a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
578a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    if (!pvar->m_data_vars.get())
579a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan        return false;
580a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan
581a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    uint8_t *pvar_data = pvar->m_data_vars->m_data->GetBytes();
582a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    Error error;
583a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
584a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (dematerialize)
585a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
586a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        if (exe_ctx.process->ReadMemory (addr, pvar_data, pvar_size, error) != pvar_size)
587a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
588a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
589a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
590a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
591a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
592a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    else
593a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    {
594a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        if (exe_ctx.process->WriteMemory (addr, pvar_data, pvar_size, error) != pvar_size)
595a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        {
596a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
597a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan            return false;
598a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        }
599a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    }
600a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
601a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    return true;
602a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
603a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
604f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
605f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterializeOneVariable(bool dematerialize,
606f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 ExecutionContext &exe_ctx,
607f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 const SymbolContext &sym_ctx,
608f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 const char *name,
609f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 TypeFromUser type,
610f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 lldb::addr_t addr,
611f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 Error &err)
612f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
613f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
614f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
615cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    if (!exe_ctx.frame)
616cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return false;
617cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
618cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    Variable *var = FindVariableInScope(*exe_ctx.frame, name, &type);
619f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
620f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!var)
621f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
622f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name);
623f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
624f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
625f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
626841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan    if (log)
627841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan        log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name, type.GetOpaqueQualType());
628f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
629f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
630f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                       var,
631f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                       type.GetASTContext()));
632f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
633f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
634f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
635f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        err.SetErrorStringWithFormat("Couldn't get value for %s", name);
636f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
637f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
638f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
639f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (location_value->GetValueType() == Value::eValueTypeLoadAddress)
640f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
641f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
642f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
643960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton        size_t bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType());
644f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        size_t byte_size = bit_size % 8 ? ((bit_size + 8) / 8) : (bit_size / 8);
645f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
646f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        DataBufferHeap data;
647f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        data.SetByteSize(byte_size);
648f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
649f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t src_addr;
650f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t dest_addr;
651f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
652f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (dematerialize)
653f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
654f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            src_addr = addr;
655f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            dest_addr = value_addr;
656f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
657f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        else
658f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
659f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            src_addr = value_addr;
660f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            dest_addr = addr;
661f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
662f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
663f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        Error error;
664f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), byte_size, error) != byte_size)
665f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
666f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
668f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
669f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
670f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), byte_size, error) != byte_size)
671f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
672f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
673f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
674f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
675f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
676f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (log)
677f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr);
678f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
679f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    else
680f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
681f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        StreamString ss;
682f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
683f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        location_value->Dump(&ss);
684f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
685f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name, ss.GetString().c_str());
686f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
687f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
688f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
689810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
690810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
691cc0746247880e9c87711031ce8a535544f4499d7Sean CallananVariable *
692cc0746247880e9c87711031ce8a535544f4499d7Sean CallananClangExpressionDeclMap::FindVariableInScope(StackFrame &frame,
693cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan                                            const char *name,
694cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan                                            TypeFromUser *type)
695cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan{
696cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
697cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
698cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    ConstString name_cs(name);
699cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
700cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    VariableList *var_list = frame.GetVariableList(true);
701cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
702cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    lldb::VariableSP var = var_list->FindVariable(name_cs);
703cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
704cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    if (!var)
705cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return NULL;
706cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
707cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    if (!type)
708cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return var.get();
709cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
710cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    if (type->GetASTContext() == var->GetType()->GetClangAST())
711cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
712462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var->GetType()->GetClangType()))
713cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan            return NULL;
714cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
715cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    else
716cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    {
717cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        if (log)
718cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan            log->PutCString("Skipping a candidate variable because of different AST contexts");
719cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan        return NULL;
720cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    }
721cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
722cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    return var.get();
723cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
724cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan    return NULL;
725cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan}
726336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetDecls(NameSearchContext &context,
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const char *name)
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7326184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
7333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
734810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
7353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        log->Printf("Hunting for a definition for %s", name);
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Back out in all cases where we're not fully initialized
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_exe_ctx || !m_exe_ctx->frame || !m_sym_ctx)
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
7403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    ConstString name_cs(name);
7423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (!strcmp(name, "___clang_class"))
7443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
7453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        // Clang is looking for the type of "this"
7463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        VariableList *vars = m_exe_ctx->frame->GetVariableList(false);
7483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (!vars)
7503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return;
7513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
7533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (!this_var)
7553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return;
7563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        Type *this_type = this_var->GetType();
7583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (!this_type)
7603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return;
7613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
762462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        TypeFromUser this_user_type(this_type->GetClangType(),
7633c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                    this_type->GetClangAST());
7643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        m_object_pointer_type = this_user_type;
7663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *pointer_target_type;
7683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(),
7703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                            &pointer_target_type))
7713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan            return;
7723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        TypeFromUser class_user_type(pointer_target_type,
7743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                     this_type->GetClangAST());
7753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        AddOneType(context, class_user_type, true);
7773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
7783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        return;
7793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
780cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan
7810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    SymbolContextList sym_ctxs;
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7830fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    m_sym_ctx->FindFunctionsByName(name_cs, false, sym_ctxs);
7840fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
78592aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan    bool found_generic = false;
78692aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan    bool found_specific = false;
78792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan
7880fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    for (uint32_t index = 0, num_indices = sym_ctxs.GetSize();
7890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan         index < num_indices;
7900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan         ++index)
7910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
7920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        SymbolContext sym_ctx;
7930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        sym_ctxs.GetContextAtIndex(index, sym_ctx);
7940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
7950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (sym_ctx.function)
79692aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
79792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan            // TODO only do this if it's a C function; C++ functions may be
79892aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan            // overloaded
79992aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan            if (!found_specific)
80092aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan                AddOneFunction(context, sym_ctx.function, NULL);
80192aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan            found_specific = true;
80292aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
8030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        else if(sym_ctx.symbol)
80492aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        {
80592aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan            if (!found_generic && !found_specific)
80692aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan            {
80792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan                AddOneFunction(context, NULL, sym_ctx.symbol);
80892aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan                found_generic = true;
80992aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan            }
81092aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        }
8110fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
8128f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
8133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    Variable *var = FindVariableInScope(*m_exe_ctx->frame, name);
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
815336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    if (var)
8163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        AddOneVariable(context, var);
81793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
818a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    ClangExpressionVariable *pvar(m_persistent_vars->GetVariable(name));
819a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
820a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    if (pvar)
821a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan        AddOneVariable(context, pvar);
822a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
82393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
8246df0840c87be29724055716db951aa6d494ddabcSean Callanan    // See information on gating of this operation next to the definition for
8256df0840c87be29724055716db951aa6d494ddabcSean Callanan    // m_lookedup_types.
8266df0840c87be29724055716db951aa6d494ddabcSean Callanan
8276df0840c87be29724055716db951aa6d494ddabcSean Callanan    const char *name_uniq = name_cs.GetCString();
8286df0840c87be29724055716db951aa6d494ddabcSean Callanan
8296df0840c87be29724055716db951aa6d494ddabcSean Callanan    if (m_lookedup_types.find(name_uniq) == m_lookedup_types.end())
8306df0840c87be29724055716db951aa6d494ddabcSean Callanan    {
8316df0840c87be29724055716db951aa6d494ddabcSean Callanan        // 1 The name is added to m_lookedup_types.
8326df0840c87be29724055716db951aa6d494ddabcSean Callanan        m_lookedup_types.insert(std::pair<const char*, bool>(name_uniq, true));
8336df0840c87be29724055716db951aa6d494ddabcSean Callanan
8346df0840c87be29724055716db951aa6d494ddabcSean Callanan        // 2 The type is looked up and added, potentially causing more type loookups.
8356df0840c87be29724055716db951aa6d494ddabcSean Callanan        lldb::TypeSP type = m_sym_ctx->FindTypeByName(name_cs);
8366df0840c87be29724055716db951aa6d494ddabcSean Callanan
8376df0840c87be29724055716db951aa6d494ddabcSean Callanan        if (type.get())
8386df0840c87be29724055716db951aa6d494ddabcSean Callanan        {
839462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton            TypeFromUser user_type(type->GetClangType(),
8406df0840c87be29724055716db951aa6d494ddabcSean Callanan                                   type->GetClangAST());
8416df0840c87be29724055716db951aa6d494ddabcSean Callanan
8426df0840c87be29724055716db951aa6d494ddabcSean Callanan            AddOneType(context, user_type, false);
8436df0840c87be29724055716db951aa6d494ddabcSean Callanan        }
8446df0840c87be29724055716db951aa6d494ddabcSean Callanan
8456df0840c87be29724055716db951aa6d494ddabcSean Callanan        // 3 The name is removed from m_lookedup_types.
8466df0840c87be29724055716db951aa6d494ddabcSean Callanan        m_lookedup_types.erase(name_uniq);
8476df0840c87be29724055716db951aa6d494ddabcSean Callanan    }
8486df0840c87be29724055716db951aa6d494ddabcSean Callanan
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
850336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
851336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
852336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::GetVariableValue(ExecutionContext &exe_ctx,
853336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                         Variable *var,
854f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                         clang::ASTContext *parser_ast_context,
855f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                         TypeFromUser *user_type,
856f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                         TypeFromParser *parser_type)
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8586184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
8596184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
864810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
865810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
866336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
869462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton    void *var_opaque_type = var_type->GetClangType();
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
873810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
874810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
875336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TypeList *type_list = var_type->GetTypeList();
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!type_list)
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
882810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
883810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because the type has no associated type list");
884336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext();
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!exe_ast_ctx)
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
891810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
892810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
893336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
896336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
897336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
900178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
901178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
902178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
903178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
904178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
905178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
906eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target);
907178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
910178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, loclist_base_load_addr, NULL, *var_location.get(), &err))
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
912810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
913810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
914336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
917810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext();
918810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
919336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    void *type_to_use;
920336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
921f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
922f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
923f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        type_to_use = ClangASTContext::CopyType(parser_ast_context, var_ast_context, var_opaque_type);
924f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
925f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
926f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
927f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
928336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
929336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
932336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        var_location.get()->SetContext(Value::eContextTypeOpaqueClangQualType, type_to_use);
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
938336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
940336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
945336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
946336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
949eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(m_exe_ctx->target);
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->GetScalar() = load_addr;
95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->SetValueType(Value::eValueTypeLoadAddress);
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
955f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
956f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        *user_type = TypeFromUser(var_opaque_type, var_ast_context);
957336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
958336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
959336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
960336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
961336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
962336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
9633c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                       Variable* var)
964336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
965336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
966336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
967f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
968f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
969336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
970336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Value *var_location = GetVariableValue(*m_exe_ctx,
971336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                           var,
972336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                           context.GetASTContext(),
973f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                           &ut,
974f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                           &pt);
975336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
9763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType());
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9788c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable()));
9793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    entity.m_name       = context.Name.getAsString();
9808c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_user_type  = ut;
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9828c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.EnableParserVars();
9838c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_parser_type = pt;
9848c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_named_decl  = var_decl;
9858c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_llvm_value  = NULL;
9868c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_lldb_value  = var_location;
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
988810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
989f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        log->Printf("Found variable %s, returned (NamedDecl)%p", context.Name.getAsString().c_str(), var_decl);
9908f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
9918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
9928f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
993a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
994a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan                                       ClangExpressionVariable *pvar)
995a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
99645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
99745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
998a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan    TypeFromUser user_type = pvar->m_user_type;
999a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1000a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan    TypeFromParser parser_type(ClangASTContext::CopyType(context.GetASTContext(),
1001a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                                         user_type.GetASTContext(),
1002a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                                                         user_type.GetOpaqueQualType()),
1003a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan                               context.GetASTContext());
1004a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
10058c12720c108cd5e7ed792596749218d8400f647eSean Callanan    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType());
10068c12720c108cd5e7ed792596749218d8400f647eSean Callanan
10078c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->EnableParserVars();
10088c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_parser_type = parser_type;
10098c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_named_decl  = var_decl;
10108c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_llvm_value  = NULL;
10118c12720c108cd5e7ed792596749218d8400f647eSean Callanan    pvar->m_parser_vars->m_lldb_value  = NULL;
101245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
101345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
101445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan        log->Printf("Added pvar %s, returned (NamedDecl)%p", pvar->m_name.c_str(), var_decl);
1015a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1016a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1017a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
10188f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
10190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Function* fun,
10200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                                       Symbol* symbol)
10218f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
10226184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
10238f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
10240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    NamedDecl *fun_decl;
10250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
10260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    const Address *fun_address;
10278f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
10280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    // only valid for Functions, not for Symbols
10290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    void *fun_opaque_type = NULL;
10300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    clang::ASTContext *fun_ast_context = NULL;
10318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
10320fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    if (fun)
10330fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
103455261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan#define BROKEN_OVERLOADING
103555261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan        // Awaiting a fix on the Clang side
103655261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan#ifndef BROKEN_OVERLOADING
10370fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        Type *fun_type = fun->GetType();
10380fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
10390fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_type)
10400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
10410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
10420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no type");
10430fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
10440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
10450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
1046462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton        fun_opaque_type = fun_type->GetClangType();
10470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
10480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        if (!fun_opaque_type)
10490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
10500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
10510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan                log->PutCString("Skipped a function because it has no Clang type");
10520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
10530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
10540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
10550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
10560fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
10570fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        TypeList *type_list = fun_type->GetTypeList();
10580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_ast_context = type_list->GetClangASTContext().getASTContext();
10590fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
10600fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
10610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddFunDecl(copied_type);
106255261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan#else
106355261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan        fun_address = &fun->GetAddressRange().GetBaseAddress();
106455261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan
106555261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan        fun_decl = context.AddGenericFunDecl();
106655261a1dcf50f6594793712eb43173efd4da3a78Sean Callanan#endif
10670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
10680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
10690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
10700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_address = &symbol->GetAddressRangeRef().GetBaseAddress();
10710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
10720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        fun_decl = context.AddGenericFunDecl();
10730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
10740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
10758f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
1076810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
10770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            log->PutCString("AddOneFunction called with no function and no symbol");
10788f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
10798f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
10808f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
1081eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton    lldb::addr_t load_addr = fun_address->GetLoadAddress(m_exe_ctx->target);
10828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
10838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
10848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
10858c12720c108cd5e7ed792596749218d8400f647eSean Callanan    ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable()));
10868c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_name       = context.Name.getAsString();
10878c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_user_type  = TypeFromUser(fun_opaque_type, fun_ast_context);;
10888f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
10898c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.EnableParserVars();
10908c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_named_decl  = fun_decl;
10918c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_llvm_value  = NULL;
10928c12720c108cd5e7ed792596749218d8400f647eSean Callanan    entity.m_parser_vars->m_lldb_value  = fun_location.release();
10938c12720c108cd5e7ed792596749218d8400f647eSean Callanan
1094810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
109592aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan        log->Printf("Found %s function %s, returned (NamedDecl)%p", (fun ? "specific" : "generic"), context.Name.getAsString().c_str(), fun_decl);
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
109793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
109893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid
109993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
11003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   TypeFromUser &ut,
11013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                   bool add_method)
110293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
11033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *parser_ast_context = context.GetASTContext();
11043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    clang::ASTContext *user_ast_context = ut.GetASTContext();
11053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    void *copied_type = ClangASTContext::CopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType());
11073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    TypeFromParser parser_type(copied_type, parser_ast_context);
110993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
11103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    if (add_method && ClangASTContext::IsAggregateType(copied_type))
11113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
11123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *args[1];
11133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false);
11153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
11163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan        void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context,
11173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetBuiltInType_void(parser_ast_context),
11183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 args,
11193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 1,
11203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 false,
11213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan                                                                 ClangASTContext::GetTypeQualifiers(copied_type));
112230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
11231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
11241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
11251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
112630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
112730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
11281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        ClangASTContext::AddMethodToCXXRecordType (parser_ast_context,
11291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   copied_type,
11301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   "___clang_expr",
11311d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   method_type,
11321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   lldb::eAccessPublic,
11331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_virtual,
11341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   is_static,
113530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_inline,
113630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton                                                   is_explicit);
11373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
113893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
113993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan    context.AddTypeDecl(copied_type);
114093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
1141