ClangExpressionDeclMap.cpp revision 8f2e392e8937aaf66f91201dc5f4190d61902c67
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangExpressionDeclMap.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h" 17a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 20810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h" 216184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 23061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h" 25f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan#include "lldb/Core/ValueObjectVariable.h" 266e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 28a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h" 29cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 316916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 41f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 42810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 4317c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 45f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 483bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5273b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) : 5373b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTSource (exe_ctx.GetTargetSP()), 548de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 558de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 56dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_keep_result_in_memory (keep_result_in_memory), 57aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 58dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_struct_vars () 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 656d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // Note: The model is now that the parser's AST context and all associated 666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // data does not vanish until the expression has been executed. This means 676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // that valuable lookup data (like namespaces) doesn't vanish, but 686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan DidParse(); 70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 74166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool 75427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 768c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 78aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_exe_ctx = &exe_ctx; 79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr()) 82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetThreadPtr()) 84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetProcessPtr()) 86987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 87987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 88567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 89987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (target) 91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 92987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 93567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 94987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 9597ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan 96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 97567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_persistent_vars = &target->GetPersistentVariables(); 99166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetScratchClangASTContext()) 101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 103166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info = GetTargetInfo(); 10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 106166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan return true; 107aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 108c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 110427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 114427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (var_sp && 120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars.get() && 121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_lldb_value) 122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton delete var_sp->m_parser_vars->m_lldb_value; 123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 124427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->DisableParserVars(); 125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 127427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 133427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->DisableParserVars(); 134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1377a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo() 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetInfo ret; 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.byte_order = process->GetByteOrder(); 156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.address_byte_size = process->GetAddressByteSize(); 157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.byte_order = target->GetArchitecture().GetByteOrder(); 164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 166567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ret; 17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 17147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1728de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1738de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 17482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 177aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton Target *target = m_parser_vars->GetTarget(); 180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (target); 181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName(); 182427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 183aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 18482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 18582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP 18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name, 18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan lldb_private::TypeFromParser type, 18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan const llvm::APInt& value) 19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{ 19105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan assert (m_parser_vars.get()); 192166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 193fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 194567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 195567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 196567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 197567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 198567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 19905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2005a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan TypeFromUser user_type(m_ast_importer->CopyType(context, 2015a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetASTContext(), 2025a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetOpaqueQualType()), 20305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 20447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 205dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!user_type.GetOpaqueQualType()) 206dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 207dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 208dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 209dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 210dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result"); 211dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 212dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 213dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 214dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 215fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 2170e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 21847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 21947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 2200e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 2210e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 2230e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2240e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 2250e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2270e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 2280e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 2290e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 2340e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 23705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 23905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2402bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (size_t byte_idx = 0; 24105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 24205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 24305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 24405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 24505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 24605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 24847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (m_parser_vars->m_target_info.byte_order) 24905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 2500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 2510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 2520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 2530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 2540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2550e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 2560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 2600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2610e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 2620e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 26305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 26405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 2656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2690e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2700e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 27105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 27205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 273696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP 274696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name, 2759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan VarDecl *decl, 276696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb_private::TypeFromParser type) 277696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{ 278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan assert (m_parser_vars.get()); 279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 283567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 284567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 285567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 286567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 287567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 288567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 289567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 294696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 297696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return ClangExpressionVariableSP(); 298696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 2995a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan TypeFromUser user_type(m_ast_importer->CopyType(context, 3005a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetASTContext(), 3015a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetOpaqueQualType()), 302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan context); 303696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 304dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!user_type.GetOpaqueQualType()) 305dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 306dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 307dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 308dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 309dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result"); 310dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 311dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 312dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 313dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser var_type = var_sp->GetTypeFromUser(); 315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 316567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 317567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL) 318567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 319567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 320567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type); 321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var) 323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable 324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 325567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues); 326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_valobj) 328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type); 331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_casted_valobj) 333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (log) 336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan { 337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan StreamString my_stream_string; 338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangASTType::DumpTypeDescription (var_type.GetASTContext(), 340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_type.GetOpaqueQualType(), 341696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan &my_stream_string); 342696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 343696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 344696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str()); 345696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan } 346696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 347696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj); 348696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 349696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!pvar_sp) 350696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 351696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 352696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name)) 353696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 354696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 355696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 356696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 357696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 358696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 359696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return pvar_sp; 360696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan} 361696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name) 36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference); 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj, 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ConstString &name, 374a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::TypeFromParser type, 375557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool transient, 376557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool maybe_make_load) 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pvar_sp) 38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 384557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 385557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (maybe_make_load && 386557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.GetValueType() == Value::eValueTypeFileAddress && 387557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan m_parser_vars->m_exe_ctx && 388557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean 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 40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean 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)); 452fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 453567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 456567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 458567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 459567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 460a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 4610539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan TypeFromUser user_type(m_ast_importer->DeportType(context, 4620539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetASTContext(), 4630539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetOpaqueQualType()), 46497678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 4655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 4665a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!user_type.GetOpaqueQualType()) 4675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 4685a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (log) 4695a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Persistent variable's type wasn't copied successfully"); 4705a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 4715a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 47247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 47347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_parser_vars->m_target_info.IsValid()) 47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 475a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 476fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 477fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 478427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 47947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 48047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan 483427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 4848c12720c108cd5e7ed792596749218d8400f647eSean Callanan 485427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4868c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4878c12720c108cd5e7ed792596749218d8400f647eSean 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 506427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableParserVars(); 5078c12720c108cd5e7ed792596749218d8400f647eSean Callanan 508427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_named_decl = decl; 509427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_parser_type = parser_type; 5108c12720c108cd5e7ed792596749218d8400f647eSean Callanan 5118c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 512a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 513a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 514a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 5158de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 5168de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 5188de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 5198de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 5208de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 5218de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 5228de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 525aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 526aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 527e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 52845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 529aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 5308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5318c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 5328c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 5338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 534427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan 536427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 5388c12720c108cd5e7ed792596749218d8400f647eSean Callanan 539427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 5408c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5418c12720c108cd5e7ed792596749218d8400f647eSean Callanan 54245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 5435a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure", 54445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 5458de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 546427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 54745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 5488c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 5498c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 550427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_llvm_value = value; 5518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 552427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableJITVars(); 553427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_alignment = alignment; 554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_size = size; 5558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 556427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 5638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 565aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 566aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 5708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 571aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 572aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 5738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 574427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 5758c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 5768c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 5778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 578427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 579427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 580427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 581427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 582427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 5838c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5858c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment; 5878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 588427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (cursor % member_sp->m_jit_vars->m_alignment) 589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment)); 5908c12720c108cd5e7ed792596749218d8400f647eSean Callanan 591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset = cursor; 592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += member_sp->m_jit_vars->m_size; 5938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 595aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 5968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 597aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 5988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6018de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 6028de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6038de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 6048de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 6058de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 6068de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 608aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 609aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 610aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 6118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 613427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 614aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 615aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 6168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 6218de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 6228de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *&decl, 6248de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 6258de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 6268de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 6278de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 6288de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 630aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 631aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 632aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 6338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 635427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 6368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 6398c12720c108cd5e7ed792596749218d8400f647eSean Callanan 640427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp || 641427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_parser_vars.get() || 642427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_jit_vars.get()) 6438c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 6448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton decl = member_sp->m_parser_vars->m_named_decl; 646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = member_sp->m_parser_vars->m_llvm_value; 647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton offset = member_sp->m_jit_vars->m_offset; 648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 6498c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 65302fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 6548de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 6558de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 6578de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 6588de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 659ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 660427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl)); 6618c12720c108cd5e7ed792596749218d8400f647eSean Callanan 662427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 6638c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 664ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 6668c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 667ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 668427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 6698c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6708c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 671ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 672ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 673ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void 674ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext 675ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan( 676ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan const ConstString &name, 677ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContext &sym_ctx, 678ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContextList &sc_list 679ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan) 680ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{ 681ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (sym_ctx.module_sp) 682aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 683ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 684ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (!sc_list.GetSize()) 685ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 686ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan} 687ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 688f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 6898de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 6908de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6918de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 692da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 6938de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 694f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 695aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 696aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 697aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 698567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 699567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 700567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 701567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 702f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 703567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 70478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 70578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 706f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 707f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 708e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 709f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 710ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 711ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 712e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 713aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 714aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 715aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 716aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 7170eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan if (!strncmp(name.GetCString(), "_ZN", 3) && 7180eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan strncmp(name.GetCString(), "_ZNK", 4)) 719aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 7200eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan std::string fixed_scratch("_ZNK"); 7210eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan fixed_scratch.append(name.GetCString() + 3); 7220eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan ConstString fixed_name(fixed_scratch.c_str()); 723aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 724aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 7250eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString()); 7260eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan 7270eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list); 728aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 729aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 730aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 731aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 732f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 733f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 734f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 735e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 736f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 737da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 738f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 739f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 740da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 741f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 742da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 743f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 744f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 745f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 746ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 747ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 748ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 749567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton func_addr = func_so_addr->GetCallableLoadAddress (target); 750da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 751f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 752f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 753f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 75521ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type) 756c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 757c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 758c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 75921ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list); 760c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 76421ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++) 765cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 766cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 768c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 769cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 770ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 771ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 772ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return LLDB_INVALID_ADDRESS; 773ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 774cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 775cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 776cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 777cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 778cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 779cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 780cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 781cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 782cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 783cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 784cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 785cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 786cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 787cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 788cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 789cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 790cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 791cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 792cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 793cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 794cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 795cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 796cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 797cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 798cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 799cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 800cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 801cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 802cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 803cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 804cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 8053f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCClass: 8063f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCMetaClass: 8073f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCIVar: 808cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 809cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 810cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 811cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 812cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 813c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 814cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 815c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 816c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 817cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 81821ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type) 819819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 820819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 821819749647b1605f75753f625050cb240292c08b0Sean Callanan 822819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!m_parser_vars->m_exe_ctx || 823567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !m_parser_vars->m_exe_ctx->GetTargetPtr()) 824819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 825819749647b1605f75753f625050cb240292c08b0Sean Callanan 82621ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name, symbol_type); 827819749647b1605f75753f625050cb240292c08b0Sean Callanan} 828819749647b1605f75753f625050cb240292c08b0Sean Callanan 82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter 83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 831557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue 832557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr) 833557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{ 834557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan Value ret; 835557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 836557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 837557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 838557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (m_parser_vars->m_exe_ctx && m_parser_vars->m_exe_ctx->GetProcessPtr()) 839557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 840557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 841557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeFileAddress); 842557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 843557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.GetScalar() = (unsigned long long)addr; 844557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 845557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return ret; 846557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan} 847557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value, 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint8_t *data, 85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 857567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 860567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterContext *reg_ctx = exe_ctx->GetRegisterContext(); 86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 872567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err)) 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return reg_ctx->WriteRegister(reg_info, reg_value); 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 885567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 888567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 891567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 894567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = file_addr.GetLoadAddress(target); 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory(load_addr, data, length, err); 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 903567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 907567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 912e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan { 913e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan if (value.GetScalar().ULongLong() == 0 || data == NULL) 914e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan return false; 915e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan memcpy ((void *)value.GetScalar().ULongLong(), data, length); 916e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan return true; 917e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan } 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data, 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 934567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 937567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterContext *reg_ctx = exe_ctx->GetRegisterContext(); 94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx->ReadRegister(reg_info, reg_value)) 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 952567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err); 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 962567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 963567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 968567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 972567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton target->ReadMemory(file_addr, true, data, length, err); 97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 978567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 982567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 98347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 98447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 98547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 98647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 9875a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 9885a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan void *host_addr = (void*)value.GetScalar().ULongLong(); 9895a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 9905a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!host_addr) 9915a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 9925a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 9935a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan memcpy (data, host_addr, length); 99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 9955a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value 100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl) 100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 100547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx; 100847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl)); 101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl)); 10111c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 101247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (expr_var_sp) 101347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 10144a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var) 10156d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan return Value(); 10166d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 10171c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference; 10181c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 10194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan std::auto_ptr<Value> value(GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL)); 10204b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10211c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 10221c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan { 10231c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr(); 10241c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 10251c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan if (!process) 10261c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 10271c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 10281c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 10291c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan Error read_error; 10301c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error); 10311c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 10321c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan if (!read_error.Success()) 10331c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 10341c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 10351c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan value->GetScalar() = (unsigned long long)ref_value; 10361c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan } 10371c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 10384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (value.get()) 10394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return *value; 10404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 10414b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 104247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 104347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else if (persistent_var_sp) 104447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 1045a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference || 1046a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) && 104786a07da76f615533a06a797dc4539566951b58d3Sean Callanan persistent_var_sp->m_live_sp && 1048f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress && 1049f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan m_parser_vars->m_exe_ctx->GetProcessSP() && 1050f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive()) || 1051f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress))) 1052a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 10534b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return persistent_var_sp->m_live_sp->GetValue(); 1054a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 1055a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan else 1056a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 1057a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::Value ret; 1058a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetValueType(Value::eValueTypeHostAddress); 1059a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 1060a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes(); 1061a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return ret; 1062a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 106347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 106447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 106547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 106647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Value(); 106747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 106847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 106947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 10704b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue 10714b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name) 10724b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{ 10734b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan assert(m_parser_vars.get()); 10744b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10754b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!m_parser_vars->m_exe_ctx) 10764b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10774b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10784b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr(); 10794b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10804b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!frame) 10814b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10824b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10834b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan VariableList *vars = frame->GetVariableList(false); 10844b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10854b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!vars) 10864b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10874b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10884b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::VariableSP var = vars->FindVariable(name); 10894b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10904b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!var || 10914b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->IsInScope(frame) || 10924b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->LocationIsValidForFrame (frame)) 10934b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10944b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10954b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan std::auto_ptr<Value> value(GetVariableValue(*m_parser_vars->m_exe_ctx, var, NULL)); 10964b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 109741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 109841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan { 109941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr(); 110041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 110141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (!process) 110241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan return Value(); 110341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 110441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 110541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan Error read_error; 110641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error); 110741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 110841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (!read_error.Success()) 110941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan return Value(); 111041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 111141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan value->GetScalar() = (unsigned long long)ptr_value; 111241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan } 111341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 11144b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (value.get()) 11154b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return *value; 11164b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 11174b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11184b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan} 11194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1120810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 1121f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1122f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 11238de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 11248de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 11268de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 11278de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 11288de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1129f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 1131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1132567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_material_vars->m_process = exe_ctx.GetProcessPtr(); 1133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 11340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan bool result = DoMaterialize(false /* dematerialize */, 11350ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan exe_ctx, 11360ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* top of stack frame */, 11370ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* bottom of stack frame */, 11380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan NULL, /* result SP */ 11390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan err); 1140f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1141f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 1142aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 1143f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1144f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 1145f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1146f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1147f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 11488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 11498de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 11508de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 11513aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 1152aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 1153047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 1154047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 11558de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 11563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 1157aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1158aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL || process == NULL || target == NULL) 11643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1165e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString()); 11663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 11673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1169aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 11703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1171e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString()); 11723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 11733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1175567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP object_ptr_var = FindVariableInScope (*frame, 1176696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 1177696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type)); 11783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 11803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1181e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString()); 11823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 11833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1185aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 11863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr_var, 1187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 11883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 11903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 11913aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 11923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 11933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 119550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 11963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 119750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 119850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 119950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 120050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 12013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 120250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 1203567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize(); 120450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 120550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 120650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 120750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 120850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 120950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 121050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 121150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 121250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 1213567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton object_ptr = process->ReadPointerFromMemory (value_addr, read_error); 1214c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS) 121550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 121650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 121750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 1218c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 121950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 12203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 122150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 12223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 122350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 122450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 122550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 122650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 122750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 122850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 122950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 123050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 123150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1232061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 123350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1234061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 123550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 123650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 123750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 123850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 123950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1240061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 124150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1242061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 124350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 1244061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 124550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 124650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 124750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1248061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 124950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1250061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 125150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 125250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 12533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 12563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12573c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 12588de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 12598de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1260aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 1261427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 12620ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 12630ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 12648de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 12658de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1266f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 12670ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err); 1268aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1269aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 1270aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 1271aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1272aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 1273aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 1274aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1275aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 1276aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1277aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1278aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1279aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 1280aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1281aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 1282aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 1283aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 1284aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1285aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1286aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1287aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 1288aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1289f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1290f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 129132824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 12928de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 12938de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1294aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 12958de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 12968de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 12978de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 129832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 1299aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1300aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 1301aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1302aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 130332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 130432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 130532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 130632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 1307567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1308567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1309567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 131032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 131132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 131232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 131332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 131432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1315567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1316567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 131732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 131832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 131932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 132032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 132132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 13223371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 13233371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 13243371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 13253371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 13263371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 13273371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 1328c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 132932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 133032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 1331567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (m_material_vars->m_materialized_location, 1332c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetBytes(), 1333c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetByteSize(), error) != data_sp->GetByteSize()) 133432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 133532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 133632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 133732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 133832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1339567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize()); 134032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1341427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 1342427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 1343427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 134432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 1345427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 134632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1347427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 1348427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 1349427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1350427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 13518c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1352427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 13538c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 13548c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 1356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 1357427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 1358427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 1359427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 1360427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 1361427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 1362427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 1363427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 136432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 136532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 136632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 136732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 136832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 136932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 137032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1371f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 13728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 13738de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 13748de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 1375aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 13760ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 13770ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 1378427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 13798de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13808de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1381810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 1382427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 1383427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 1384427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1385aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1386aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1387e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 138882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 1389aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 1390810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1391810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 139257067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 1393810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1394810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1395567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1396567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 139745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 139845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 139957067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 140045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 1401567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 140245839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 1403567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangPersistentVariables &persistent_vars = target->GetPersistentVariables(); 1404aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1405aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 1406e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 1407e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 1408e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 1409e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 14109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_material_vars->m_allocated_area = NULL; 1411e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1412e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 1413e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 1414e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1415567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything)); 1416810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1417f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 1418f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1419567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1420aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1421f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1422567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->DeallocateMemory(m_material_vars->m_materialized_location); 1423aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1424f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1425810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 14267a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 14277a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 14287a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 1429567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 14305a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 14315a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err); 1432f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1433f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 14345a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 14355a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct", 14365a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size)); 1437f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 14385a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 14395a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 1440aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 1441f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1442810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1443aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 1444810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1445aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 1446aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 1447810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1448427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 14498c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 14508c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 1451810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1452427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 14534d0b110715d321d366dec1dc690300f713b63236Sean Callanan 1454a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 1455336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 1456a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 1457427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 14581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 14591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 14601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1461aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 14621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 14631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 14645a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 14655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Couldn't get register context"); 14661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 14685a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 1469427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 1470427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 1471427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 1472427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 1473427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1474427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 14751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 14771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 14781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1479427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 14805a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 14815a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Variable being materialized doesn't have necessary state"); 14821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14835a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 14841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1485427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 1486427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 1489427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1490427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 14911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 14938c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1494a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 14958c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 1496a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 1497a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 1498a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 149945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 15006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1501a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 1502a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1503a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 1504a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 15056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1506a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 1507a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 15086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1509a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 1510a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 1511a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx, 1513a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 15140ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 15150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_top, 15160ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom, 1517a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 1518a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 1519f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1520a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 1521a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1522a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 15238c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1524a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 15258c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1526810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1527810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1528f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1529f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1530f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1531a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 15328de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 15338de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 15348de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 15358de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 1536427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 15378de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 15380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 15390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 15408de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 15418de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1542aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 15446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1545427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1546a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1547427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1548a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1549a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1550a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1551427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1552a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1553427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 15555a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 15565a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Persistent variable being materialized contains no data"); 1557a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 15585a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 1559a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1560a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1561567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1562567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 15646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1565a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1566a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 15686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 15696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 15716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 15726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 15746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 1576567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->ReadPointerFromMemory (addr, read_error); 15776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 15796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 15816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 15856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 15866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 15886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 15896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 159047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (), 159147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 159247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 159347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 159447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 159547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 159647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 15976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 16026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1605b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 16066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 16086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 161197678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 161297678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 16136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 16156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 16176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 16186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 16200ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 1622567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 16236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 16256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan if (stack_frame_top != LLDB_INVALID_ADDRESS && 16290ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom != LLDB_INVALID_ADDRESS && 16300ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem >= stack_frame_bottom && 16310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem <= stack_frame_top) 16320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 16330ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // If the variable is resident in the stack frame created by the expression, 16340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // then it cannot be relied upon to stay around. We treat it as needing 16350ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // reallocation. 16360ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16370ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 16380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 16390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; 16400ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 16410ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 16436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 16466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 16476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 16496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 16516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 16536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1654567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(mem); 16556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 16576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 16596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1665a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 16666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1667a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1668a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1669a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1670a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1671a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 16726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 16736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 16746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 16766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 16786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 16806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1681567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->AllocateMemory(pvar_byte_size, 16824b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 16834b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan allocate_error); 16846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 16866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 16886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 16926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 16936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 16956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 169647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 169747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 169847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 169947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 170047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 170147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 170247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 17036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 17056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 17076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 17086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 17106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1711567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 17126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 17146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 17196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 17206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 17226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1723567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 17244b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan var_sp->m_live_sp->GetValue().GetScalar(), 17254b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan process->GetAddressByteSize(), 17264b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan write_error)) 17276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 17296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1733c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong()); 17346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1735696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1736a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1738a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1739a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1740a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1741a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1742a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1743a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1744a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1745f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 17468de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 17478de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 17488de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 17498de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 17508de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 17516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 17528de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 17538de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 17548de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1755f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1756e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1757567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1758567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1759567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1760567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 17616d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get()) 17625a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 17635a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Necessary state for variable materialization isn't present"); 1764cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 17655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 1766cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17724a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var(expr_var->m_parser_vars->m_lldb_var); 17734a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym); 1774f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 17756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference); 17766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 1777819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 17784a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1779819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1780819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1781819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(GetVariableValue(exe_ctx, 1782819749647b1605f75753f625050cb240292c08b0Sean Callanan var, 1783819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1784819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1785819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym) 17864a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan { 178721ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny); 1788819749647b1605f75753f625050cb240292c08b0Sean Callanan 1789cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (location_load_addr == LLDB_INVALID_ADDRESS) 1790819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1791819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1792c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s", 1793c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1794819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1795819749647b1605f75753f625050cb240292c08b0Sean Callanan 17964a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan location_value.reset(new Value); 17974a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1798819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1799819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1800819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1801819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1802f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1803c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type", 1804c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1805f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1806f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1808841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 1809fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1810fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan StreamString my_stream_string; 1811fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1812fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangASTType::DumpTypeDescription (type.GetASTContext(), 1813fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan type.GetOpaqueQualType(), 1814fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan &my_stream_string); 1815fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1816c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf ("%s %s with type %s", 1817c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton dematerialize ? "Dematerializing" : "Materializing", 1818c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1819c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton my_stream_string.GetString().c_str()); 1820fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1821f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1822f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1823f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 18248de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1825f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1826f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 182717c6a05cb96f7110332342326a90692d9505982eSean Callanan 182817c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1829f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 18306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 18316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 183217c6a05cb96f7110332342326a90692d9505982eSean Callanan 183317c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 183417c6a05cb96f7110332342326a90692d9505982eSean Callanan 183517c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1836f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 183717c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1838f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 183917c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 184017c6a05cb96f7110332342326a90692d9505982eSean Callanan 184117c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 184217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1843c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s", 1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1845c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 184617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1847f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 184817c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 184917c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1850f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 18516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 185217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1853c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error write_error; 18546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 18566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 18576f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error read_error; 18586f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 18596f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error); 18606f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 18616f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!read_error.Success()) 18626f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 18636f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s", 18646f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 18656f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan read_error.AsCString()); 18666f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 18676f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 18686f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 18696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WritePointerToMemory(addr, 18706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan ref_value, 18716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 18726f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 18736f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 18746f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 18756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 18766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 18776f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 18786f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 18796f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 18806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 18816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WriteScalarToMemory (addr, 18826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan location_value->GetScalar(), 18836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 18846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 18856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 18866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 18876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 18886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 18896f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 18906f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 18916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 189217c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1893f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 189417c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 189517c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1896f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 18976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 189817c6a05cb96f7110332342326a90692d9505982eSean Callanan { 189917c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 190017c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 190117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1902c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s", 1903c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1904c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 190517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 190617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 190717c6a05cb96f7110332342326a90692d9505982eSean Callanan 1908061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 190917c6a05cb96f7110332342326a90692d9505982eSean Callanan 1910061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 191117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1912c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't get the register information for %s", 1913c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 191417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 191517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 191617c6a05cb96f7110332342326a90692d9505982eSean Callanan 1917061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1918061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1919061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 1920061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1921061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 192217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1923c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s", 1924c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1925c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 192617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 192717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 192817c6a05cb96f7110332342326a90692d9505982eSean Callanan 1929061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 193017c6a05cb96f7110332342326a90692d9505982eSean Callanan 193117c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 193217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 19336f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 19346f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; // reference types don't need demateralizing 19356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 19376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 19396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 19406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 19416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 19436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1944b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 19456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 19466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 19476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 19496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1950c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar ®_addr = expr_var->m_live_sp->GetValue().GetScalar(); 195117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1952c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, 1953c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1954c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1955c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1956061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 195717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1958061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1959061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 196017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1961c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to register %s", 1962c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1963c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 196417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 196517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 19666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 19686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1969567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong()); 19706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 19726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1973c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s", 1974c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1975c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton deallocate_error.AsCString()); 19766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 19786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 198017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 198117c6a05cb96f7110332342326a90692d9505982eSean Callanan else 198217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 19836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error write_error; 19846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan RegisterValue reg_value; 19866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!reg_ctx->ReadRegister (reg_info, reg_value)) 19886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19896f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read %s from %s", 19906f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19916f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name); 19926f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 19966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error = reg_ctx->WriteRegisterValueToMemory(reg_info, 19986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr, 19996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 20006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_value); 20016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!write_error.Success()) 20036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s", 20056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 20066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name, 20076f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 20086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 20096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20106f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20116f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; 20126f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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 20156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 20166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 20186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2019567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Scalar reg_addr (process->AllocateMemory (value_byte_size, 20206f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 20216f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan allocate_error)); 20226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2023c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS) 20246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2025c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s", 2026c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2027c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error.AsCString()); 20286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 20326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 203347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 203447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 203547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 203647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 2037c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 203847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 203947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 20406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 20426f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 2043567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 20446f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_addr, 20456f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 20466f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 20476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2048c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 2049c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2050c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 20516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 205517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2056c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is too big to store in %s", 2057c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2058c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 205917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 206017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 2061061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2062061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 206317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2064c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from %s", 2065c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2066c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 206717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 206817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 206917c6a05cb96f7110332342326a90692d9505982eSean Callanan 2070c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->WriteRegisterValueToMemory (reg_info, 2071c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 2072c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 2073c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 2074061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 207517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 207617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 2077f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2078f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2079f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 2080f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 2081810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 2082810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 20831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 20841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 20851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 20861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 20871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ExecutionContext &exe_ctx, 20881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 2089b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 20901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 20911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 20921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 20931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 20941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 2095061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 20961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 20971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2098061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 2099061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 21001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2101bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 21021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2105061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 21061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2107061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 21081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 21121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 21131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2114061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 21151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2116061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 21171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2120061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 2121061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 21221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 212395b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString()); 21241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 21291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 21301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2131696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 21328de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 21338de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 21348de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 21358de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 21368de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *type 21378de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 2138aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 2139e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2140cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 2141f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan ValueObjectSP valobj; 2142f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan VariableSP var_sp; 2143f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan Error err; 2144f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan 2145f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan valobj = frame.GetValueForVariableExpressionPath(name.GetCString(), 2146f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan eNoDynamicValues, 2147f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 2148f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan var_sp, 2149f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan err); 21503bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2151f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan if (!err.Success() || 2152f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan !var_sp || 2153ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->IsInScope(&frame) || 2154ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->LocationIsValidForFrame (&frame)) 2155ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return lldb::VariableSP(); 21563bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 21573bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 21583bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 21593bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 21603bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 216104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 2162696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 21633bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 21643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 21653bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 21663bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 21673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 2168696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 21693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 21703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 21713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2172696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return var_sp; 2173cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 2174336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2175819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol * 2176819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol 2177819749647b1605f75753f625050cb240292c08b0Sean Callanan( 2178819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 2179aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan const ConstString &name 2180819749647b1605f75753f625050cb240292c08b0Sean Callanan) 2181819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2182819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 2183819749647b1605f75753f625050cb240292c08b0Sean Callanan 2184aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, 2185aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan eSymbolTypeData, 2186aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sc_list); 2187819749647b1605f75753f625050cb240292c08b0Sean Callanan 2188819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 2189819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2190819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 2191819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 2192819749647b1605f75753f625050cb240292c08b0Sean Callanan 2193819749647b1605f75753f625050cb240292c08b0Sean Callanan return sym_ctx.symbol; 2194819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2195819749647b1605f75753f625050cb240292c08b0Sean Callanan 2196819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 2197819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2198819749647b1605f75753f625050cb240292c08b0Sean Callanan 219947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP 220047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable 220147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan( 220247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target &target, 220394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ModuleSP &module, 220494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan const ConstString &name, 220594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ClangNamespaceDecl *namespace_decl, 220647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser *type 220747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan) 220847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 220947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList vars; 221047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 221194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan if (module && namespace_decl) 221294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module->FindGlobalVariables (name, namespace_decl, true, -1, vars); 221394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan else 221494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan target.GetImages().FindGlobalVariables(name, true, -1, vars); 221547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 221647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (vars.GetSize()) 221747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 221847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type) 221947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 222047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < vars.GetSize(); ++i) 222147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 222247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableSP var_sp = vars.GetVariableAtIndex(i); 222347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 222447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 222547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 222647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 222747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return var_sp; 222847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 222947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 223047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 223147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 223247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 223347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return vars.GetVariableAtIndex(0); 223447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 223547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 223647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 223747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return VariableSP(); 223847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 223947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 224147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 224216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 2243f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context) 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2245f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 2246f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2247f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 2248f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2249e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22519394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (GetImportInProgress()) 2252ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 225367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 2254ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 2255ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 2256ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 2257e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 225867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan static unsigned int invocation_id = 0; 225967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id = invocation_id++; 226067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan 226116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 226216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 226316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (!context.m_decl_context) 22649394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString()); 226516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context)) 22669394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str()); 226716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 22689394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName()); 226916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 22709394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 227116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context)) 227216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 227373b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context); 2274a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 227567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 22765a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", 227767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 227867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan namespace_map.get(), 227967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (int)namespace_map->size()); 2280a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2281a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan if (!namespace_map) 2282a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan return; 2283a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan 228416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); 228516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i != e; 228616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ++i) 228716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 228816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 22899394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", 229067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 229116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->second.GetNamespaceDecl()->getNameAsString().c_str(), 229216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->first->GetFileSpec().GetFilename().GetCString()); 229316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 2294c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan FindExternalVisibleDecls(context, 2295c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->first, 2296c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->second, 229767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 229816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 229916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2300e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan else if (isa<TranslationUnitDecl>(context.m_decl_context)) 230116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 230216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangNamespaceDecl namespace_decl; 230316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 230416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 23059394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id); 230616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 230716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan FindExternalVisibleDecls(context, 230816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP(), 230916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl, 231067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 231116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2312a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 23139394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (!context.m_found.variable) 23149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan ClangASTSource::FindExternalVisibleDecls(context); 231516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan} 231616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 231716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 231816b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, 231938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan lldb::ModuleSP module_sp, 232003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl &namespace_decl, 232167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 232216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{ 2323f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 232416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 232516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 23269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 2327e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 232824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23299394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 23309394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 23313bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 23323bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 23333bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 23343bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 23359394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 23368f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString id_name("id"); 23378f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString Class_name("Class"); 23388f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 23398f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (name == id_name || name == Class_name) 23408f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return; 23418f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 23428de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 23438de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 2344567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2345567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr(); 234603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (name_unique_cstr[0] == '$' && !namespace_decl) 23473cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 234857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 234947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 235057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 235157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 235257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 235357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2354567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 235547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 235647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2357567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableList *vars = frame->GetVariableList(false); 235857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 235957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!vars) 236057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 236157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 236257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 236357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 236475a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!this_var || 2365567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !this_var->IsInScope(frame) || 2366567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !this_var->LocationIsValidForFrame (frame)) 236757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 236857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 236957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton Type *this_type = this_var->GetType(); 237057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 237157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_type) 237257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 237357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 237467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 23752403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 23769394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf (" CEDM::FEVD[%u] Type for \"this\" is: ", current_id); 23772403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton StreamString strm; 23782403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton this_type->Dump(&strm, true); 23792403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString (strm.GetData()); 23802403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 238103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 238204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser this_user_type(this_type->GetClangFullType(), 238357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 238457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2385aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type = this_user_type; 238657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 238758baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 238857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 238957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(), 239057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton &pointer_target_type)) 239157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 239257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2393c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type); 2394c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2395c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan if (pointer_target_qual_type.isConstQualified()) 2396c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan pointer_target_qual_type.removeLocalConst(); 2397c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2398c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(), 239957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 240003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 24013aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 24023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 2403a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(pointer_target_qual_type); 24049394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString()); 24053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 24063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2407e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan AddOneType(context, class_user_type, current_id, true); 240857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 240957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 241057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 241157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 24123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 24133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 24143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 24153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 24163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2417567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 241847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 2419e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2420e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 242147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2422e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!sym_ctx.function) 2423e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 242403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2425e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan clang::DeclContext *decl_context; 2426e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2427e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (sym_ctx.block && sym_ctx.block->GetInlinedFunctionInfo()) 2428e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan decl_context = sym_ctx.block->GetClangDeclContextForInlinedFunction(); 2429e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan else 2430e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan decl_context = sym_ctx.function->GetClangDeclContext(); 2431e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2432e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!decl_context) 24333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 243403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2435e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context); 2436e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2437e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!method_decl) 2438e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 2439e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2440e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan ObjCInterfaceDecl* self_interface = method_decl->getClassInterface(); 2441e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2442e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!self_interface) 2443e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 2444e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2445e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan const clang::Type *interface_type = self_interface->getTypeForDecl(); 2446e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2447e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(), 2448e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan &method_decl->getASTContext()); 2449e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2450e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (log) 2451e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan { 2452e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan ASTDumper ast_dumper(interface_type); 2453e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 2454e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan } 2455e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2456e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan AddOneType(context, class_user_type, current_id, false); 2457e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2458e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan VariableList *vars = frame->GetVariableList(false); 2459e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 24603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 246103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 246275a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!self_var || 2463567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !self_var->IsInScope(frame) || 2464567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !self_var->LocationIsValidForFrame (frame)) 24653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 246603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 24673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Type *self_type = self_var->GetType(); 24683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 24693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_type) 24703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 247103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 247204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser self_user_type(self_type->GetClangFullType(), 24733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 24743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 24753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 24763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 24773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 2478c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan 2479c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan // any other $__lldb names should be weeded out now 2480c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) 2481c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan return; 248203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 24832431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan do 24842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan { 2485567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 24862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 24872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2488567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); 24892431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 24902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_clang_ast_context) 24912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 24922431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 24932431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 24942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 24952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_ast_context) 24962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 24972431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 24982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); 249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 25002431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!ptype_type_decl) 25012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2503e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl); 25042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_decl) 25062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25082431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); 25092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_type_decl) 25112431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25132431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (log) 25149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString()); 25152431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25162431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan context.AddNamedDecl(parser_ptype_type_decl); 25172431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan } while (0); 25182431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2519427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 252003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2521427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 25221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 252367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, pvar_sp, current_id); 25241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 25251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 25261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 25271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 25281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2529aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->GetRegisterContext()) 25301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2531b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); 25329394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 25331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 2534e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan { 2535e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (log) 25369394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name); 2537e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 253867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneRegister(context, reg_info, current_id); 2539e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan } 25401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 25418de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 254203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 254303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 254403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ValueObjectSP valobj; 254503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan VariableSP var; 254603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Error err; 254703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 254803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (frame && !namespace_decl) 254903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 255003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr, 255103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan eNoDynamicValues, 255203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 255303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan var, 255403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan err); 255503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 255603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // If we found a variable in scope, no need to pull up function names 255703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (err.Success() && var != NULL) 255803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 255989e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 256016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 25613a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan return; 256203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 256303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 25641c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan 25651c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan if (target) 256603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 256794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan var = FindGlobalVariable (*target, 256838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp, 256994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan name, 257094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan &namespace_decl, 257103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NULL); 257203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 257303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (var) 257403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2575f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan valobj = ValueObjectVariable::Create(target, var); 257689e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 257716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 25781c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan return; 257903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 258003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 258103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 258216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 258303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 258403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool include_symbols = true; 258503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool append = false; 2586a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 258738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (namespace_decl && module_sp) 2588a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 258938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp->FindFunctions(name, 259038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan &namespace_decl, 259138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan eFunctionNameTypeBase, 259238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan include_symbols, 259338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan append, 259438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan sc_list); 2595a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2596a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan else 2597a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 2598a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan target->GetImages().FindFunctions(name, 2599a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan eFunctionNameTypeBase, 2600a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 2601a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 2602a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 2603a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2604a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 260503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sc_list.GetSize()) 260603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 260703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *generic_symbol = NULL; 260803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *non_extern_symbol = NULL; 260903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 261003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 261103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan index < num_indices; 261203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++index) 261303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 261403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext sym_ctx; 261503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 261603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 261703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.function) 261803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 261903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // TODO only do this if it's a C function; C++ functions may be 262003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // overloaded 262116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 262267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction(context, sym_ctx.function, NULL, current_id); 262316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function_with_type_info = true; 262416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 262503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 262603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (sym_ctx.symbol) 262703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 262803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.symbol->IsExternal()) 262903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan generic_symbol = sym_ctx.symbol; 263003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 263103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan non_extern_symbol = sym_ctx.symbol; 263203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 263303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 263403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 263516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 263603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 263703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (generic_symbol) 263803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 263967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, generic_symbol, current_id); 264016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 264103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 264203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (non_extern_symbol) 264303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 264467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, non_extern_symbol, current_id); 264516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 264603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 264703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 264803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 264903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 265016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 265103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 265216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic 265303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 265403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2655aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan Symbol *data_symbol = FindGlobalDataSymbol(*target, name); 265603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 265703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (data_symbol) 265803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 265967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneGenericVariable(context, *data_symbol, current_id); 266016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 266103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 266203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 266303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 2664b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan } 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2666e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2667336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 26688de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 26698de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 26708de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 26714a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var, 26729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context, 26738de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 26748de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 26758de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2677e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 26786184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2683810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2684810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 2685336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 268804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2692810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2693810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 2694336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2699b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 270024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2701810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2702810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 2703336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2706336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 2707336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 270924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2710178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 2711178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 2712567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2713567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2714178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 2715178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 2716178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 2717178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 2718567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target); 2719178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2722bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2724810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2725810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 2726336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2728b01000fd063629facd45044f137446fb748ee179Greg Clayton 272958baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *type_to_use = NULL; 2730336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2731f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 2732f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 2733b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 2734f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 27354b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 27364b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 27374b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 27384b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 27394b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 27404b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 27414b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 27424b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 2743f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 2744f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 2745f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2746336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 2747336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 274824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 27506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 2756336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 2758336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 275924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 2763336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 2764336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2767567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 276947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 277047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 277147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->GetScalar() = load_addr; 277247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->SetValueType(Value::eValueTypeLoadAddress); 277347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2776f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 2777b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 2778336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2779336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 2780336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 2781336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2782336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 278389e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id) 2784336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 2785aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2786aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2787e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 278847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2789f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 2790f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 2791336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2792aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx, 27938de27c761a22187ef63fb60000894be163e7285fGreg Clayton var, 2794f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context, 27958de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 27968de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 2797336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 27984b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 27994b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 28004b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 28016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan NamedDecl *var_decl; 28026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 28036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType()); 28046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 28056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 28066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); 28076f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 28086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 28096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 28108de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2811427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 281289e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj)); 281389e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan 2814427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 2815427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2816427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 2817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2818427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2819427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 2820696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan entity->m_parser_vars->m_lldb_var = var; 282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28226f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 28236f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan entity->m_flags |= ClangExpressionVariable::EVTypeIsReference; 28246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 2825810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 28268de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2827aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan ASTDumper orig_dumper(ut.GetOpaqueQualType()); 2828a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 2829aa56141b061ca23a447d48c27bf1f35017405376Sean 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()); 28308de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 28318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 28328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 28338f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 2834a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 283567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan ClangExpressionVariableSP &pvar_sp, 283667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 2837a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 2838e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 283945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 2840427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 2841a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2842f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (GuardedCopyType(m_ast_context, 2843427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 2844427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 2845f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 2846a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2847dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!parser_type.GetOpaqueQualType()) 2848dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 2849dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 2850dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString()); 2851dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 2852dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 2853dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 28546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 28558c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2856427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 2857427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 2858427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 2859427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 2860427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 286145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 286245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 2863a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 2864a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 28659394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString()); 2866a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 2867a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 2868a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 28691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 2870819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 287167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol &symbol, 287267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 2873819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2874819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 2875819749647b1605f75753f625050cb240292c08b0Sean Callanan 2876819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2877819749647b1605f75753f625050cb240292c08b0Sean Callanan 2878567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2879567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2880567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 2881567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return; 2882567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2883567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 2884819749647b1605f75753f625050cb240292c08b0Sean Callanan 2885fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)), 2886819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 2887819749647b1605f75753f625050cb240292c08b0Sean Callanan 2888f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)), 2889f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 2890819749647b1605f75753f625050cb240292c08b0Sean Callanan 2891fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 2892819749647b1605f75753f625050cb240292c08b0Sean Callanan 2893819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2894819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 2895819749647b1605f75753f625050cb240292c08b0Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2896819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 2897819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 289847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 289947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2900819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 2901819749647b1605f75753f625050cb240292c08b0Sean Callanan 2902819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 2903819749647b1605f75753f625050cb240292c08b0Sean Callanan 2904819749647b1605f75753f625050cb240292c08b0Sean Callanan AddressRange &symbol_range = symbol.GetAddressRangeRef(); 2905819749647b1605f75753f625050cb240292c08b0Sean Callanan Address &symbol_address = symbol_range.GetBaseAddress(); 2906567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 2907819749647b1605f75753f625050cb240292c08b0Sean Callanan 2908819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2909819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 2910819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 2911819749647b1605f75753f625050cb240292c08b0Sean Callanan 2912fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->EnableParserVars(); 2913819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2914819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_named_decl = var_decl; 2915819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_llvm_value = NULL; 2916819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_value = symbol_location.release(); 2917819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_sym = &symbol; 2918819749647b1605f75753f625050cb240292c08b0Sean Callanan 2919819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 2920819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2921a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 2922819749647b1605f75753f625050cb240292c08b0Sean Callanan 29239394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 2924819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2925819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2926819749647b1605f75753f625050cb240292c08b0Sean Callanan 2927fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 2928fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 2929fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 2930fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2931567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2932567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 2934fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2935fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 2936fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 2937fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 2938fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2939fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 2940fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2941fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 2942fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2943fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl; 2944fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 2945fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2946fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 2947fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2948fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2949fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 2950fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 2951fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2952fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2953fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2954fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2955a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl)); 2956a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString()); 2957fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2958fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2959fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 2960fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 2961fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 29625a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 2963fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2964dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 2965dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 2966dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 2967dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable"); 2968dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 2969dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 2970dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 2971dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 2972fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 2973fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2974fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2975fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2976fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2977fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangAST(user_type.GetASTContext()); 2978fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangType(user_type.GetOpaqueQualType()); 2979fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2980fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 2981fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2982fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2983fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2984fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 2985fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 2986fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2987819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 2988427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 298967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const RegisterInfo *reg_info, 299067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 29911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 29921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 29931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2994f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context, 29951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 29961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 29971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 29991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 3000122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen if (log) 300167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 30021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 30031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 30041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3005427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 3006f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 30071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 30081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 30091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3010fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 301147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 301247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3013427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 30141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 3015427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 3016427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 3017427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 3018427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 3019427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 3020427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 3021427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 30221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 302367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 30241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 3025a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 30269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString()); 30271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 30281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 30291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3030a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 3031da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 3032da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Function* fun, 303367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol* symbol, 303467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 30358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 3036aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 3037aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 3038e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 30398f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 304058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan NamedDecl *fun_decl = NULL; 30410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 304258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan const Address *fun_address = NULL; 30438f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 30440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 30450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 30469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *fun_ast_context = NULL; 30478f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 30480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 30490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 30510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 30530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 305567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no type"); 30560fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 30570fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 305904c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton fun_opaque_type = fun_type->GetClangFullType(); 30600fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 30620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 306467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no Clang type"); 30650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 30660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 30690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 3070b01000fd063629facd45044f137446fb748ee179Greg Clayton fun_ast_context = fun_type->GetClangASTContext().getASTContext(); 3071f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type); 3072a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (copied_type) 3073a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3074a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_decl = context.AddFunDecl(copied_type); 3075a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 3076a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton else 3077a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3078a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton // We failed to copy the type we found 3079a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (log) 3080a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3081a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt", 3082a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetName().GetCString(), 3083a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetID()); 3084a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 308516089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan 308616089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan return; 3087a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 30880fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 30900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 30920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 30940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 30968f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 3097810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 309867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" AddOneFunction called with no function and no symbol"); 30998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 31008f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 31018f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 3103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3104567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target); 31058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 31068f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 31078f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3108fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 310947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 311047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3111427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 31128de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 3113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 3114427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 3115427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 3116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 3118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 3119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 3120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 31218c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3122810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 31238de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3124a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(fun_decl); 3125a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 31269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found %s function %s, returned %s", 312767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 312867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (fun ? "specific" : "generic"), 312967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan decl_name.c_str(), 3130a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ast_dumper.GetCString()); 31318de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 313224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 313393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 313493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 313593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 31363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 313767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id, 31383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 313993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 3140f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan ASTContext *parser_ast_context = m_ast_context; 31419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *user_ast_context = ut.GetASTContext(); 31423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3143ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 3144dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3145dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 3146dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3147dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3148dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3149dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3150dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type"); 3151dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3152dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 3153dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 31549394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 31553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 31563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 31573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 31583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 31593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 31603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3161716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 3162716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 3163716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan args, 3164716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 1, 3165716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan false, 3166716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 3167716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 31681d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 31691d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 31701d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 317130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 317228ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan const bool is_attr_used = true; 31732581dbf7292c6272bb771fe396ab30921385d669Sean Callanan const bool is_artificial = false; 317430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 31751d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 31761d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 31778de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 31781d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 31791d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 31801d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 31811d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 318230449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 3183716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan is_explicit, 31842581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_attr_used, 31852581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_artificial); 31863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 318793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 318893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 318993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 3190