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