ClangExpressionDeclMap.cpp revision 31903318116cbd66801cd2a526cc5e5873d20e4c
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 1606dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan#include "clang/AST/ASTContext.h" 1747a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h" 18a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 21810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h" 226184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 24061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h" 26f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan#include "lldb/Core/ValueObjectVariable.h" 276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 29a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h" 30cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 326916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 42f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 43d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan#include "lldb/Target/ObjCLanguageRuntime.h" 44810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 4517c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 47f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4878b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 503bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5473b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) : 5573b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTSource (exe_ctx.GetTargetSP()), 568de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 578de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 58dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_keep_result_in_memory (keep_result_in_memory), 59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 60dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_struct_vars () 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 66aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // Note: The model is now that the parser's AST context and all associated 686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // data does not vanish until the expression has been executed. This means 696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // that valuable lookup data (like namespaces) doesn't vanish, but 706d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 716d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan DidParse(); 72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 75aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 76166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool 77427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 788c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 79aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 80dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx = exe_ctx; 81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr()) 84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetThreadPtr()) 86567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 87567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetProcessPtr()) 88987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 89987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 92567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (target) 93987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 94987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 96987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 9797ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan 98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_persistent_vars = &target->GetPersistentVariables(); 101166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetScratchClangASTContext()) 103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 104567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 105166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 10647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info = GetTargetInfo(); 10747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 108166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan return true; 109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 110c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 111427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 112427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 118aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 1216f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (var_sp) 1226f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham { 12331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID()); 12431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 12531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (parser_vars && parser_vars->m_lldb_value) 12631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan delete parser_vars->m_lldb_value; 127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 12831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp->DisableParserVars(GetParserID()); 1296f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham } 130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 136427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 137427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 13831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan pvar_sp->DisableParserVars(GetParserID()); 139aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 140aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 141aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1427a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo() 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 15247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetInfo ret; 15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 154dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 155dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 156dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 157dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (process) 15847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 159dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.byte_order = process->GetByteOrder(); 160dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.address_byte_size = process->GetAddressByteSize(); 161dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan } 162dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan else 163dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan { 164dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 165dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (target) 166567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 167dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.byte_order = target->GetArchitecture().GetByteOrder(); 168dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 169567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 171dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 17247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ret; 17347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 17447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1758de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1768de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 17782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 178aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 179aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 180aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 182427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton Target *target = m_parser_vars->GetTarget(); 183427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (target); 184427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName(); 185427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 186aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 18782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 18882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP 19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name, 19105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan lldb_private::TypeFromParser type, 19205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan const llvm::APInt& value) 19305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{ 19405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan assert (m_parser_vars.get()); 195166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 196dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 197dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 198dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 199dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 200dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!target) 201dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return ClangExpressionVariableSP(); 202567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 203567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 20405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2055a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan TypeFromUser user_type(m_ast_importer->CopyType(context, 2065a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetASTContext(), 2075a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetOpaqueQualType()), 20805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 20947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 210dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!user_type.GetOpaqueQualType()) 211dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 212dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 213dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 214dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 215dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result"); 216dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 217dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 218dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 219dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 220dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (), 221fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 22347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 22447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 2250e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 2260e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2270e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 2280e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2290e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 2300e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2320e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 2330e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 2340e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 24005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 24105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 24205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 24305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 24405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2452bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (size_t byte_idx = 0; 24605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 24805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 24905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 25005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 25105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 25205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 25347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (m_parser_vars->m_target_info.byte_order) 25405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 2550e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 2560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 2610e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2620e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 2630e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 2640e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 2650e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2660e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 2670e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 26805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 26905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 2706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 272696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 273696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2740e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2750e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 27605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 27705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP 279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name, 2809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan VarDecl *decl, 281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb_private::TypeFromParser type) 282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{ 283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan assert (m_parser_vars.get()); 284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 287dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 288dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 289567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 290567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 291567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 292567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 29431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID())); 295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 29731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID()); 298696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 299696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return ClangExpressionVariableSP(); 301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 3025a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan TypeFromUser user_type(m_ast_importer->CopyType(context, 3035a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetASTContext(), 3045a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetOpaqueQualType()), 305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan context); 306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 307dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!user_type.GetOpaqueQualType()) 308bf41e19c78f0c84671d21eadec3954ab6db550c1Jason Molenda { 309dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 310dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result"); 311dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 312dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 313dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 314dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser var_type = var_sp->GetTypeFromUser(); 316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 317dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = exe_ctx.GetFramePtr(); 318567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL) 319567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 320567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 321567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type); 322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var) 324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable 325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 326567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues); 327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_valobj) 329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type); 332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_casted_valobj) 334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (log) 337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan { 338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan StreamString my_stream_string; 339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangASTType::DumpTypeDescription (var_type.GetASTContext(), 341696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_type.GetOpaqueQualType(), 342696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan &my_stream_string); 343696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 344696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 345696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str()); 346696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan } 347696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 348696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj); 349696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 350696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!pvar_sp) 351696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 352696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 353696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name)) 354696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 355696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 356696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 357696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 358696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 359696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 360696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return pvar_sp; 361696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan} 362696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name) 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference); 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj, 37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ConstString &name, 375a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::TypeFromParser type, 376557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool transient, 377557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool maybe_make_load) 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pvar_sp) 38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 385557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 386557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (maybe_make_load && 387557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.GetValueType() == Value::eValueTypeFileAddress && 388dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessPtr()) 389557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 390557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.SetValueType(Value::eValueTypeLoadAddress); 391557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 394a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !pvar_sp->m_live_sp && 395a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !transient) 39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 39747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The reference comes from the program. We need to set up a live SP for it. 39847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 399dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen unsigned long long address = value.GetScalar().ULongLong(); 400dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen AddressType address_type = value.GetValueAddressType(); 401dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen 402dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetASTContext(), 40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetOpaqueQualType(), 40547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetName(), 406dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen address, 407dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen address_type, 40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetByteSize()); 40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry) 41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->ValueUpdated(); 41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t pvar_byte_size = pvar_sp->GetByteSize(); 41647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4188f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (!ReadTarget(pvar_data, value, pvar_byte_size)) 4198f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return false; 42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry); 42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan valobj = pvar_sp; 42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 42747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 42847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananvoid 4308f2e392e8937aaf66f91201dc5f4190d61902c67Sean CallananClangExpressionDeclMap::RemoveResultVariable 4318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan( 4328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan const ConstString &name 4338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan) 4348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan{ 4358f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 4368f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan m_parser_vars->m_persistent_vars->RemovePersistentVariable(pvar_sp); 4378f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan} 4388f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 4398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 4408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 4418de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 4438de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 4456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 4466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 4478de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 448a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 449aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 4516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 452dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 453dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 456567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 458a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 4590539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan TypeFromUser user_type(m_ast_importer->DeportType(context, 4600539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetASTContext(), 4610539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetOpaqueQualType()), 46297678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 4635a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 4645a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!user_type.GetOpaqueQualType()) 4655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 4665a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (log) 4675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Persistent variable's type wasn't copied successfully"); 4685a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 4695a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 47147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_parser_vars->m_target_info.IsValid()) 47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 473a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 474dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (), 475fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 476427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 47747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 47847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 4798c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan 481427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan 483427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4848c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan 486bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan var_sp->m_frozen_sp->SetHasCompleteType(); 487bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan 4886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 4896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 4906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 4926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 4946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 4966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 5006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 5016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 5026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 5036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 5046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 5056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 50631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp->EnableParserVars(GetParserID()); 50731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 50831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID()); 5098c12720c108cd5e7ed792596749218d8400f647eSean Callanan 51031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = decl; 51131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 5128c12720c108cd5e7ed792596749218d8400f647eSean Callanan 5138c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 514a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 515a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 516a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 5178de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 5188de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 5208de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 5218de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 5228de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 5238de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 5248de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 526aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 527aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 528aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 529e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 53045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 531aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 5328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 53331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (m_struct_members.GetVariable(decl, GetParserID())) 5348c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 5358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 53631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID())); 5378c12720c108cd5e7ed792596749218d8400f647eSean Callanan 538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 53931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID()); 5408c12720c108cd5e7ed792596749218d8400f647eSean Callanan 541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 5428c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5438c12720c108cd5e7ed792596749218d8400f647eSean Callanan 54445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 5455a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure", 54645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 5478de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 548427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 54945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 5508c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 5518c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 5528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 55331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID()); 55431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 55531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = value; 55631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 55731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp->EnableJITVars(GetParserID()); 55831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 55931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID()); 56031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 56131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan jit_vars->m_alignment = alignment; 56231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan jit_vars->m_size = size; 5638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 564427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 5718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 572aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 573aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 574aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 5758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 5788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 579aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 5818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 582427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 5838c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 5848c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 5858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 588427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 58931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 59031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID()); 591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 59231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!jit_vars) 5938c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5958c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 59631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan m_struct_vars->m_struct_alignment = jit_vars->m_alignment; 5978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 59831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (cursor % jit_vars->m_alignment) 59931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan cursor += (jit_vars->m_alignment - (cursor % jit_vars->m_alignment)); 6008c12720c108cd5e7ed792596749218d8400f647eSean Callanan 60131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan jit_vars->m_offset = cursor; 60231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan cursor += jit_vars->m_size; 6038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 6048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 605aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 6068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 607aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 6088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6118de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 6128de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6138de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 6148de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 6158de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 6168de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 618aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 619aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 620aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 6218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 623427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 624aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 625aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 6268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 6318de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 6328de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *&decl, 6348de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 6358de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 6368de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 6378de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 6388de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 640aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 641aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 642aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 6438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 6468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 6498c12720c108cd5e7ed792596749218d8400f647eSean Callanan 65031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!member_sp) 65131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan return false; 65231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 65331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = member_sp->GetParserVars(GetParserID()); 65431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID()); 65531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 65631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!parser_vars || 65731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan !jit_vars || 65853a5a9986e2a201717ea723f67ae32571be95b32Sean Callanan !member_sp->GetValueObject()) 6598c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 6608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 66131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan decl = parser_vars->m_named_decl; 66231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan value = parser_vars->m_llvm_value; 66331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan offset = jit_vars->m_offset; 664427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 66902fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 6708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 6718de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 6738de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 6748de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 675ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 67631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl, GetParserID())); 6778c12720c108cd5e7ed792596749218d8400f647eSean Callanan 678427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 6798c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 680ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 6818c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 6828c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 683ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 68431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity_sp->GetParserVars(GetParserID()); 68531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 68631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ptr = parser_vars->m_lldb_value->GetScalar().ULongLong(); 6878c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6888c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 689ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 690ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 691ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void 692ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext 693ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan( 694ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan const ConstString &name, 695ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContext &sym_ctx, 696ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContextList &sc_list 697ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan) 698ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{ 699ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (sym_ctx.module_sp) 700aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 701ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 702ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (!sc_list.GetSize()) 703ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 704ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan} 705ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 706f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 7078de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 7088de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 7098de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 710da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 7118de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 712f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 713aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 714aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 715aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 716dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 717dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 718f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 719567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 72078b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 72178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 722f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 723f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 724e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 725f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 726ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 727ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 728e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 729aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 730aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 731aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 732aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 7330eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan if (!strncmp(name.GetCString(), "_ZN", 3) && 7340eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan strncmp(name.GetCString(), "_ZNK", 4)) 735aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 7360eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan std::string fixed_scratch("_ZNK"); 7370eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan fixed_scratch.append(name.GetCString() + 3); 7380eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan ConstString fixed_name(fixed_scratch.c_str()); 739aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 740aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 7410eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString()); 7420eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan 7430eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list); 744aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 745aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 746aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 747aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 748f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 749f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 750f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 751e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 752f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 753da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 754f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 755f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 756da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 757f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 7580c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_so_addr = &sym_ctx.symbol->GetAddress(); 759f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 760f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 761f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 762ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 763ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 764ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 765567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton func_addr = func_so_addr->GetCallableLoadAddress (target); 766da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 767f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 768f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 769f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 770cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 771d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, Process *process, const ConstString &name, lldb::SymbolType symbol_type) 772c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 773c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 774c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 77521ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list); 776c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 777cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 778cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 779cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 78021ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++) 781cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 782cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 783cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 784c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 7850c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddress(); 786ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 787ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 788ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return LLDB_INVALID_ADDRESS; 789ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 790cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 791cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 792cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 793cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 794cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 795cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 796cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 797cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 798cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 799cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 800cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 801cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 802cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 803cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 804cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 805cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 806cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 807cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 808cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 809cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 810cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 811cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 812cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 813cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 814cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 815cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 816cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 817cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 818cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 819cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 820cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 8213f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCClass: 8223f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCMetaClass: 8233f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCIVar: 824cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 825cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 826cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 827cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 828cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 829c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 830d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan if (symbol_load_addr == LLDB_INVALID_ADDRESS && process) 831d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan { 832d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime(); 833d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan 834d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan if (runtime) 835d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan { 836d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan symbol_load_addr = runtime->LookupRuntimeSymbol(name); 837d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan } 838d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan } 839d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan 840cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 841c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 842c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 843cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 84421ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type) 845819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 846819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 847819749647b1605f75753f625050cb240292c08b0Sean Callanan 848dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_exe_ctx.GetTargetPtr()) 849819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 850819749647b1605f75753f625050cb240292c08b0Sean Callanan 851d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), m_parser_vars->m_exe_ctx.GetProcessPtr(), name, symbol_type); 852819749647b1605f75753f625050cb240292c08b0Sean Callanan} 853819749647b1605f75753f625050cb240292c08b0Sean Callanan 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 856557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue 857557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr) 858557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{ 859557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan Value ret; 860557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 861557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 862557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 863dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (m_parser_vars->m_exe_ctx.GetProcessPtr()) 864557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 865557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 866557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeFileAddress); 867557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 868557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.GetScalar() = (unsigned long long)addr; 869557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 870557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return ret; 871557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan} 872557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value, 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint8_t *data, 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 880dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 882dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 885567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 888dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err)) 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return reg_ctx->WriteRegister(reg_info, reg_value); 90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 910567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 913dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 919567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = file_addr.GetLoadAddress(target); 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 922567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory(load_addr, data, length, err); 92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 937e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan { 938e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan if (value.GetScalar().ULongLong() == 0 || data == NULL) 939e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan return false; 940e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan memcpy ((void *)value.GetScalar().ULongLong(), data, length); 941e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan return true; 942e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan } 94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data, 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 956dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 957567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 958dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 959567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 962567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 965dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx->ReadRegister(reg_info, reg_value)) 97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 977567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err); 97847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 98247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 98347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 98447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 98547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 98647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 987dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 988567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 993567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 997b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan target->ReadMemory(file_addr, false, data, length, err); 99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 1003567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 100547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 1007567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 100847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 101147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 10125a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 10135a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan void *host_addr = (void*)value.GetScalar().ULongLong(); 10145a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 10155a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!host_addr) 10165a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 10175a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 10185a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan memcpy (data, host_addr, length); 101947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 10205a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 102147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 102247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 102347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 102447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 102547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 102647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 102747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value 102852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags) 102947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 103047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 1031dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 103231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl, GetParserID())); 103331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID())); 10341c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 103547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (expr_var_sp) 103647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 103752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan flags = expr_var_sp->m_flags; 103852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 103931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = expr_var_sp->GetParserVars(GetParserID()); 104031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 104131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!parser_vars) 10426d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan return Value(); 10436d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 10441c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference; 1045b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 104631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (parser_vars->m_lldb_var) 10471c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan { 104831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan std::auto_ptr<Value> value(GetVariableValue(parser_vars->m_lldb_var, NULL)); 10491c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1050b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 1051b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 1052dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1053b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1054b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!process) 1055b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return Value(); 1056b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1057b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 1058b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan Error read_error; 1059b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error); 1060b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1061b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!read_error.Success()) 1062b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return Value(); 1063b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1064b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan value->GetScalar() = (unsigned long long)ref_value; 1065b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 1066b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1067b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (value.get()) 1068b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return *value; 1069b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan else 10701c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 1071b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 107231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan else if (parser_vars->m_lldb_sym) 1073b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 107431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan const Address sym_address = parser_vars->m_lldb_sym->GetAddress(); 10751c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1076b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!sym_address.IsValid()) 10771c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 1078b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1079b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan Value ret; 1080b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 10816cdedde154e8b95758596775463a086352baee63Sean Callanan ProcessSP process_sp (m_parser_vars->m_exe_ctx.GetProcessSP()); 10826cdedde154e8b95758596775463a086352baee63Sean Callanan 10836cdedde154e8b95758596775463a086352baee63Sean Callanan if (process_sp) 10846cdedde154e8b95758596775463a086352baee63Sean Callanan { 10856cdedde154e8b95758596775463a086352baee63Sean Callanan uint64_t symbol_load_addr = sym_address.GetLoadAddress(&process_sp->GetTarget()); 10866cdedde154e8b95758596775463a086352baee63Sean Callanan 10876cdedde154e8b95758596775463a086352baee63Sean Callanan ret.GetScalar() = symbol_load_addr; 10886cdedde154e8b95758596775463a086352baee63Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 10896cdedde154e8b95758596775463a086352baee63Sean Callanan } 10906cdedde154e8b95758596775463a086352baee63Sean Callanan else 10916cdedde154e8b95758596775463a086352baee63Sean Callanan { 10926cdedde154e8b95758596775463a086352baee63Sean Callanan uint64_t symbol_file_addr = sym_address.GetFileAddress(); 10936cdedde154e8b95758596775463a086352baee63Sean Callanan 10946cdedde154e8b95758596775463a086352baee63Sean Callanan ret.GetScalar() = symbol_file_addr; 10956cdedde154e8b95758596775463a086352baee63Sean Callanan ret.SetValueType(Value::eValueTypeFileAddress); 10966cdedde154e8b95758596775463a086352baee63Sean Callanan } 10971c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1098b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return ret; 10991c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan } 110052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo()) 110152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan { 110252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 110352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 110452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (!frame) 110552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return Value(); 110652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 110752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan RegisterContextSP reg_context_sp(frame->GetRegisterContextSP()); 110852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 110952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan RegisterValue reg_value; 111052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 111152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (!reg_context_sp->ReadRegister(reg_info, reg_value)) 111252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return Value(); 111352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 111452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan Value ret; 111552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 111652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan ret.SetContext(Value::eContextTypeRegisterInfo, reg_info); 11177c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton if (reg_info->encoding == eEncodingVector) 11187c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton { 11197c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton if (ret.SetVectorBytes((uint8_t *)reg_value.GetBytes(), reg_value.GetByteSize(), reg_value.GetByteOrder())) 11207c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton ret.SetScalarFromVector(); 11217c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton } 11227c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton else if (!reg_value.GetScalarValue(ret.GetScalar())) 11237c5e22f2edf0a0ef17e3a401c814a873399d108aGreg Clayton return Value(); 112452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 112552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return ret; 112652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan } 11274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 1128b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 11294b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 1130b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 113147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 113247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else if (persistent_var_sp) 113347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 113452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan flags = persistent_var_sp->m_flags; 113552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 1136a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference || 1137a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) && 113886a07da76f615533a06a797dc4539566951b58d3Sean Callanan persistent_var_sp->m_live_sp && 1139f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress && 1140dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessSP() && 1141dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessSP()->IsAlive()) || 1142f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress))) 1143a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 11444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return persistent_var_sp->m_live_sp->GetValue(); 1145a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 1146a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan else 1147a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 1148a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::Value ret; 1149a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetValueType(Value::eValueTypeHostAddress); 1150a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 1151a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes(); 1152a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return ret; 1153a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 115447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 115547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 115647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 115747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Value(); 115847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 115947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 116047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11614b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue 11624b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name) 11634b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{ 11644b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan assert(m_parser_vars.get()); 11654b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1166dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 11674b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11684b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!frame) 11694b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11704b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11714b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan VariableList *vars = frame->GetVariableList(false); 11724b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11734b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!vars) 11744b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11754b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11764b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::VariableSP var = vars->FindVariable(name); 11774b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11784b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!var || 11794b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->IsInScope(frame) || 11804b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->LocationIsValidForFrame (frame)) 11814b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11824b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1183dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan std::auto_ptr<Value> value(GetVariableValue(var, NULL)); 11844b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 118541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 118641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan { 1187dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 118841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 118941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (!process) 119041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan return Value(); 119141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 119241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 119341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan Error read_error; 119441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error); 119541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 119641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (!read_error.Success()) 119741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan return Value(); 119841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 119941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan value->GetScalar() = (unsigned long long)ptr_value; 120041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan } 120141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 12024b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (value.get()) 12034b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return *value; 12044b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 12054b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 12064b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan} 12074b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1208810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 1209f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1210f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 12118de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 12128de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 12138de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 12148de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 12158de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1216f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1217dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars.get()) 1218dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return false; 1219dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 1220aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 1221aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1222dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_material_vars->m_process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1223aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 12240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan bool result = DoMaterialize(false /* dematerialize */, 12250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* top of stack frame */, 12260ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* bottom of stack frame */, 12270ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan NULL, /* result SP */ 12280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan err); 1229f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1230f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 1231aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 1232f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1233f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 1234f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1235f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1236f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 12378de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 12388de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 12398de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 12403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 1241047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 1242047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 12438de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 12443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 1245aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1246aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1247dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1248dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1249dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1250567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1251567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL || process == NULL || target == NULL) 12523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1253e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString()); 12543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1257aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 12583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1259e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString()); 12603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12613c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 126339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan const bool object_pointer = true; 126470c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan 1265567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP object_ptr_var = FindVariableInScope (*frame, 1266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 126770c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type), 126839d1af981f6a76603356fd84b2e9372a9172297cSean Callanan object_pointer); 12693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 12713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1272e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString()); 12733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1276dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(object_ptr_var, 1277aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 12783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 12803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 12813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 12823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 128550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 12863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 128750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 128850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 128950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 129050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 12913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 129250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 1293567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize(); 129450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 129550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 129650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 129750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 129850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 129950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 130050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 130150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 130250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 1303567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton object_ptr = process->ReadPointerFromMemory (value_addr, read_error); 1304c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS) 130550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 130650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 130750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 1308c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 130950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 13103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 131150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 13123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 131350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 131450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 131550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 131650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 131750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 131850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 131950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 132050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 132150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1322061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 132350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1324061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 132550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 132650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 132750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 132850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 132950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1330dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 133150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1332061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 133350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 1334061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 133550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 133650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 133750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1338061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 133950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1340061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 134150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 134250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 13433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 13443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 13453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 13463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 13473c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 13488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 13498de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 13510ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 13520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 13538de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13548de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1355f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1356dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return DoMaterialize(true, stack_frame_top, stack_frame_bottom, &result_sp, err); 1357aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1358aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 1359aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 1360aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1361aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 1362aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 1363aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1364aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 1365aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1366aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1367aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1368aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 1369aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1370aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 1371aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 1372aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 1373aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1374aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1375aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1376aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 1377aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1378f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1379f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 138032824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 13818de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 13828de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 13838de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 13848de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13858de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 138632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 1387aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1388aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 1389aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1390aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 139132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 139232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 139332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 139432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 1395dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1396567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1397567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 139832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 139932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 140032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 140132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 140232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1403dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1404567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 140532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 140632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 140732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 140832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 140932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 14103371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 14113371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 14123371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 14133371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 14143371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 14153371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 1416c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 141732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 141832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 1419567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (m_material_vars->m_materialized_location, 1420c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetBytes(), 1421c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetByteSize(), error) != data_sp->GetByteSize()) 142232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 142332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 142432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 142532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 142632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1427567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize()); 142832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1429427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 1430427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 1431427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 143232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 1433427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 143432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1435427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 1436427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 1437427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1438427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 14398c12720c108cd5e7ed792596749218d8400f647eSean Callanan 144031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID()); 144131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 144231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!jit_vars) 14438c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 14448c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1445427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 144631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan jit_vars->m_offset, // offset 1447427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 1448427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 144931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan jit_vars->m_size, // number of entries 1450427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 145131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan m_material_vars->m_materialized_location + jit_vars->m_offset, // address to print 1452427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 1453427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 145432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 145532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 145632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 145732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 145832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 145932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 146032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1461f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 14628de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 14638de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 14648de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 14650ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 14660ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 1467427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 14688de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 14698de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1470810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 1471427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 1472427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 1473427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1476e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 147782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 1478aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 1479810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1480810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 148157067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 1482810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1483810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1484dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1485567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 148645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 148745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 148857067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 148945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 1490dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 149145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 1492567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangPersistentVariables &persistent_vars = target->GetPersistentVariables(); 1493aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1494aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 1495e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 1496e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 1497e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 1498e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1499f99355834bee84e48e2b6205ed13d307faa74405Filipe Cabecinhas m_material_vars->m_allocated_area = 0UL; 1500e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1501e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 1502e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 1503e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1504567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything)); 1505810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1506f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 1507f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1508dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1509aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1510f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1511567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->DeallocateMemory(m_material_vars->m_materialized_location); 1512aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1513f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1514810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 15157a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 15167a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 15177a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 1518567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 15195a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 15205a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err); 1521f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1522f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 15235a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 15245f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct", 15255a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size)); 1526f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 15275a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 15285a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 1529aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 1530f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1531810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1532aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 1533810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1534aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 1535aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location += (m_struct_vars->m_struct_alignment - (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)); 1536810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 15388c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 15398c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 1540810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 15424d0b110715d321d366dec1dc690300f713b63236Sean Callanan 154331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID()); 154431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 154531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!jit_vars) 154631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan { 154731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan err.SetErrorString("Variable being materialized doesn't have JIT state"); 154831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan return false; 154931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan } 155031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 1551a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 1552336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 155325db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan if (!member_sp->GetValueObject()) 155425db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan { 155525db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan err.SetErrorString("Variable being materialized doesn't have a frozen version"); 155625db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan return false; 155725db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan } 155825db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan 1559a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 1560427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 15611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 15621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 15631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1564dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 15651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 15675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 15685a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Couldn't get register context"); 15691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15705a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 15715a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 1572427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 1573427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 1574427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 157531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan m_material_vars->m_materialized_location + jit_vars->m_offset, 1576427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 15771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 158031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan { 1581427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 15826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 15836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 158431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan m_material_vars->m_materialized_location + jit_vars->m_offset, 1585427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 15861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15888c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1589a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 15908c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 1591a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 1592a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 1593a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 159445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 15956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1596a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 1597a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1598a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 1599a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1601a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 1602a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1604a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 1605a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 1606a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 1607a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 160831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan m_material_vars->m_materialized_location + jit_vars->m_offset, 16090ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_top, 16100ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom, 1611a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 1612a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 1613f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1614a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 1615a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1616a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 16178c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1618a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 16198c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1620810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1621810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1622f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1623f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1624f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1625a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 16268de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 16278de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 16288de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 1629427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 16308de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 16310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 16320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 16338de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 16348de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1635aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 16366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 16376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1639a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1640427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1641a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1642a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1643a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1645a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 16485a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 16495a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Persistent variable being materialized contains no data"); 1650a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 16515a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 1652a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1653a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1654dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1655567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 16566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 16576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1658a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1659a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 16626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 16646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 16656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 16676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 1669567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->ReadPointerFromMemory (addr, read_error); 16706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 16726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 16746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 16786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 16796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 16816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 16826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1683dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 168447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 168547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 168647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 168747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 168847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 168947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 16906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 16936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 16956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1698b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 16996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 17016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 170497678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 170597678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 17066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 17086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 17105f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("Dematerializing %s from 0x%" PRIx64 " (size = %u)", var_sp->GetName().GetCString(), (uint64_t)mem, (unsigned)pvar_byte_size); 17116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 17130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 17146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 1715567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 17166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 17186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17210ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan if (stack_frame_top != LLDB_INVALID_ADDRESS && 17220ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom != LLDB_INVALID_ADDRESS && 17230ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem >= stack_frame_bottom && 17240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem <= stack_frame_top) 17250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 17260ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // If the variable is resident in the stack frame created by the expression, 17270ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // then it cannot be relied upon to stay around. We treat it as needing 17280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // reallocation. 17290ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 17300ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 17310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 17320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; 17330ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 17340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 17356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 17366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 17396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 17406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 17446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 17466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1747567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(mem); 17486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 17506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 17526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1758a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1760a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1761a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1762a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1763a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1764a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 17666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 17736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1774567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->AllocateMemory(pvar_byte_size, 17754b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 17764b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan allocate_error); 17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 17796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 17816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 17855f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf("Allocated %s (0x%" PRIx64 ") sucessfully", var_sp->GetName().GetCString(), mem); 17866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 17886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1789dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 179047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 179147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 179247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 179347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 179447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 179547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 17966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 17986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 18006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 18016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 18036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1804567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 18056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 18066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 18076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 18126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 18136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 18146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 18156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1816567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 18174b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan var_sp->m_live_sp->GetValue().GetScalar(), 18184b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan process->GetAddressByteSize(), 18194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan write_error)) 18206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 18216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1826c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong()); 18276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1828696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1829a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 18306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1831a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1832a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1833a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1834a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1835a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1836a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1837a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1838f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 18398de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 18408de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 18418de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 18428de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 18436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 18448de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 18458de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 18468de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1847f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1848e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1849dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1850dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1851dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 185231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 185331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *var_parser_vars = expr_var->GetParserVars(GetParserID()); 1854567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 185531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!frame || !process || !target || !m_parser_vars.get() || !var_parser_vars) 18565a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 18575a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Necessary state for variable materialization isn't present"); 1858cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 18595a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 1860cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 18616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 18626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 18646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 18656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 186631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan VariableSP &var(var_parser_vars->m_lldb_var); 186731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan const lldb_private::Symbol *symbol = var_parser_vars->m_lldb_sym; 1868f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 18696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference); 18706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 1871819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 18724a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1873819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1874819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1875dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan location_value.reset(GetVariableValue(var, 1876819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1877819749647b1605f75753f625050cb240292c08b0Sean Callanan } 187801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton else if (symbol) 18794a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan { 1880d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan addr_t location_load_addr = GetSymbolAddress(*target, process, name, lldb::eSymbolTypeAny); 1881819749647b1605f75753f625050cb240292c08b0Sean Callanan 1882cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (location_load_addr == LLDB_INVALID_ADDRESS) 1883819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1884819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1885c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s", 1886c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1887819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1888819749647b1605f75753f625050cb240292c08b0Sean Callanan 18894a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan location_value.reset(new Value); 18904a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1891819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1892819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1893819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1894819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1895f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1896c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type", 1897c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1898f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1899f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1900f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1901841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 1902fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1903fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan StreamString my_stream_string; 1904fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1905fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangASTType::DumpTypeDescription (type.GetASTContext(), 1906fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan type.GetOpaqueQualType(), 1907fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan &my_stream_string); 1908fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1909c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf ("%s %s with type %s", 1910c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton dematerialize ? "Dematerializing" : "Materializing", 1911c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1912c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton my_stream_string.GetString().c_str()); 1913fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1914f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1915f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1916f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 19178de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1918f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1919f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 192017c6a05cb96f7110332342326a90692d9505982eSean Callanan 192117c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1922f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 19236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 19246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 192517c6a05cb96f7110332342326a90692d9505982eSean Callanan 192617c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 192717c6a05cb96f7110332342326a90692d9505982eSean Callanan 192817c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1929f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 193017c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1931f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 193217c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 193317c6a05cb96f7110332342326a90692d9505982eSean Callanan 193417c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 193517c6a05cb96f7110332342326a90692d9505982eSean Callanan 1936c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s", 1937c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1938c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 193917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1940f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 194117c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 194217c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1943f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 19446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 194517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1946c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error write_error; 19476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19486f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 19496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 19506f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error read_error; 19516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error); 19536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19546f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!read_error.Success()) 19556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19566f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s", 19576f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19586f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan read_error.AsCString()); 19596f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19606f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19616f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19626f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WritePointerToMemory(addr, 19636f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan ref_value, 19646f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 19656f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19666f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 19676f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19686f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 19696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19726f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 19736f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19746f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WriteScalarToMemory (addr, 19756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan location_value->GetScalar(), 19766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 19776f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 19786f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19796f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 19806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 19826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 198517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1986f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 198717c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 198817c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1989f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 19906916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 199117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 199217c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 199317c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 199417c6a05cb96f7110332342326a90692d9505982eSean Callanan 1995c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s", 1996c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1997c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 199817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 199917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 200017c6a05cb96f7110332342326a90692d9505982eSean Callanan 2001061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 200217c6a05cb96f7110332342326a90692d9505982eSean Callanan 2003061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 200417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2005c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't get the register information for %s", 2006c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 200717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 200817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 200917c6a05cb96f7110332342326a90692d9505982eSean Callanan 2010061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 2011061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2012dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 2013061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2014061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 201517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2016c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s", 2017c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2018c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 201917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 202017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 202117c6a05cb96f7110332342326a90692d9505982eSean Callanan 2022061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 202317c6a05cb96f7110332342326a90692d9505982eSean Callanan 202417c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 202517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 20266f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 20276f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; // reference types don't need demateralizing 20286f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 20306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 20326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 20336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 20346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2037b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 20386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 20396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 20406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2043c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar ®_addr = expr_var->m_live_sp->GetValue().GetScalar(); 204417c6a05cb96f7110332342326a90692d9505982eSean Callanan 2045c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, 2046c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 2047c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 2048c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 2049061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 205017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 2051061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2052061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 205317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2054c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to register %s", 2055c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2056c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 205717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 205817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 20596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 20616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2062567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong()); 20636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 20656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2066c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s", 2067c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2068c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton deallocate_error.AsCString()); 20696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 207317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 207417c6a05cb96f7110332342326a90692d9505982eSean Callanan else 207517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 20766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error write_error; 20776f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20786f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan RegisterValue reg_value; 20796f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!reg_ctx->ReadRegister (reg_info, reg_value)) 20816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read %s from %s", 20836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 20846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name); 20856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 20866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 20896f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20906f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error = reg_ctx->WriteRegisterValueToMemory(reg_info, 20916f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr, 20926f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 20936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_value); 20946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!write_error.Success()) 20966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s", 20986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 20996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name, 21006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 21016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 21026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 21036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 21046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; 21056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 21066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 21076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the 21086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 21096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 21106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 21116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2112567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Scalar reg_addr (process->AllocateMemory (value_byte_size, 21136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 21146f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan allocate_error)); 21156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2116c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS) 21176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2118c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s", 2119c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2120c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error.AsCString()); 21216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 21226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 21236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 21246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 21256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2126dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan expr_var->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 212747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 212847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 212947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 2130c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 213147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 213247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 21336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 21346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 21356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 2136567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 21376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_addr, 21386f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 21396f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 21406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2141c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 2142c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2143c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 21446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 21456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 21466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 21476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 214817c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2149c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is too big to store in %s", 2150c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2151c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 215217c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 215317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 2154061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2155061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 215617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2157c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from %s", 2158c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2159c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 216017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 216117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 216217c6a05cb96f7110332342326a90692d9505982eSean Callanan 2163c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->WriteRegisterValueToMemory (reg_info, 2164c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 2165c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 2166c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 2167061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 216817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 216917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 2170f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2171f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2172f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 2173f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 2174810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 2175810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 21761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 21771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 21781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 21791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 21801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 2181b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 21821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 21831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 21841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 21851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 21861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 2187061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 21881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 21891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2190061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 2191061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 21921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2193bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 21941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2197061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 21981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2199061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 22001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 22011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 22021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 22031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 22041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 22051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2206061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 22071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2208061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 22091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 22101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 22111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2212061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 2213061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 22141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 221595b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString()); 22161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 22171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 22181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 22191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 22201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 22211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 22221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2223696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 22248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 22258de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 22268de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 22278de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 222870c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan TypeFromUser *type, 222939d1af981f6a76603356fd84b2e9372a9172297cSean Callanan bool object_pointer 22308de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 2231aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 2232e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2233cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 2234f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan ValueObjectSP valobj; 2235f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan VariableSP var_sp; 2236f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan Error err; 2237f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan 2238f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan valobj = frame.GetValueForVariableExpressionPath(name.GetCString(), 2239f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan eNoDynamicValues, 2240f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 2241f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan var_sp, 2242f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan err); 22433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2244f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan if (!err.Success() || 2245f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan !var_sp || 2246ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->IsInScope(&frame) || 2247ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->LocationIsValidForFrame (&frame)) 2248ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return lldb::VariableSP(); 22493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 22504207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (var_sp) 22513bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 22524207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (!type) 22534207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return var_sp; 22544207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 225539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan TypeFromUser candidate_type(var_sp->GetType()->GetClangFullType(), 225639d1af981f6a76603356fd84b2e9372a9172297cSean Callanan var_sp->GetType()->GetClangAST()); 225739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 225839d1af981f6a76603356fd84b2e9372a9172297cSean Callanan if (candidate_type.GetASTContext() != type->GetASTContext()) 22593bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 226039d1af981f6a76603356fd84b2e9372a9172297cSean Callanan if (log) 226139d1af981f6a76603356fd84b2e9372a9172297cSean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 226239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan return lldb::VariableSP(); 226339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan } 226439d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 226539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan if (object_pointer) 226639d1af981f6a76603356fd84b2e9372a9172297cSean Callanan { 226739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan clang::QualType desired_qual_type = clang::QualType::getFromOpaquePtr(type->GetOpaqueQualType()); 226839d1af981f6a76603356fd84b2e9372a9172297cSean Callanan clang::QualType candidate_qual_type = clang::QualType::getFromOpaquePtr(candidate_type.GetOpaqueQualType()); 226939d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 22704207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan const clang::ObjCObjectPointerType *desired_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>(); 22714207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan const clang::ObjCObjectPointerType *candidate_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>(); 22724207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 22734207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (desired_objc_ptr_type && candidate_objc_ptr_type) { 22744207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan clang::QualType desired_target_type = desired_objc_ptr_type->getPointeeType().getUnqualifiedType(); 22754207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan clang::QualType candidate_target_type = candidate_objc_ptr_type->getPointeeType().getUnqualifiedType(); 22764207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 22774207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), 22784207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan desired_target_type.getAsOpaquePtr(), 22794207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan candidate_target_type.getAsOpaquePtr())) 22804207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return var_sp; 22814207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan } 22824207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 228339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan const clang::PointerType *desired_ptr_type = desired_qual_type->getAs<clang::PointerType>(); 228439d1af981f6a76603356fd84b2e9372a9172297cSean Callanan const clang::PointerType *candidate_ptr_type = candidate_qual_type->getAs<clang::PointerType>(); 228539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 22864207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (desired_ptr_type && candidate_ptr_type) { 22874207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan clang::QualType desired_target_type = desired_ptr_type->getPointeeType().getUnqualifiedType(); 22884207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan clang::QualType candidate_target_type = candidate_ptr_type->getPointeeType().getUnqualifiedType(); 22894207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 22904207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), 22914207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan desired_target_type.getAsOpaquePtr(), 22924207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan candidate_target_type.getAsOpaquePtr())) 22934207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return var_sp; 22944207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan } 229539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 22964207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return lldb::VariableSP(); 22973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 22983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 22993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 23004207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), 230139d1af981f6a76603356fd84b2e9372a9172297cSean Callanan type->GetOpaqueQualType(), 230239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan var_sp->GetType()->GetClangFullType())) 23034207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return var_sp; 23043bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 23053bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 23063bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 23074207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return lldb::VariableSP(); 2308cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 2309336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 231001e6a58b057676d5dc434876dbb2d54871bb962eGreg Claytonconst Symbol * 231101e6a58b057676d5dc434876dbb2d54871bb962eGreg ClaytonClangExpressionDeclMap::FindGlobalDataSymbol (Target &target, 231201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const ConstString &name) 2313819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2314819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 2315819749647b1605f75753f625050cb240292c08b0Sean Callanan 231601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); 2317819749647b1605f75753f625050cb240292c08b0Sean Callanan 231801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const uint32_t matches = sc_list.GetSize(); 231901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton for (uint32_t i=0; i<matches; ++i) 2320819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2321819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 232201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 232301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton if (sym_ctx.symbol) 232401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton { 232501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Symbol *symbol = sym_ctx.symbol; 232601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Address *sym_address = &symbol->GetAddress(); 232701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton 232801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton if (sym_address && sym_address->IsValid()) 232901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton { 233001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton switch (symbol->GetType()) 233101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton { 233201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeData: 233301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeRuntime: 233401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeAbsolute: 233501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeObjCClass: 233601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeObjCMetaClass: 233701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeObjCIVar: 233801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton if (symbol->GetDemangledNameIsSynthesized()) 233901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton { 234001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton // If the demangled name was synthesized, then don't use it 234101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton // for expressions. Only let the symbol match if the mangled 234201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton // named matches for these symbols. 234301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton if (symbol->GetMangled().GetMangledName() != name) 234401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton break; 234501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton } 234601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton return symbol; 234701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton 234801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeCode: // We already lookup functions elsewhere 234901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeVariable: 235001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeLocal: 235101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeParam: 235201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeTrampoline: 235301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeInvalid: 235401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeException: 235501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeSourceFile: 235601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeHeaderFile: 235701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeObjectFile: 235801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeCommonBlock: 235901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeBlock: 236001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeVariableType: 236101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeLineEntry: 236201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeLineHeader: 236301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeScopeBegin: 236401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeScopeEnd: 236501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeAdditional: 236601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeCompiler: 236701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeInstrumentation: 236801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeUndefined: 236901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton break; 237001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton } 237101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton } 237201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton } 2373819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2374819749647b1605f75753f625050cb240292c08b0Sean Callanan 2375819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 2376819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2377819749647b1605f75753f625050cb240292c08b0Sean Callanan 237847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP 237947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable 238047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan( 238147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target &target, 238294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ModuleSP &module, 238394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan const ConstString &name, 238494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ClangNamespaceDecl *namespace_decl, 238547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser *type 238647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan) 238747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 238847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList vars; 238947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 239094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan if (module && namespace_decl) 239194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module->FindGlobalVariables (name, namespace_decl, true, -1, vars); 239294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan else 239394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan target.GetImages().FindGlobalVariables(name, true, -1, vars); 239447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 239547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (vars.GetSize()) 239647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 239747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type) 239847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 239947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < vars.GetSize(); ++i) 240047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 240147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableSP var_sp = vars.GetVariableAtIndex(i); 240247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 240347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 240447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 240547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 240647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return var_sp; 240747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 240847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 240947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 241047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 241147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 241247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return vars.GetVariableAtIndex(0); 241347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 241447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 241547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 241647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return VariableSP(); 241747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 241847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 241924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 242047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 242116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 2422f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context) 242324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2424f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 2425f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2426f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 2427f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2428e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 242924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24309394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (GetImportInProgress()) 2431ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 243267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 2433ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 2434ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 2435ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 2436e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 243767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan static unsigned int invocation_id = 0; 243867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id = invocation_id++; 243967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan 244016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 244116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 244216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (!context.m_decl_context) 24439394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString()); 244416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context)) 24459394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str()); 244616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 24479394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName()); 244816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 24499394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 245016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context)) 245116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 245273b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context); 2453a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 245467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 24555a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", 245667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 245767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan namespace_map.get(), 245867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (int)namespace_map->size()); 2459a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2460a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan if (!namespace_map) 2461a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan return; 2462a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan 246316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); 246416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i != e; 246516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ++i) 246616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 246716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 24689394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", 246967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 247016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->second.GetNamespaceDecl()->getNameAsString().c_str(), 247116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->first->GetFileSpec().GetFilename().GetCString()); 247216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 2473c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan FindExternalVisibleDecls(context, 2474c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->first, 2475c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->second, 247667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 247716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 247816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2479e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan else if (isa<TranslationUnitDecl>(context.m_decl_context)) 248016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 248116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangNamespaceDecl namespace_decl; 248216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 248316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 24849394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id); 248516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 248616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan FindExternalVisibleDecls(context, 248716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP(), 248816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl, 248967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 249016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2491a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 24929394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (!context.m_found.variable) 24939394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan ClangASTSource::FindExternalVisibleDecls(context); 249416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan} 249516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 249616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 249716b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, 249838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan lldb::ModuleSP module_sp, 249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl &namespace_decl, 250067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 250116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{ 2502f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 250316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 250416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 25059394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 2506e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 250724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25089394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 25099394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 25103bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 25113bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 25123bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 25133bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 25149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 25158f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString id_name("id"); 25168f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString Class_name("Class"); 25178f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 25188f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (name == id_name || name == Class_name) 25198f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return; 25208f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 25218de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 25228de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 2523dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 2524dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 252503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (name_unique_cstr[0] == '$' && !namespace_decl) 25263cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 252757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 252847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 252957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 253057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 253157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 253275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 253375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (frame == NULL) 253447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 253547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 253675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 253757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 253875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!sym_ctx.function) 253957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 254057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2541b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton // Get the block that defines the function 2542b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton Block *function_block = sym_ctx.GetFunctionBlock(); 2543b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 2544b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton if (!function_block) 2545b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton return; 2546b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 2547b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton clang::DeclContext *decl_context = function_block->GetClangDeclContext(); 254857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 254975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!decl_context) 255057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 255157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 255275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context); 255357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2554c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (method_decl) 25553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 255657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2557c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham clang::CXXRecordDecl *class_decl = method_decl->getParent(); 2558c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2559c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_qual_type(class_decl->getTypeForDecl(), 0); 2560c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2561c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(), 2562c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &class_decl->getASTContext()); 2563c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2564c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (log) 2565c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2566c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ASTDumper ast_dumper(class_qual_type); 2567c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString()); 2568c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2569c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2570c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham AddOneType(context, class_user_type, current_id, true); 2571c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2572c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (method_decl->isInstance()) 2573c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2574c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // self is a pointer to the object 2575c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2576c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type); 2577c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2578c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(), 2579c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &method_decl->getASTContext()); 2580c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2581c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = self_user_type; 2582c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2583c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2584c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham else 2585bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan { 2586c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // This branch will get hit if we are executing code in the context of a function that 2587c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a 2588c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // method of the class. In that case, just look up the "this" variable in the the current 2589c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // scope and use its type. 2590c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer 2591c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // for C++ so it hasn't actually been tested. 2592bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2593c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham VariableList *vars = frame->GetVariableList(false); 2594bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2595c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 2596bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2597c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (this_var && 2598c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham this_var->IsInScope(frame) && 2599c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham this_var->LocationIsValidForFrame (frame)) 2600c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2601c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham Type *this_type = this_var->GetType(); 2602c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2603c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (!this_type) 2604c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 2605c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2606c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType this_qual_type = QualType::getFromOpaquePtr(this_type->GetClangFullType()); 2607c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham const PointerType *class_pointer_type = this_qual_type->getAs<PointerType>(); 2608c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2609c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (class_pointer_type) 2610c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2611c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_type = class_pointer_type->getPointeeType(); 2612c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2613c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (log) 2614c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2615c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ASTDumper ast_dumper(this_type->GetClangFullType()); 2616c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 2617c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2618c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2619c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser class_user_type (class_type.getAsOpaquePtr(), 2620c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham this_type->GetClangAST()); 2621c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham AddOneType(context, class_user_type, current_id, false); 2622c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2623c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2624c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser this_user_type(this_type->GetClangFullType(), 2625c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham this_type->GetClangAST()); 2626c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2627c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = this_user_type; 2628c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 2629c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2630c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2631bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan } 2632bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 263357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 263457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 263557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 26363aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 26373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 26383aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 26393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 26403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2641567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 264247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 2643e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2644e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 264547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2646e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!sym_ctx.function) 2647e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 264803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2649b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton // Get the block that defines the function 2650b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton Block *function_block = sym_ctx.GetFunctionBlock(); 2651e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2652b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton if (!function_block) 2653b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton return; 2654b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 2655b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton clang::DeclContext *decl_context = function_block->GetClangDeclContext(); 2656e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2657e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!decl_context) 26583aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 265903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2660e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context); 2661e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2662c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (method_decl) 2663e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan { 2664c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2665c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ObjCInterfaceDecl* self_interface = method_decl->getClassInterface(); 266675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 2667c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (!self_interface) 266875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan return; 266975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 2670c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham const clang::Type *interface_type = self_interface->getTypeForDecl(); 2671c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2672c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(), 2673c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &method_decl->getASTContext()); 267475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 2675c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (log) 2676c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2677c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ASTDumper ast_dumper(interface_type); 2678c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 2679c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2680c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2681c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham AddOneType(context, class_user_type, current_id, false); 2682c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2683c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (method_decl->isInstanceMethod()) 2684c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2685c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // self is a pointer to the object 2686c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2687c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0)); 2688c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2689c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(), 2690c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &method_decl->getASTContext()); 2691c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2692c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = self_user_type; 2693c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2694c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham else 2695c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2696c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // self is a Class pointer 2697c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_type = method_decl->getASTContext().getObjCClassType(); 2698c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2699c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser self_user_type(class_type.getAsOpaquePtr(), 2700c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &method_decl->getASTContext()); 2701c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2702c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = self_user_type; 2703c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2704c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2705c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 270675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 270775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan else 270875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan { 2709c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // This branch will get hit if we are executing code in the context of a function that 2710c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a 2711c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // method of the class. In that case, just look up the "self" variable in the the current 2712c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // scope and use its type. 2713c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2714c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham VariableList *vars = frame->GetVariableList(false); 271575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 2716c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 271775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 2718c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (self_var && 2719c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham self_var->IsInScope(frame) && 2720c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham self_var->LocationIsValidForFrame (frame)) 2721c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2722c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham Type *self_type = self_var->GetType(); 2723c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2724c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (!self_type) 2725c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 2726c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2727c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType self_qual_type = QualType::getFromOpaquePtr(self_type->GetClangFullType()); 2728c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham const ObjCObjectPointerType *class_pointer_type = self_qual_type->getAs<ObjCObjectPointerType>(); 2729c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2730c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (class_pointer_type) 2731c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2732c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_type = class_pointer_type->getPointeeType(); 2733c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2734c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (log) 2735c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 2736c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ASTDumper ast_dumper(self_type->GetClangFullType()); 2737c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 2738c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2739c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2740c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser class_user_type (class_type.getAsOpaquePtr(), 2741c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham self_type->GetClangAST()); 2742c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham AddOneType(context, class_user_type, current_id, false); 2743c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2744c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2745c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser self_user_type(self_type->GetClangFullType(), 2746c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham self_type->GetClangAST()); 2747c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 2748c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = self_user_type; 2749c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 2750c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 2751c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 275275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 275375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 27543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 27553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 2756c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan 2757c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan // any other $__lldb names should be weeded out now 2758c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) 2759c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan return; 276003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 27612431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan do 27622431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan { 2763567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 27642431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 27652431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2766567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); 27672431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27682431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_clang_ast_context) 27692431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 27702431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27712431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 27722431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27732431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_ast_context) 27742431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 27752431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27762431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); 277703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 27782431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!ptype_type_decl) 27792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 27802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2781e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl); 27822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27832431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_decl) 27842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 27852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); 27872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27882431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_type_decl) 27892431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 27902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (log) 27929394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString()); 27932431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 27942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan context.AddNamedDecl(parser_ptype_type_decl); 27952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan } while (0); 27962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2797427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 279803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2799427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 28001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 280167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, pvar_sp, current_id); 28021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 28031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 28041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 28051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 28061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2807dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (m_parser_vars->m_exe_ctx.GetRegisterContext()) 28081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2809dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name)); 28109394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 28111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 2812e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan { 2813e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (log) 28149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name); 2815e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 281667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneRegister(context, reg_info, current_id); 2817e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan } 28181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 28198de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 282003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 282103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 282203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ValueObjectSP valobj; 282303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan VariableSP var; 282403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Error err; 282503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 282603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (frame && !namespace_decl) 282703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 282803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr, 282903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan eNoDynamicValues, 2830a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham StackFrame::eExpressionPathOptionCheckPtrVsMember 2831a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 283203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan var, 283303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan err); 283403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 283503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // If we found a variable in scope, no need to pull up function names 2836b386d82334b65fb984348f2027b1cb7714de993fSean Callanan if (err.Success() && var) 283703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 283889e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 283916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 28403a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan return; 284103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 284203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 28431c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan 28441c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan if (target) 284503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 284694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan var = FindGlobalVariable (*target, 284738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp, 284894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan name, 284994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan &namespace_decl, 285003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NULL); 285103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 285203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (var) 285303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2854f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan valobj = ValueObjectVariable::Create(target, var); 285589e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 285616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 28571c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan return; 285803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 285903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 286003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 286116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 286203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2863302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan const bool include_inlines = false; 286403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool append = false; 2865a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 286638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (namespace_decl && module_sp) 2867a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 286851cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan const bool include_symbols = false; 286951cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan 287038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp->FindFunctions(name, 287138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan &namespace_decl, 287238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan eFunctionNameTypeBase, 287338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan include_symbols, 2874302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 287538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan append, 287638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan sc_list); 2877a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 28786f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham else if (target && !namespace_decl) 2879a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 288051cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan const bool include_symbols = true; 288151cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan 28822975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // TODO Fix FindFunctions so that it doesn't return 28832975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // instance methods for eFunctionNameTypeBase. 28842975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 2885a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan target->GetImages().FindFunctions(name, 2886a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan eFunctionNameTypeBase, 2887a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 2888302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 2889a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 2890a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 2891a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2892a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 289303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sc_list.GetSize()) 289403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 289503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *generic_symbol = NULL; 289603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *non_extern_symbol = NULL; 289703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 289803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 289903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan index < num_indices; 290003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++index) 290103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 290203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext sym_ctx; 290303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 290403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 290503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.function) 290603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 29072975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext(); 29082975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 29092975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // Filter out class/instance methods. 29102975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx)) 29112975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan continue; 29122975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan if (dyn_cast<clang::CXXMethodDecl>(decl_ctx)) 29132975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan continue; 29142975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 291503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // TODO only do this if it's a C function; C++ functions may be 291603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // overloaded 291716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 291867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction(context, sym_ctx.function, NULL, current_id); 291916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function_with_type_info = true; 292016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 292103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 292203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (sym_ctx.symbol) 292303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 292403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.symbol->IsExternal()) 292503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan generic_symbol = sym_ctx.symbol; 292603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 292703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan non_extern_symbol = sym_ctx.symbol; 292803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 292903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 293003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 293116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 293203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 293303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (generic_symbol) 293403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 293567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, generic_symbol, current_id); 293616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 293703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 293803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (non_extern_symbol) 293903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 294067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, non_extern_symbol, current_id); 294116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 294203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 294303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 294403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 294503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2946647fefd71c4364342aa116e45418592667fb8265Sean Callanan if (!context.m_found.variable && !namespace_decl) 294703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 294816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic 294903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 295003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 295101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Symbol *data_symbol = FindGlobalDataSymbol(*target, name); 295203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 295303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (data_symbol) 295403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 295567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneGenericVariable(context, *data_symbol, current_id); 295616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 295703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 295803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 295903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 2960b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan } 296124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2962e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 296369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callananstatic clang_type_t 296469716a233f3240978bdbd7a8b682b31e7e07e498Sean CallananMaybePromoteToBlockPointerType 296569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan( 296669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan ASTContext *ast_context, 296769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan clang_type_t candidate_type 296869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan) 296969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan{ 297069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!candidate_type) 297169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 297269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 297369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type); 297469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 297569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type); 297669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 297769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!candidate_pointer_type) 297869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 297969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 298069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType pointee_qual_type = candidate_pointer_type->getPointeeType(); 298169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 298269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type); 298369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 298469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_type) 298569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 298669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 298769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan RecordDecl *pointee_record_decl = pointee_record_type->getDecl(); 298869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 298969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_decl->isRecord()) 299069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 299169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 299269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_"))) 299369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 299469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 299569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy); 299669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type); 299769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 299869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return block_pointer_type.getAsOpaquePtr(); 299969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan} 300069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 3001336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 30028de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 30038de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 30044a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var, 30059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context, 30068de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 30078de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 30088de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 300924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3010e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 30116184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 301224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 301324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 301424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 301524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3016810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 3017810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 3018336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 301924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 302224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 302324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 302424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3025810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 3026810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 3027336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 302824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 302924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 303124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3032b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 303324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3034810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 3035810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 3036336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 303724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 303869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 30393418bfeeafef91b67a62f536d0ff4bbdb4d0d440Enrico Granata // commented out because of <rdar://problem/11024417> 30403418bfeeafef91b67a62f536d0ff4bbdb4d0d440Enrico Granata //var_opaque_type = MaybePromoteToBlockPointerType (ast, var_opaque_type); 304124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3042336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 3043336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 304424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 304524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3046178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 3047178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 3048dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3049567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3050178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 3051178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 3052178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 3053178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 3054567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target); 3055178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 305624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 305724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3058dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!var_location_expr.Evaluate(&m_parser_vars->m_exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 305924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3060810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 3061810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 3062336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 306324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3064b01000fd063629facd45044f137446fb748ee179Greg Clayton 306558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *type_to_use = NULL; 3066336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 3067f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 3068f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 3069b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 3070f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 30714b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 30724b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 30734b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 30744b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 30754b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 30764b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 30774b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 30784b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 3079f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 3080f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 3081f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 3082336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 3083336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 308424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 30866916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 308724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 308924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 309024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 309124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 3092336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 309324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 3094336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 309524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 309724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 309824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 3099336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 3100336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 310124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 310224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 310424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 310547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 310647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 310747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->GetScalar() = load_addr; 310847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->SetValueType(Value::eValueTypeLoadAddress); 310947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 311024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 311124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3112f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 3113b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 3114336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 3115336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 3116336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 3117336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 3118336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 311989e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id) 3120336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 3121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 3122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 3123e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 312447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3125f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 3126f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 3127336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 3128dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Value *var_location = GetVariableValue (var, 3129f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context, 31308de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 31318de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 3132336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 3133e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType()); 3134e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan 313530a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan if (parser_opaque_type.isNull()) 313630a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan return; 313730a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan 3138e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) 3139e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan { 3140e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan if (const TagType *tag_type = dyn_cast<TagType>(parser_type)) 3141e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan CompleteType(tag_type->getDecl()); 3142e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan } 3143e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan 31444b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 31454b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 31464b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 31476f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan NamedDecl *var_decl; 31486f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 31496f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType()); 31506f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 31516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 31526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); 31536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 31546f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 31556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 31568de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 3157427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 315889e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj)); 315989e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan 3160427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 316131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan entity->EnableParserVars(GetParserID()); 316231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 316331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = pt; 316431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = var_decl; 316531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = NULL; 316631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_value = var_location; 316731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_var = var; 316824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 31706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan entity->m_flags |= ClangExpressionVariable::EVTypeIsReference; 31716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 3172810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 31738de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3174aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan ASTDumper orig_dumper(ut.GetOpaqueQualType()); 3175a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 3176aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString()); 31778de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 31788f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 31798f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 31808f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 3181a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 318267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan ClangExpressionVariableSP &pvar_sp, 318367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 3184a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 3185e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 318645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 3187427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 3188a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 3189f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (GuardedCopyType(m_ast_context, 3190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 3191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 3192f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 3193a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 3194dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!parser_type.GetOpaqueQualType()) 3195dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3196dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3197dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString()); 3198dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 3199dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 3200dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 32016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 32028c12720c108cd5e7ed792596749218d8400f647eSean Callanan 320331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan pvar_sp->EnableParserVars(GetParserID()); 320431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID()); 320531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 320631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = var_decl; 320731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = NULL; 320831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_value = NULL; 320945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 321045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 3211a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 3212a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 32139394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString()); 3214a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 3215a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 3216a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 32171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 3218819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 321901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Symbol &symbol, 322067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 3221819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 3222819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 3223819749647b1605f75753f625050cb240292c08b0Sean Callanan 3224819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3225819749647b1605f75753f625050cb240292c08b0Sean Callanan 3226dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3227567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3228567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 3229567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return; 3230567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3231567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 3232819749647b1605f75753f625050cb240292c08b0Sean Callanan 323343a5fb4ba2d20b6b63aea4fa794540c711a8ec72Greg Clayton TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, false)), 3234819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 3235819749647b1605f75753f625050cb240292c08b0Sean Callanan 323643a5fb4ba2d20b6b63aea4fa794540c711a8ec72Greg Clayton TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(m_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, false)), 3237f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 3238819749647b1605f75753f625050cb240292c08b0Sean Callanan 3239fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 3240819749647b1605f75753f625050cb240292c08b0Sean Callanan 3241819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 3242819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 3243dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 3244819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 3245819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 324647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 324747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3248819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 3249819749647b1605f75753f625050cb240292c08b0Sean Callanan 3250819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 3251819749647b1605f75753f625050cb240292c08b0Sean Callanan 325201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Address &symbol_address = symbol.GetAddress(); 3253567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 3254819749647b1605f75753f625050cb240292c08b0Sean Callanan 3255819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 3256819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 3257819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 3258819749647b1605f75753f625050cb240292c08b0Sean Callanan 325931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan entity->EnableParserVars(GetParserID()); 326031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 326131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 326231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = var_decl; 326331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = NULL; 326431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_value = symbol_location.release(); 326531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_sym = &symbol; 3266819749647b1605f75753f625050cb240292c08b0Sean Callanan 3267819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 3268819749647b1605f75753f625050cb240292c08b0Sean Callanan { 3269a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 3270819749647b1605f75753f625050cb240292c08b0Sean Callanan 32719394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 3272819749647b1605f75753f625050cb240292c08b0Sean Callanan } 3273819749647b1605f75753f625050cb240292c08b0Sean Callanan} 3274819749647b1605f75753f625050cb240292c08b0Sean Callanan 3275fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 3276fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 3277fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 3278fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3279dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3280567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3281567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 3282fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3283fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 3284fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 3285fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 3286fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3287fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 3288fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 328931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 329031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 3291fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 3292fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 329331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan const NamedDecl *named_decl = parser_vars->m_named_decl; 3294fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 3295fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3296fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 3297fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3298fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 3299fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 3300fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 3301fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3302fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3303fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 3304fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3305a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl)); 3306a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString()); 3307fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3308fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3309fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 3310fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 3311fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 33125a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 3313fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3314dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 3315dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3316dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3317dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable"); 3318dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 33199880efacdd3a5e855b405d89433a01170422a889Jim Ingham return (bool) lldb::ClangExpressionVariableSP(); 3320dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 3321dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3322fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 3323fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 332431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 332531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 3326fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3327fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangAST(user_type.GetASTContext()); 3328fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangType(user_type.GetOpaqueQualType()); 3329fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3330fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 3331fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3332fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3333fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3334fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 3335fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 3336fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3337819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 3338427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 333967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const RegisterInfo *reg_info, 334067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 33411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 33421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 33431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3344f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context, 33451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 33461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 33471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 33481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 33491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 3350122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen if (log) 335167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 33521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 33531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 33541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 3356f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 33571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 33581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 33591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3360dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 336147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 336247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3363427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 33641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 3365427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 3366427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 336731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan entity->EnableParserVars(GetParserID()); 336831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 336931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 337031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = var_decl; 337131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = NULL; 337231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_value = NULL; 337352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan entity->m_flags |= ClangExpressionVariable::EVBareRegister; 33741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 337552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (log) 33761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 3377a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 33789394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString()); 33791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 33801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 33811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3382a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 3383da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 3384da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Function* fun, 338567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol* symbol, 338667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 33878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 3388aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 3389aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 3390e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 33918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 339258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan NamedDecl *fun_decl = NULL; 33930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 339458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan const Address *fun_address = NULL; 33958f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 33960fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 33970fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 33989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *fun_ast_context = NULL; 33998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 34000fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 34010fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 34020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 34030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 34040fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 34050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 34060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 340767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no type"); 34080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 34090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 34100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 341104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton fun_opaque_type = fun_type->GetClangFullType(); 34120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 34130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 34140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 34150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 341667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no Clang type"); 34170fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 34180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 34190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 34200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 34210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 3422b01000fd063629facd45044f137446fb748ee179Greg Clayton fun_ast_context = fun_type->GetClangASTContext().getASTContext(); 3423f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type); 3424a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (copied_type) 3425a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3426a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_decl = context.AddFunDecl(copied_type); 3427a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 3428a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton else 3429a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3430a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton // We failed to copy the type we found 3431a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (log) 3432a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 34335f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf (" Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt", 3434a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetName().GetCString(), 3435a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetID()); 3436a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 343716089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan 343816089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan return; 3439a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 34400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 34410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 34420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 34430c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton fun_address = &symbol->GetAddress(); 34440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 34450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 34460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 34478f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 3448810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 344967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" AddOneFunction called with no function and no symbol"); 34508f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 34518f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 34528f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3453dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target); 34568f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 34578f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 34588f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3459dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 346047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 346147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3462427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 34638de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 3464427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 3465427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 3466427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 3467427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 346831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan entity->EnableParserVars(GetParserID()); 346931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 347031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = fun_decl; 347131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = NULL; 347231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_value = fun_location.release(); 34738c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3474810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 34758de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3476a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(fun_decl); 3477a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 34782975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan StreamString ss; 34792975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 34802975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription); 34812975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 34822975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s", 348367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 348467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (fun ? "specific" : "generic"), 34852975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan decl_name.c_str(), 34862975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan ss.GetData(), 3487a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ast_dumper.GetCString()); 34888de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 348924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 349093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 349193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 349293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 34933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 349467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id, 34953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 349693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 3497f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan ASTContext *parser_ast_context = m_ast_context; 34989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *user_ast_context = ut.GetASTContext(); 34993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3500ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 3501dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3502dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 3503dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3504dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3505dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3506dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3507dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type"); 3508dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3509dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 3510dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 35119394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 35123356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton if (add_method && ClangASTContext::IsAggregateType(copied_type) && ClangASTContext::GetCompleteType (parser_ast_context, copied_type)) 35133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 35143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 35153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 35163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 35173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3518716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 3519716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 3520716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan args, 3521716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 1, 3522716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan false, 3523716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 3524716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 35251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 35261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 35271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 352830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 352928ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan const bool is_attr_used = true; 35302581dbf7292c6272bb771fe396ab30921385d669Sean Callanan const bool is_artificial = false; 353130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 35321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 35331d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 35348de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 35351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 35361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 35371d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 35381d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 353930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 3540716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan is_explicit, 35412581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_attr_used, 35422581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_artificial); 35433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 354493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 354593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 354693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 3547