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