ClangExpressionDeclMap.cpp revision 0eca1a7136ec5a48d8cf97decf157dc04c93512a
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" 256e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 27a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h" 28cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 40f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 41810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 4217c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 44f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 46a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 483bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) : 538de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 548de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 55dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_keep_result_in_memory (keep_result_in_memory), 56aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 57dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_struct_vars () 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 65aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 66aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 67aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 68166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool 69427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 708c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_exe_ctx = &exe_ctx; 73567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 74567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 75567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr()) 76567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 77567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetThreadPtr()) 78567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetProcessPtr()) 80987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 81987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 83987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (target) 85987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 86987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 87567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 88987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 8997ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan 90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 91567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 92567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_persistent_vars = &target->GetPersistentVariables(); 93166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 94567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetScratchClangASTContext()) 95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 97166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 9847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info = GetTargetInfo(); 9947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 100166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan return true; 101aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 102c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 104427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 105aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 106aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 107aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 108427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 112427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (var_sp && 114427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars.get() && 115427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_lldb_value) 116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton delete var_sp->m_parser_vars->m_lldb_value; 117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->DisableParserVars(); 119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 126427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 127427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->DisableParserVars(); 128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1317a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 13647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo 13747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo() 13847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 13947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 14047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetInfo ret; 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 144567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 146567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 147567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 148567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 149567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.byte_order = process->GetByteOrder(); 150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.address_byte_size = process->GetAddressByteSize(); 151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.byte_order = target->GetArchitecture().GetByteOrder(); 158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 16147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ret; 16447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1668de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1678de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 16882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 169aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 170aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 171aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 172427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 173427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton Target *target = m_parser_vars->GetTarget(); 174427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (target); 175427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName(); 176427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 177aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 17882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 17982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 18005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP 18105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name, 18205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan lldb_private::TypeFromParser type, 18305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan const llvm::APInt& value) 18405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{ 18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan assert (m_parser_vars.get()); 186166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 187fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 188567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 189567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 190567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 191567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 192567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 19305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 19405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 19505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetASTContext(), 19605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetOpaqueQualType()), 19705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 19847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 199fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 200fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 2010e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 20247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 2040e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 2050e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2060e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 2070e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2080e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 2090e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 21005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2110e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 2120e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 2130e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 21405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 21505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 21647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 21705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 2180e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 21905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 22005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 22105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 22205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 22305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2242bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (size_t byte_idx = 0; 22505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 22805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 22905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (m_parser_vars->m_target_info.byte_order) 23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 2340e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 2350e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 2360e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 2370e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 2380e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 2400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 2420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 2430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 2440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 2460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 24805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 2496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 251696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 252696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 25505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 25605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 257696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP 258696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name, 2599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan VarDecl *decl, 260696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb_private::TypeFromParser type) 261696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{ 262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan assert (m_parser_vars.get()); 263696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 264696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 267567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 268567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 269567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 270567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 271567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 273567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 274696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 275696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 276696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 277696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return ClangExpressionVariableSP(); 282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan type.GetASTContext(), 285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan type.GetOpaqueQualType()), 286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan context); 287696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 288696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser var_type = var_sp->GetTypeFromUser(); 289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 290567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 291567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL) 292567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 293567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 294567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type); 295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var) 297696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable 298696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 299567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues); 300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_valobj) 302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 303696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 304696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type); 305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_casted_valobj) 307696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 308696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 309696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (log) 310696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan { 311696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan StreamString my_stream_string; 312696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangASTType::DumpTypeDescription (var_type.GetASTContext(), 314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_type.GetOpaqueQualType(), 315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan &my_stream_string); 316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 317696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 318696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str()); 319696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan } 320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj); 322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!pvar_sp) 324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name)) 327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return pvar_sp; 334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan} 335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 33647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 33747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name) 33847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 33947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 34047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference); 34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj, 34647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 34747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ConstString &name, 348a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::TypeFromParser type, 349a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan bool transient) 35047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 35147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 35247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 35447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pvar_sp) 35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 359a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !pvar_sp->m_live_sp && 360a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !transient) 36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The reference comes from the program. We need to set up a live SP for it. 36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetASTContext(), 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetOpaqueQualType(), 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetName(), 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value.GetScalar().ULongLong(), 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value.GetValueAddressType(), 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetByteSize()); 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry) 37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->ValueUpdated(); 37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t pvar_byte_size = pvar_sp->GetByteSize(); 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!ReadTarget(pvar_data, value, pvar_byte_size)) 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry); 38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan valobj = pvar_sp; 38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 3928de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 3938de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3949b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 3958de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 3966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 3976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 3986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 3998de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 400a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 401aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 402aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 4036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 404fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 405567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 406567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 407567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 408567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 409567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 412a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 413a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 41482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetASTContext(), 41582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetOpaqueQualType()), 41697678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_parser_vars->m_target_info.IsValid()) 41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 420a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 421fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 422fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 423427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 4268c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4278c12720c108cd5e7ed792596749218d8400f647eSean Callanan 428427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 4298c12720c108cd5e7ed792596749218d8400f647eSean Callanan 430427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4318c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4328c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 4346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 4356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 4376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 4396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 4416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 4456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 4466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 4506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 451427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableParserVars(); 4528c12720c108cd5e7ed792596749218d8400f647eSean Callanan 453427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_named_decl = decl; 454427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_parser_type = parser_type; 4558c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4568c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 457a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 458a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 459a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 4608de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 4618de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4629b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 4638de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4648de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 4658de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 4668de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 4678de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 4688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 469aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 470aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 471aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 472e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 47345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 4758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4768c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 4778c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 4788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 479427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan 481427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 482427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 4838c12720c108cd5e7ed792596749218d8400f647eSean Callanan 484427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4868c12720c108cd5e7ed792596749218d8400f647eSean Callanan 48745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 48845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan log->Printf("Adding value for decl %p [%s - %s] to the structure", 48945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 4908de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 491427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 49245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 4938c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 4948c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 495427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_llvm_value = value; 4968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 497427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableJITVars(); 498427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_alignment = alignment; 499427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_size = size; 5008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 501427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 5028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 5088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 509aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 510aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 511aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 5128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 5158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 516aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 517aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 519427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 5208c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 5218c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 5228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 523427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 524427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 525427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 526427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 527427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 5288c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5308c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment; 5328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 533427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (cursor % member_sp->m_jit_vars->m_alignment) 534427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment)); 5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan 536427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset = cursor; 537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += member_sp->m_jit_vars->m_size; 5388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 5398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 540aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 5418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 542aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 5438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5468de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 5478de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5488de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 5498de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 5508de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 5518de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 553aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 554aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 555aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 5568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 558427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 559aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 560aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5668de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 5678de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5689b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *&decl, 5698de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 5708de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 5718de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 5728de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 5738de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 575aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 576aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 577aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 5788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 580427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 5818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 583427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 5848c12720c108cd5e7ed792596749218d8400f647eSean Callanan 585427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp || 586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_parser_vars.get() || 587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_jit_vars.get()) 5888c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton decl = member_sp->m_parser_vars->m_named_decl; 591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = member_sp->m_parser_vars->m_llvm_value; 592427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton offset = member_sp->m_jit_vars->m_offset; 593427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 5948c12720c108cd5e7ed792596749218d8400f647eSean Callanan 5958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 59802fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 5998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 6008de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 6028de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value**& value, 6038de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 6048de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 605ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 606427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl)); 6078c12720c108cd5e7ed792596749218d8400f647eSean Callanan 608427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 6098c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 610ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 6118c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 6128c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 613ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 614427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = &entity_sp->m_parser_vars->m_llvm_value; 615427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 6168c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6178c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 618ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 619ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 620ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void 621ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext 622ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan( 623ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan const ConstString &name, 624ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContext &sym_ctx, 625ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContextList &sc_list 626ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan) 627ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{ 628ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (sym_ctx.module_sp) 6293e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan sym_ctx.module_sp->FindSymbolsWithNameAndType(name, NULL, eSymbolTypeCode, sc_list); 630ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 631ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (!sc_list.GetSize()) 632ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 633ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan} 634ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 635f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 6368de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 6378de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6388de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 639da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 6408de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 641f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 642aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 643aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 644aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 645567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 646567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 647567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 648567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 649f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 65178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 65278b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 653f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 654f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 655e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 656f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 657ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 658ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 659e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 660aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 661aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 662aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 663aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 664aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan Mangled mangled(name.GetCString(), true); 665aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 666aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan ConstString demangled_name = mangled.GetDemangledName(); 667aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 668aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (strlen(demangled_name.GetCString())) 669aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 670aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan std::string const_name_scratch(demangled_name.GetCString()); 671aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 672aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan const_name_scratch.append(" const"); 673aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 674aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan ConstString const_name(const_name_scratch.c_str()); 675aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 676ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 677aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 678aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 679aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString()); 680aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 681aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 682aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 683aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 684f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 685f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 686f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 687e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 688f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 689da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 690f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 691f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 692da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 693f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 694da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 696f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 697f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 698ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 699ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 700ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 701567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton func_addr = func_so_addr->GetCallableLoadAddress (target); 702da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 703f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 704f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 705f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 706cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 707cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name) 708c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 709c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 710c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 711819749647b1605f75753f625050cb240292c08b0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); 712c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 713cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 714cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 715cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 716cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++) 717cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 718cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 719cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 720c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 721cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 722ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 723ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 724ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return LLDB_INVALID_ADDRESS; 725ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 726cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 727cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 728cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 729cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 730cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 731cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 732cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 733cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 734cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 735cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 736cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 737cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 738cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 739cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 740cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 741cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 742cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeExtern: 743cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 744cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 745cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 746cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 748cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 749cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 750cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 752cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 753cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 757cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 763c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 765c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 766c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 768cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name) 769819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 770819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 771819749647b1605f75753f625050cb240292c08b0Sean Callanan 772819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!m_parser_vars->m_exe_ctx || 773567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !m_parser_vars->m_exe_ctx->GetTargetPtr()) 774819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 775819749647b1605f75753f625050cb240292c08b0Sean Callanan 776567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name); 777819749647b1605f75753f625050cb240292c08b0Sean Callanan} 778819749647b1605f75753f625050cb240292c08b0Sean Callanan 77947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter 78047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 78147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 78247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value, 78347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint8_t *data, 78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 78847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 790567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 793567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 79447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 79547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterContext *reg_ctx = exe_ctx->GetRegisterContext(); 79747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 79847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 80147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 80447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 805567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err)) 80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return reg_ctx->WriteRegister(reg_info, reg_value); 80947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 81047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 818567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 821567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 82347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 824567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 827567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = file_addr.GetLoadAddress(target); 82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 830567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory(load_addr, data, length, err); 83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 836567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 840567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy ((void *)value.GetScalar().ULongLong(), data, length); 84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data, 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 861567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 862567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 863567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 866567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterContext *reg_ctx = exe_ctx->GetRegisterContext(); 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx->ReadRegister(reg_info, reg_value)) 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 881567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err); 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 891567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 892567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 897567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 901567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton target->ReadMemory(file_addr, true, data, length, err); 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 907567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy (data, (const void *)value.GetScalar().ULongLong(), length); 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value 92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl) 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx; 93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl)); 93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl)); 93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (expr_var_sp) 93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ConstString &name(expr_var_sp->GetName()); 93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser type(expr_var_sp->GetTypeFromUser()); 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 939567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr(); 940567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame) 94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 942567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var(FindVariableInScope (*frame, name, &type)); 94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (var) 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return *GetVariableValue(exe_ctx, var, NULL); 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 948567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 949567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 950567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 95294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan lldb::ModuleSP module; 95394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan 95494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan VariableSP global(FindGlobalVariable (*target, module, name, NULL, &type)); 95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (global) 95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return *GetVariableValue(exe_ctx, global, NULL); 95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 959567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t location_load_addr = GetSymbolAddress(*target, name); 96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (location_load_addr != LLDB_INVALID_ADDRESS) 96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value ret; 96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ret.GetScalar() = location_load_addr; 96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ret; 96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Value(); 97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else if (persistent_var_sp) 97447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 975a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference || 976a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) && 977a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_live_sp) 978a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 979a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return persistent_var_sp->m_live_sp->GetValue(); 980a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 981a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan else 982a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 983a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::Value ret; 984a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetValueType(Value::eValueTypeHostAddress); 985a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 986a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes(); 987a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return ret; 988a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 99147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Value(); 99347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 996810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 997f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 998f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 9998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 10008de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1001aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 10028de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 10038de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 10048de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1005f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1006aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 1007aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1008567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_material_vars->m_process = exe_ctx.GetProcessPtr(); 1009aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 10100ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan bool result = DoMaterialize(false /* dematerialize */, 10110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan exe_ctx, 10120ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* top of stack frame */, 10130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* bottom of stack frame */, 10140ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan NULL, /* result SP */ 10150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan err); 1016f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1017f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 1018aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 1019f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1020f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 1021f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1022f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1023f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 10248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 10258de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 10268de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 10273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 1028aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 1029047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 1030047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 10318de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 10323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 1033aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1034aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1035567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1036567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1037567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1038567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1039567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL || process == NULL || target == NULL) 10403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because the context is incomplete"); 10423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1045aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 10463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because its type is unknown"); 10483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1051567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP object_ptr_var = FindVariableInScope (*frame, 1052696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 1053696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type)); 10543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 10553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 10563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString()); 10583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10593c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10603c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1061aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 10623c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr_var, 1063aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 10643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 10653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 10663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 10683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 107150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 10723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 107350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 107450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 107550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 107650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 10773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 107850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 1079567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize(); 108050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 108150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 108250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 108350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 108450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 108550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 108650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 108750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 108850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 1089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton object_ptr = process->ReadPointerFromMemory (value_addr, read_error); 1090c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS) 109150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 109250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 109350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 1094c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 109550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 10963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 109750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 10983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 109950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 110050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 110150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 110250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 110350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 110450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 110550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 110650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 110750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1108061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 110950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1110061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 111150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 111250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 111350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 111450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 111550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1116061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 111750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1118061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 111950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 1120061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 112150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 112250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 112350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1124061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 112550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1126061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 112750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 112850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 11293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 11323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11333c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 11348de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 11358de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 1137427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 11380ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 11390ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 11408de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 11418de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1142f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 11430ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err); 1144aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1145aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 1146aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 1147aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1148aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 1149aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 1150aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1151aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 1152aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1153aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1154aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1155aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 1156aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1157aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 1158aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 1159aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 1160aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1161aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1162aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1163aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 1164aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1165f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1166f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 116732824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 11688de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 11698de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1170aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 11718de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 11728de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 11738de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 117432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 1175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 1177aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1178aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 117932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 118032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 118132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 118232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 1183567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1184567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1185567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 118632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 118732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 118832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 118932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 119032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1191567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1192567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 119332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 119432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 119532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 119632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 119732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 11983371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 11993371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 12003371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 12013371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 12023371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 12033371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 1204c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 120532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 120632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 1207567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (m_material_vars->m_materialized_location, 1208c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetBytes(), 1209c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetByteSize(), error) != data_sp->GetByteSize()) 121032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 121132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 121232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 121332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 121432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1215567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize()); 121632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1217427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 1218427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 1219427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 122032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 1221427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 122232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1223427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 1224427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 1225427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 12278c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1228427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 12298c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 12308c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 1233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 1234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 1235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 1236427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 1237427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 1238427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 1239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 124032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 124132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 124232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 124332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 124432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 124532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 124632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1247f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 12488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 12498de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 12508de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 1251aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 12520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 12530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 1254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 12558de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 12568de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1257810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 1258427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 1259427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 1260427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1261aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1262aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1263e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 126482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 1265aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 1266810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1267810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 126857067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 1269810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1270810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1271567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 127345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 127445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 127557067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 127645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 1277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 127845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 1279567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangPersistentVariables &persistent_vars = target->GetPersistentVariables(); 1280aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1281aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 1282e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 1283e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 1284e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 1285e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 12869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_material_vars->m_allocated_area = NULL; 1287e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1288e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 1289e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 1290e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1291567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything)); 1292810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1293f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 1294f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1295567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1296aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1297f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1298567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->DeallocateMemory(m_material_vars->m_materialized_location); 1299aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1300f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1301810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 13027a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 13037a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 13047a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 1305567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 1306aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 1307aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan err); 1308f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1309f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 1310f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1311f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1312aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 1313f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1314810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1315aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 1316810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1317aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 1318aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 1319810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1320427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 13218c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 13228c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 1323810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 13254d0b110715d321d366dec1dc690300f713b63236Sean Callanan 1326a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 1327336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 1328a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 1329427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 13301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 13311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 13321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1333aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 13341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 13361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1338427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 1339427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 1340427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 1341427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 1342427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1343427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 13441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 13471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1348427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 13491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1351427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 1352427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 13536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 13546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 1355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 13571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13598c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1360a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 13618c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 1362a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 1363a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 1364a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 136545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 13666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1367a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 1368a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1369a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 1370a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 13716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1372a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 1373a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 13746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1375a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 1376a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 1377a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 13786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx, 1379a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 13800ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 13810ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_top, 13820ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom, 1383a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 1384a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 1385f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1386a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 1387a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1388a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 13898c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1390a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 13918c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1392810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1393810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1394f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1395f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1396f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1397a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 13988de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 13998de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 14008de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 14018de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 1402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 14038de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 14040ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 14050ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 14068de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 14078de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1408aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 14096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 14106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1412a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1414a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1415a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1416a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1417427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1418a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1419427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1420427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 1421a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 1422a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1423a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1424567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1425567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 14266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 14276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1428a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1429a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 14306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 14316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 14326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 14346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 14356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 14376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 1439567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->ReadPointerFromMemory (addr, read_error); 14406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 14426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 14446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 14486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 14496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 14516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 14526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 145347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (), 145447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 145547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 145647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 145747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 145847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 145947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 14606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 14636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 14656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1468b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 14696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 14716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 147497678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 147597678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 14766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 14806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 14816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 14830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 14846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 1485567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 14866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan if (stack_frame_top != LLDB_INVALID_ADDRESS && 14920ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom != LLDB_INVALID_ADDRESS && 14930ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem >= stack_frame_bottom && 14940ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem <= stack_frame_top) 14950ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 14960ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // If the variable is resident in the stack frame created by the expression, 14970ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // then it cannot be relied upon to stay around. We treat it as needing 14980ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // reallocation. 14990ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 15000ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 15010ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 15020ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; 15030ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 15040ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 15056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 15066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 15096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 15106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 15146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 15166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1517567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(mem); 15186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 15206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 15226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1528a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 15296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1530a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1531a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1532a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1533a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1534a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 15356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 15366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 15376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 15396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 15416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1544567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->AllocateMemory(pvar_byte_size, 15456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 15466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan allocate_error); 15476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 15496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 15516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 15556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 15566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 15586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 155947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 156047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 156147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 156247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 156347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 156447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 156547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 15666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 15686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 15706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 15716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 15736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1574567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 15756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 15776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 15826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 15836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 15856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1586567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 1587c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton var_sp->m_live_sp->GetValue().GetScalar(), 1588567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->GetAddressByteSize(), 1589c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 15906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 15926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1596c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong()); 15976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1598696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1599a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1601a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1602a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1603a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1604a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1605a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1606a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1607a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1608f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 16098de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 16108de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 16118de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 16128de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 16138de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 16146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 16158de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 16168de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 16178de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1618f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1619e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1620567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1621567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1622567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1623567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1624567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame || !process || !target) 1625cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 1626cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 16286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 16306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 16316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1632567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var = FindVariableInScope (*frame, name, &type); 16330eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan 16340eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan ModuleSP module; 16350eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan 16360eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan Symbol *sym = FindGlobalDataSymbol(*target, module, name, NULL); 1637f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1638819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 1639819749647b1605f75753f625050cb240292c08b0Sean Callanan 1640819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1641819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1642819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(GetVariableValue(exe_ctx, 1643819749647b1605f75753f625050cb240292c08b0Sean Callanan var, 1644819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1645819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1646819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym) 1647ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan { 1648819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(new Value); 1649819749647b1605f75753f625050cb240292c08b0Sean Callanan 1650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton addr_t location_load_addr = GetSymbolAddress(*target, name); 1651819749647b1605f75753f625050cb240292c08b0Sean Callanan 1652cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (location_load_addr == LLDB_INVALID_ADDRESS) 1653819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1654819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1655c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s", 1656c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1657819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1658819749647b1605f75753f625050cb240292c08b0Sean Callanan 1659819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1660819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1661819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1662819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1663f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1664c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type", 1665c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1666f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1668f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1669841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 1670fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1671fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan StreamString my_stream_string; 1672fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1673fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangASTType::DumpTypeDescription (type.GetASTContext(), 1674fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan type.GetOpaqueQualType(), 1675fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan &my_stream_string); 1676fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1677c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf ("%s %s with type %s", 1678c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton dematerialize ? "Dematerializing" : "Materializing", 1679c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1680c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton my_stream_string.GetString().c_str()); 1681fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1682f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1683f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1684f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 16858de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1686f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1687f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 168817c6a05cb96f7110332342326a90692d9505982eSean Callanan 168917c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1690f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 16916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 16926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 169317c6a05cb96f7110332342326a90692d9505982eSean Callanan 169417c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 169517c6a05cb96f7110332342326a90692d9505982eSean Callanan 169617c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1697f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 169817c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1699f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 170017c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 170117c6a05cb96f7110332342326a90692d9505982eSean Callanan 170217c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 170317c6a05cb96f7110332342326a90692d9505982eSean Callanan 1704c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s", 1705c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1706c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 170717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1708f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 170917c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 171017c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1711f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 17126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 171317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1714c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error write_error; 17156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1716567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 1717c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton location_value->GetScalar(), 1718567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->GetAddressByteSize(), 1719c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 17206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1721c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 1722c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1723c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 17246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 172617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1727f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 172817c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 172917c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1730f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 17316916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 173217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 173317c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 173417c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 173517c6a05cb96f7110332342326a90692d9505982eSean Callanan 1736c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s", 1737c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1738c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 173917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 174017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 174117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1742061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 174317c6a05cb96f7110332342326a90692d9505982eSean Callanan 1744061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 174517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1746c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't get the register information for %s", 1747c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 174817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 174917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 175017c6a05cb96f7110332342326a90692d9505982eSean Callanan 1751061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1752061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1753061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 1754061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1755061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 175617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1757c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s", 1758c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1759c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 176017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 176117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 176217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1763061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 176417c6a05cb96f7110332342326a90692d9505982eSean Callanan 176517c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 176617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1775b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 17766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 17786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1781c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar ®_addr = expr_var->m_live_sp->GetValue().GetScalar(); 178217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1783c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, 1784c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1785c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1786c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1787061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 178817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1789061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1790061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 179117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1792c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to register %s", 1793c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1794c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 179517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 179617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 17976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 17996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1800567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong()); 18016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 18036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1804c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s", 1805c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1806c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton deallocate_error.AsCString()); 18076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 181117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 181217c6a05cb96f7110332342326a90692d9505982eSean Callanan else 181317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 18146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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 18156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 18166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 18186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1819567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Scalar reg_addr (process->AllocateMemory (value_byte_size, 1820c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::ePermissionsReadable | lldb::ePermissionsWritable, 1821c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error)); 18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1823c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS) 18246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1825c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s", 1826c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1827c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error.AsCString()); 18286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 18326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 183347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 183447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 183547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 183647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 1837c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 183847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 183947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 18406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 18426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1845567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 1846c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr, 1847567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->GetAddressByteSize(), 1848c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 18496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1850c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 1851c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1852c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 18536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 185717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1858c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is too big to store in %s", 1859c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1860c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 186117c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 186217c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1863061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1864061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1865061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1866061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 186717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1868c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from %s", 1869c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1870c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 187117c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 187217c6a05cb96f7110332342326a90692d9505982eSean Callanan } 187317c6a05cb96f7110332342326a90692d9505982eSean Callanan 1874c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->WriteRegisterValueToMemory (reg_info, 1875c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1876c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1877c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1878061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 187917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 188017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1881f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1882f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1883f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1884f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1885810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 1886810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 18871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 18881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 18891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 18901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 18911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ExecutionContext &exe_ctx, 18921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 1893b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 18941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 18951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 18961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 18971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 18981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 1899061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 19001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 19011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1902061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 1903061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 19041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1905bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 19061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 19071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1909061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 19101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1911061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 19121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 19131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 19161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 19171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1918061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 19191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1920061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 19211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 19221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1924061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 1925061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 19261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 192795b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString()); 19281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 19291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 19331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 19341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1935696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 19368de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 19378de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 19388de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 19398de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 19408de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *type 19418de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1942aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1943e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1944cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1945f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan ValueObjectSP valobj; 1946f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan VariableSP var_sp; 1947f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan Error err; 1948f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan 1949f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan valobj = frame.GetValueForVariableExpressionPath(name.GetCString(), 1950f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan eNoDynamicValues, 1951f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 1952f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan var_sp, 1953f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan err); 19543bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 1955f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan if (!err.Success() || 1956f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan !var_sp || 1957ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->IsInScope(&frame) || 1958ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->LocationIsValidForFrame (&frame)) 1959ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return lldb::VariableSP(); 19603bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 19613bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 19623bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 19633bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 19643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 196504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 1966696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 19673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 19683bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 19693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 19703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 19713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 1972696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 19733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 19743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 19753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 1976696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return var_sp; 1977cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 1978336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1979819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol * 1980819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol 1981819749647b1605f75753f625050cb240292c08b0Sean Callanan( 1982819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 19830eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan ModuleSP &module, 19840eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan const ConstString &name, 19850eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan ClangNamespaceDecl *namespace_decl 1986819749647b1605f75753f625050cb240292c08b0Sean Callanan) 1987819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 1988819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 1989819749647b1605f75753f625050cb240292c08b0Sean Callanan 19900eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan if (module && namespace_decl) 19910eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan module->FindSymbolsWithNameAndType(name, 19920eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan namespace_decl, 19930eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan eSymbolTypeData, 19940eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan sc_list); 19950eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan else 19960eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan target.GetImages().FindSymbolsWithNameAndType(name, 19970eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan eSymbolTypeData, 19980eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan sc_list); 1999819749647b1605f75753f625050cb240292c08b0Sean Callanan 2000819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 2001819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2002819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 2003819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 2004819749647b1605f75753f625050cb240292c08b0Sean Callanan 2005819749647b1605f75753f625050cb240292c08b0Sean Callanan return sym_ctx.symbol; 2006819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2007819749647b1605f75753f625050cb240292c08b0Sean Callanan 2008819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 2009819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2010819749647b1605f75753f625050cb240292c08b0Sean Callanan 201147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// This is a callback used with Variable::GetValuesForVariableExpressionPath 201247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 201347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananstatic uint32_t GetVariableCallback (void *baton, 201447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const char *name, 201547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList &variable_list) 201647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 201747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target *target = static_cast<Target *>(baton); 201847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (target) 201947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 202047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return target->GetImages().FindGlobalVariables (ConstString(name), 202147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan true, 202247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan UINT32_MAX, 202347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan variable_list); 202447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 202547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return 0; 202647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 202747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 202847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP 202947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable 203047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan( 203147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target &target, 203294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ModuleSP &module, 203394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan const ConstString &name, 203494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ClangNamespaceDecl *namespace_decl, 203547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser *type 203647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan) 203747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 203847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList vars; 203947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ValueObjectList valobjs; 204047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 204194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan if (module && namespace_decl) 204294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module->FindGlobalVariables (name, namespace_decl, true, -1, vars); 204394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan else 204494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan target.GetImages().FindGlobalVariables(name, true, -1, vars); 204547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 204647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (vars.GetSize()) 204747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 204847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type) 204947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 205047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < vars.GetSize(); ++i) 205147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 205247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableSP var_sp = vars.GetVariableAtIndex(i); 205347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 205447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 205547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 205647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 205747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return var_sp; 205847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 205947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 206047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 206147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 206247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 206347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return vars.GetVariableAtIndex(0); 206447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 206547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 206647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 206747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return VariableSP(); 206847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 206947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 207024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 207147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 207216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 207316b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name) 207424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2075e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2077aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_ignore_lookups) 2078ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 2079ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 2080ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 2081ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 2082ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 2083e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 208416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 208516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 208616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (!context.m_decl_context) 208716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan log->Printf("FindExternalVisibleDecls for '%s' in a NULL DeclContext", name.GetCString()); 208816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context)) 208916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan log->Printf("FindExternalVisibleDecls for '%s' in '%s'", name.GetCString(), context_named_decl->getNameAsString().c_str()); 209016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 209116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan log->Printf("FindExternalVisibleDecls for '%s' in a '%s'", name.GetCString(), context.m_decl_context->getDeclKindName()); 209216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 209316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 209416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context)) 209516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 209616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->m_ast_importer->GetNamespaceMap(namespace_context); 209716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 209816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); 209916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i != e; 210016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ++i) 210116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 210216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 210316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan log->Printf(" Searching namespace '%s' in file '%s'", 210416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->second.GetNamespaceDecl()->getNameAsString().c_str(), 210516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->first->GetFileSpec().GetFilename().GetCString()); 210616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 210716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan //FindExternalVisibleDecls(context, 210816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan // i->first, 210916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan // i->second, 211016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan // name); 211116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 211216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 211316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (!isa<TranslationUnitDecl>(context.m_decl_context)) 211416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 211516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan // we shouldn't be getting FindExternalVisibleDecls calls for these 211616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan return; 211716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 211816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 211916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 212016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangNamespaceDecl namespace_decl; 212116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 212216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 212394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan log->Printf(" Searching the root namespace"); 212416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 212516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan FindExternalVisibleDecls(context, 212616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP(), 212716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl, 212816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan name); 212916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 213016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan} 213116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 213216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 213316b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, 213416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP module, 213503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl &namespace_decl, 213616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan const ConstString &name) 213716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{ 213816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan assert (m_struct_vars.get()); 213916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan assert (m_parser_vars.get()); 214016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 214116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2142e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2143e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 214424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21453bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 21463bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 21473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 21483bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 21493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 21508de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 21518de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 2152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr(); 215403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (name_unique_cstr[0] == '$' && !namespace_decl) 21553cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 215657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 215747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 215857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 215957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 216057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 216157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 216347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 216447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableList *vars = frame->GetVariableList(false); 216657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 216757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!vars) 216857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 216957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 217057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 217157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 217275a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!this_var || 2173567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !this_var->IsInScope(frame) || 2174567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !this_var->LocationIsValidForFrame (frame)) 217557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 217657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 217757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton Type *this_type = this_var->GetType(); 217857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 217957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_type) 218057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 218157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 21822403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton if (log) 21832403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 21842403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString ("Type for \"this\" is: "); 21852403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton StreamString strm; 21862403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton this_type->Dump(&strm, true); 21872403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString (strm.GetData()); 21882403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 218903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 219004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser this_user_type(this_type->GetClangFullType(), 219157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 219257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2193aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type = this_user_type; 219457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 219558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 219657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 219757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(), 219857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton &pointer_target_type)) 219957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 220057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2201c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type); 2202c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2203c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan if (pointer_target_qual_type.isConstQualified()) 2204c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan pointer_target_qual_type.removeLocalConst(); 2205c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2206c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(), 220757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 220803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22093aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 22103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 22113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 22123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 22133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 22143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str()); 22153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 22163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 221757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton AddOneType(context, class_user_type, true); 221857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 221957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 222057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 222157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 22223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 22233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 22243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 22253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 22263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2227567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 222847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 222947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2230567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableList *vars = frame->GetVariableList(false); 223103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!vars) 22333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 223403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22353aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 223603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 223775a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!self_var || 2238567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !self_var->IsInScope(frame) || 2239567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !self_var->LocationIsValidForFrame (frame)) 22403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 224103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22423aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Type *self_type = self_var->GetType(); 22433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_type) 22453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 224603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 224704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser self_user_type(self_type->GetClangFullType(), 22483aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 22493aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22503aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 225103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 225258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 225303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(), 225527a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham &pointer_target_type) 225619c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton || pointer_target_type == NULL) 22573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 225803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22593aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser class_user_type(pointer_target_type, 22603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 22613aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22623aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 22633aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 22643aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 22653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 22663aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 22673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str()); 22683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 22693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan AddOneType(context, class_user_type, false); 22713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 22733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 2274c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan 2275c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan // any other $__lldb names should be weeded out now 2276c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) 2277c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan return; 227803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan do 22802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan { 2281567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 22822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22832431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2284567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); 22852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_clang_ast_context) 22872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22882431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22892431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 22902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_ast_context) 22922431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22932431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); 229503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!ptype_type_decl) 22972431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22992431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl); 23002431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_decl) 23022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 23032431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); 23052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_type_decl) 23072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 23082431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (log) 23102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan log->Printf("Found persistent type %s", name.GetCString()); 23112431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan context.AddNamedDecl(parser_ptype_type_decl); 23132431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan } while (0); 23142431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 231603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2317427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 23181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2319427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton AddOneVariable(context, pvar_sp); 23201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 23211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 23221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 23231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 23241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2325aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->GetRegisterContext()) 23261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2327b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); 23281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 23291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 23301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan AddOneRegister(context, reg_info); 23311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 23328de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 233303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 233403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 233503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ValueObjectSP valobj; 233603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan VariableSP var; 233703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Error err; 233803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan bool found = false; 233903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 234003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (frame && !namespace_decl) 234103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 234203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr, 234303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan eNoDynamicValues, 234403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 234503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan var, 234603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan err); 234703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 234803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // If we found a variable in scope, no need to pull up function names 234903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (err.Success() && var != NULL) 235003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 235103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan AddOneVariable(context, var); 235203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan found = true; 235303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 235403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 235503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (target) 235603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 235794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan var = FindGlobalVariable (*target, 235894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module, 235994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan name, 236094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan &namespace_decl, 236103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NULL); 236203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 236303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (var) 236403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 236503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan AddOneVariable(context, var); 236603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan found = true; 236703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 236803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 236903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 237003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (!found) 237103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 237203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool include_symbols = true; 237303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool append = false; 2374a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 2375a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan if (namespace_decl && module) 2376a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 2377a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan module->FindFunctions(name, 2378a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan &namespace_decl, 2379a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan eFunctionNameTypeBase, 2380a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 2381a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 2382a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 2383a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2384a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan else 2385a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 2386a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan target->GetImages().FindFunctions(name, 2387a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan eFunctionNameTypeBase, 2388a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 2389a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 2390a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 2391a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2392a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 239303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sc_list.GetSize()) 239403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 239503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan bool found_specific = false; 239603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *generic_symbol = NULL; 239703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *non_extern_symbol = NULL; 239803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 239903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 240003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan index < num_indices; 240103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++index) 240203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 240303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext sym_ctx; 240403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 240503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 240603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.function) 240703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 240803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // TODO only do this if it's a C function; C++ functions may be 240903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // overloaded 241003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (!found_specific) 241103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan AddOneFunction(context, sym_ctx.function, NULL); 241203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan found_specific = true; 241303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan found = true; 241403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 241503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (sym_ctx.symbol) 241603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 241703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.symbol->IsExternal()) 241803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan generic_symbol = sym_ctx.symbol; 241903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 242003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan non_extern_symbol = sym_ctx.symbol; 242103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 242203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 242303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 242403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (!found_specific) 242503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 242603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (generic_symbol) 242703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 242803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan AddOneFunction (context, NULL, generic_symbol); 242903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan found = true; 243003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 243103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (non_extern_symbol) 243203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 243303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan AddOneFunction (context, NULL, non_extern_symbol); 243403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan found = true; 243503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 243603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 243703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 243803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 243903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (!found) 244003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 244103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // We couldn't find a variable or function for this. Now we'll hunt for a generic 244203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 244303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 24440eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan Symbol *data_symbol; 24450eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan 24460eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan if (namespace_decl && module) 24470eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan { 24480eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan data_symbol = FindGlobalDataSymbol(*target, module, name, &namespace_decl); 24490eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan } 24500eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan else 24510eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan { 24520eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan ModuleSP module; 24530eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan data_symbol = FindGlobalDataSymbol(*target, module, name, NULL); 24540eca1a7136ec5a48d8cf97decf157dc04c93512aSean Callanan } 245503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 245603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (data_symbol) 245703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 245803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan AddOneGenericVariable(context, *data_symbol); 245903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan found = true; 246003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 246103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 246203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 246303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 246403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages(); 246503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 246603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangASTImporter::NamespaceMapSP namespace_decls(new ClangASTImporter::NamespaceMap); 246703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 246803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t i = 0, e = images.GetSize(); 246903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan i != e; 247003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++i) 247103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 247203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ModuleSP image = images.GetModuleAtIndex(i); 247303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 247403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (!image) 247503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan continue; 247603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 247703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl namespace_decl; 247803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 247903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolVendor *symbol_vendor = image->GetSymbolVendor(); 248003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 248103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (!symbol_vendor) 248203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan continue; 248303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 248403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext null_sc; 248503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 248603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan namespace_decl = symbol_vendor->FindNamespace(null_sc, name); 248703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 248803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (namespace_decl) 248903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 249003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan (*namespace_decls)[image] = namespace_decl; 249103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 249203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (log) 249303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 249403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan std::string s; 249503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan llvm::raw_string_ostream os(s); 249603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan namespace_decl.GetNamespaceDecl()->print(os); 249703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan os.flush(); 249803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan log->Printf("Found namespace %s in file %s", s.c_str(), image->GetFileSpec().GetFilename().GetCString()); 250003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 250103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 250203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 250303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 250403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (!namespace_decls->empty()) 250503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 250603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decls); 250703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 250803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (clang_namespace_decl) 250903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan clang_namespace_decl->setHasExternalVisibleStorage(); 251003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 251103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 2512a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2513aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name)); 25146df0840c87be29724055716db951aa6d494ddabcSean Callanan 2515ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (type_sp) 2516ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 2517ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 25186df0840c87be29724055716db951aa6d494ddabcSean Callanan { 2519ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf ("Matching type found for \"%s\": ", name.GetCString()); 2520ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan StreamString strm; 2521ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan type_sp->Dump(&strm, true); 2522ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->PutCString (strm.GetData()); 2523ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 25242403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 252504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser user_type (type_sp->GetClangFullType(), 2526b01000fd063629facd45044f137446fb748ee179Greg Clayton type_sp->GetClangAST()); 25276df0840c87be29724055716db951aa6d494ddabcSean Callanan 2528ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan AddOneType(context, user_type, false); 25296df0840c87be29724055716db951aa6d494ddabcSean Callanan } 253024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2531e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananclang::ExternalLoadResult 25339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context, 25349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan bool (*predicate)(Decl::Kind), 25359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan llvm::SmallVectorImpl<Decl*> &decls) 2536e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{ 25379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 25389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 2539e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 25409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const Decl *context_decl = dyn_cast<Decl>(decl_context); 25429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25439b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!context_decl) 25449b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 25459b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast_context = &context_decl->getASTContext(); 25479b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25489b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (log) 254916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 255016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl)) 255116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan log->Printf("FindExternalLexicalDecls in '%s' (a %s) with %s predicate", 255216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan context_named_decl->getNameAsString().c_str(), 255316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan context_decl->getDeclKindName(), 255416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan (predicate ? "non-null" : "null")); 255516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if(context_decl) 255616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan log->Printf("FindExternalLexicalDecls in a %s with %s predicate", 255716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan context_decl->getDeclKindName(), 255816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan (predicate ? "non-null" : "null")); 255916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 256016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan log->Printf("FindExternalLexicalDecls in a NULL context with %s predicate", 256116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan (predicate ? "non-null" : "null")); 256216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 25639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *original_decl = NULL; 25659b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *original_ctx = NULL; 25669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25679b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context); 25689b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!ast_importer) 25709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 25719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx)) 25739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 25749b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 2575e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (log) 2576e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 25779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan std::string decl_print_string; 25789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan llvm::raw_string_ostream decl_print_stream(decl_print_string); 25799b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan original_decl->print(decl_print_stream); 25809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decl_print_stream.flush(); 25819b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan log->Printf("Original decl:\n%s", decl_print_string.c_str()); 25829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan } 25839b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl)) 25859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan { 25869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ExternalASTSource *external_source = original_ctx->getExternalSource(); 2587336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2588c613971c0016484053b60db95d01648a3f6ea849Sean Callanan if (external_source) 2589c613971c0016484053b60db95d01648a3f6ea849Sean Callanan external_source->CompleteType (original_tag_decl); 2590e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2591e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25929b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl); 2593e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25949b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!original_decl_context) 25959b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 2596e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan for (TagDecl::decl_iterator iter = original_decl_context->decls_begin(); 25989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan iter != original_decl_context->decls_end(); 25999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ++iter) 2600e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 26019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *decl = *iter; 2602e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 26039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!predicate || predicate(decl->getKind())) 2604e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 26059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (log) 26069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan { 26079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan std::string decl_print_string; 26089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan llvm::raw_string_ostream decl_print_stream(decl_print_string); 26099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decl->print(decl_print_stream); 26109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decl_print_stream.flush(); 26119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan log->Printf(" Adding lexical decl %s", decl_print_string.c_str()); 26129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan } 26139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl); 2615e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 26169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decls.push_back(copied_decl); 2617e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2618e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2619e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 26209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_AlreadyLoaded; 26219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan} 26229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid 26249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl) 26259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{ 26269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 26279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl); 26299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan} 26309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid 26329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl) 26339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{ 26349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 26359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl); 2637e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton} 2638e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2639336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 26408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 26418de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 26428de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 2643696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP var, 26449b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context, 26458de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 26468de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 26478de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2649e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 26506184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2655810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2656810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 2657336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 265824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 266124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2664810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2665810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 2666336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 267024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2671b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 267224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2673810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2674810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 2675336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 267624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 267724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2678336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 2679336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2682178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 2683178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 2684567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2685567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2686178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 2687178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 2688178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 2689178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 2690567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target); 2691178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 269224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2694bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2696810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2697810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 2698336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2700b01000fd063629facd45044f137446fb748ee179Greg Clayton 270158baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *type_to_use = NULL; 2702336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2703f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 2704f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 2705b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 2706f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 27074b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 27084b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 27094b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 27104b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 27114b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 27124b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 27134b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 27144b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 2715f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 2716f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 2717f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2718336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 2719336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 27226916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 2728336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 272924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 2730336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 273124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 2735336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 2736336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2739567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 274147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 274247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 274347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->GetScalar() = load_addr; 274447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->SetValueType(Value::eValueTypeLoadAddress); 274547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2748f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 2749b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 2750336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2751336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 2752336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 2753336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2754336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 2755696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var) 2756336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 2757aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2758aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2759e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 276047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2761f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 2762f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 2763336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2764aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx, 27658de27c761a22187ef63fb60000894be163e7285fGreg Clayton var, 27668de27c761a22187ef63fb60000894be163e7285fGreg Clayton context.GetASTContext(), 27678de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 27688de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 2769336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 27704b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 27714b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 27724b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 27736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 27748de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2775427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 2776fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2777fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham entity_name, 2778427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ut, 277947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 278047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2781427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 2782427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2783427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 2784427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2785427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2786427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 2787696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan entity->m_parser_vars->m_lldb_var = var; 278824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2789810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 27908de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2791a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 2792a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2793a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 2794a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 2795a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2796a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); 27976e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 27989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //if (log->GetVerbose()) 27999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //{ 28009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // StreamString var_decl_dump_string; 28019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // ASTDumper::DumpDecl(var_decl_dump_string, var_decl); 28029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // log->Printf("%s\n", var_decl_dump_string.GetData()); 28039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //} 28048de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 28058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 28068f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 28078f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 2808a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 2809427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &pvar_sp) 2810a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 2811e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 281245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 2813427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 2814a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2815427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(), 2816427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 2817427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 2818427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 2819a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 28206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 28218c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2822427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 2823427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 2824427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 2825427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 2826427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 282745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 282845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 2829a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 2830a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 2831a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2832a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 2833a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 2834a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2835427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str()); 2836a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 2837a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 2838a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 28391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 2840819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 2841819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol &symbol) 2842819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2843819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 2844819749647b1605f75753f625050cb240292c08b0Sean Callanan 2845819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2846819749647b1605f75753f625050cb240292c08b0Sean Callanan 2847567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2848567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2849567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 2850567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return; 2851567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2852567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 2853819749647b1605f75753f625050cb240292c08b0Sean Callanan 2854fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)), 2855819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 2856819749647b1605f75753f625050cb240292c08b0Sean Callanan 2857fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)), 2858819749647b1605f75753f625050cb240292c08b0Sean Callanan context.GetASTContext()); 2859819749647b1605f75753f625050cb240292c08b0Sean Callanan 2860fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 2861819749647b1605f75753f625050cb240292c08b0Sean Callanan 2862819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2863819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 2864819749647b1605f75753f625050cb240292c08b0Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2865819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 2866819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 286747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 286847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2869819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 2870819749647b1605f75753f625050cb240292c08b0Sean Callanan 2871819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 2872819749647b1605f75753f625050cb240292c08b0Sean Callanan 2873819749647b1605f75753f625050cb240292c08b0Sean Callanan AddressRange &symbol_range = symbol.GetAddressRangeRef(); 2874819749647b1605f75753f625050cb240292c08b0Sean Callanan Address &symbol_address = symbol_range.GetBaseAddress(); 2875567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 2876819749647b1605f75753f625050cb240292c08b0Sean Callanan 2877819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2878819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 2879819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 2880819749647b1605f75753f625050cb240292c08b0Sean Callanan 2881fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->EnableParserVars(); 2882819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2883819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_named_decl = var_decl; 2884819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_llvm_value = NULL; 2885819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_value = symbol_location.release(); 2886819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_sym = &symbol; 2887fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan //entity->m_flags |= ClangExpressionVariable::EVUnknownType; 2888819749647b1605f75753f625050cb240292c08b0Sean Callanan 2889819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 2890819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2891819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string var_decl_print_string; 2892819749647b1605f75753f625050cb240292c08b0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2893819749647b1605f75753f625050cb240292c08b0Sean Callanan var_decl->print(var_decl_print_stream); 2894819749647b1605f75753f625050cb240292c08b0Sean Callanan var_decl_print_stream.flush(); 2895819749647b1605f75753f625050cb240292c08b0Sean Callanan 2896819749647b1605f75753f625050cb240292c08b0Sean Callanan log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); 2897819749647b1605f75753f625050cb240292c08b0Sean Callanan 28989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //if (log->GetVerbose()) 28999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //{ 29009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // StreamString var_decl_dump_string; 29019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // ASTDumper::DumpDecl(var_decl_dump_string, var_decl); 29029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // log->Printf("%s\n", var_decl_dump_string.GetData()); 29039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //} 2904819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2905819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2906819749647b1605f75753f625050cb240292c08b0Sean Callanan 2907fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 2908fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 2909fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 2910fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2912567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2913567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 2914fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2915fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 2916fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 2917fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 2918fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2919fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 2920fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2921fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 2922fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2923fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl; 2924fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 2925fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2926fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 2927fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2928fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2929fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 2930fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 2931fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2932fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2933fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2934fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2935fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan std::string var_decl_print_string; 2936fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2937fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan var_decl->print(var_decl_print_stream); 2938fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan var_decl_print_stream.flush(); 2939fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2940fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str()); 2941fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2942fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2943fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 2944fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 2945fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2946fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 2947fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2948fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 2949fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2950fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2951fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2952fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2953fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangAST(user_type.GetASTContext()); 2954fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangType(user_type.GetOpaqueQualType()); 2955fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2956fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 2957fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2958fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2959fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2960fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 2961fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 2962fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2963819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 2964427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 2965427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const RegisterInfo *reg_info) 29661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 29671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 29681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(), 29701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 29711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 29721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 29741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2975122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen if (log) 2976122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 29771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 29781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 29791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2980427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 2981427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 29821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 29841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2985fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 298647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 298747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2988427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 29891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 2991427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 2992427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 29971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (log) 29991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 30001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string var_decl_print_string; 30011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 30021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl->print(var_decl_print_stream); 30031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl_print_stream.flush(); 30041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 30051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str()); 30061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 30071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 30081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 30099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananNamespaceDecl * 301016b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls) 30116916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{ 301216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (namespace_decls.empty()) 301316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan return NULL; 301416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 30156916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 30166916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 3017e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton assert (m_parser_vars.get()); 3018e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 301916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second; 302016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 30219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(), 302216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl.GetNamespaceDecl()); 302316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 302416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl); 302516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 302616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls); 302716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 30289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return dyn_cast<NamespaceDecl>(copied_decl); 30296916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 30306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 3031a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 3032da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 3033da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Function* fun, 3034da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Symbol* symbol) 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) 30550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean 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) 30640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean 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(); 3071ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 30720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddFunDecl(copied_type); 30740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30750fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 30760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 30780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 30800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 30828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 3083810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 30840fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("AddOneFunction called with no function and no symbol"); 30858f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 30868f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 30878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3088567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 3089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3090567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target); 30918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 30928f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 30938f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3094fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 309547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 309647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3097427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 30988de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 3099427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 3100427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 3101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 3102427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 3104427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 3105427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 3106427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 31078c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3108810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 31098de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3110a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string fun_decl_print_string; 3111a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string); 3112a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl->print(fun_decl_print_stream); 3113a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl_print_stream.flush(); 3114a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 3115a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str()); 31168de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 311724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 311893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 311993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 312093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 31213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 31223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 312393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 31249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context = context.GetASTContext(); 31259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *user_ast_context = ut.GetASTContext(); 31263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3127ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 31283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 31293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromParser parser_type(copied_type, parser_ast_context); 313093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 31313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 31323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 31333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 31343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 31353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 31363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 31373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 31383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 31393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args, 31403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1, 31413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan false, 31423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 314330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 31441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 31451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 31461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 314730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 314830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 31491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 31501d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 31518de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 31521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 31531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 31541d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 31551d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 315630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 315730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit); 31583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 315993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 316093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 316193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 3162ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 3163ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid * 3164ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context, 3165ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan ASTContext *source_context, 3166ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *clang_type) 3167ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{ 3168aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 3169aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 3170aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = true; 3171ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 3172e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context); 3173e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 3174e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton QualType ret_qual_type = importer->CopyType (source_context, 3175e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton QualType::getFromOpaquePtr(clang_type)); 3176e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 3177e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton void *ret = ret_qual_type.getAsOpaquePtr(); 3178ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 3179aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = false; 3180ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 3181ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return ret; 3182ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan} 3183