ClangExpressionDeclMap.cpp revision 1c38d10238fe7edc342a10799acc65f8f5dceb90
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" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 473bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5173b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) : 5273b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTSource (exe_ctx.GetTargetSP()), 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{ 646d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // Note: The model is now that the parser's AST context and all associated 656d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // data does not vanish until the expression has been executed. This means 666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // that valuable lookup data (like namespaces) doesn't vanish, but 676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan DidParse(); 69aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 73166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool 74427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 758c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_exe_ctx = &exe_ctx; 78567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr()) 81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetThreadPtr()) 83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetProcessPtr()) 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 } 89567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (target) 90987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 92567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 93987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 9497ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan 95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 97567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_persistent_vars = &target->GetPersistentVariables(); 98166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetScratchClangASTContext()) 100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 102166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info = GetTargetInfo(); 10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 105166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan return true; 106aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 107c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 108427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 113427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (var_sp && 119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars.get() && 120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_lldb_value) 121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton delete var_sp->m_parser_vars->m_lldb_value; 122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->DisableParserVars(); 124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 126427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 130427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->DisableParserVars(); 133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1367a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo() 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetInfo ret; 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 149567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.byte_order = process->GetByteOrder(); 155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.address_byte_size = process->GetAddressByteSize(); 156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.byte_order = target->GetArchitecture().GetByteOrder(); 163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ret; 16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1718de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 17382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 177427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton Target *target = m_parser_vars->GetTarget(); 179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (target); 180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName(); 181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 182aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 18382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 18482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP 18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name, 18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan lldb_private::TypeFromParser type, 18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan const llvm::APInt& value) 18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{ 19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan assert (m_parser_vars.get()); 191166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 192fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 193567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 194567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 195567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 196567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 197567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 19805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 19905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 20005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetASTContext(), 20105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetOpaqueQualType()), 20205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 20347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 205fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 2060e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 20747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 20847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 2090e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 2100e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2110e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 2120e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2130e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 2140e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 21505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2160e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 2170e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 2180e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 21905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 22005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 22147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 2230e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 22405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 22505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 22805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2292bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (size_t byte_idx = 0; 23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 23205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 23405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (m_parser_vars->m_target_info.byte_order) 23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 2400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 2410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 2420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 2430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 2450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 2470e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 2480e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 2490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 2510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 25205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 25305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 2546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 256696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 257696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 26005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 26105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP 263696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name, 2649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan VarDecl *decl, 265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb_private::TypeFromParser type) 266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{ 267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan assert (m_parser_vars.get()); 268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 270696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 271696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 273567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 274567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 275567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 276567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 278567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return ClangExpressionVariableSP(); 287696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 288696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan type.GetASTContext(), 290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan type.GetOpaqueQualType()), 291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan context); 292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser var_type = var_sp->GetTypeFromUser(); 294696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 295567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 296567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL) 297567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 298567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 299567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type); 300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var) 302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable 303696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 304567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues); 305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_valobj) 307696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 308696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 309696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type); 310696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 311696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_casted_valobj) 312696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (log) 315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan { 316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan StreamString my_stream_string; 317696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 318696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangASTType::DumpTypeDescription (var_type.GetASTContext(), 319696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_type.GetOpaqueQualType(), 320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan &my_stream_string); 321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str()); 324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan } 325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj); 327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!pvar_sp) 329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name)) 332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return pvar_sp; 339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan} 340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name) 34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference); 34747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 34847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 35047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj, 35147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 35247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ConstString &name, 353a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::TypeFromParser type, 354557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool transient, 355557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool maybe_make_load) 35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pvar_sp) 36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 363557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 364557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (maybe_make_load && 365557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.GetValueType() == Value::eValueTypeFileAddress && 366557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan m_parser_vars->m_exe_ctx && 367557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan m_parser_vars->m_exe_ctx->GetProcessPtr()) 368557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 369557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.SetValueType(Value::eValueTypeLoadAddress); 370557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 373a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !pvar_sp->m_live_sp && 374a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !transient) 37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The reference comes from the program. We need to set up a live SP for it. 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetASTContext(), 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetOpaqueQualType(), 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetName(), 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value.GetScalar().ULongLong(), 38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value.GetValueAddressType(), 38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetByteSize()); 38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry) 38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->ValueUpdated(); 39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t pvar_byte_size = pvar_sp->GetByteSize(); 39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!ReadTarget(pvar_data, value, pvar_byte_size)) 39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry); 39847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 39947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan valobj = pvar_sp; 40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 40447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 4068de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 4078de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 4098de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 4116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 4126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 4138de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 414a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 415aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 416aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 4176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 418fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 419567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 420567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 421567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 422567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 423567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 424567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 425567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 426a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 427a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 42882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetASTContext(), 42982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetOpaqueQualType()), 43097678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 43147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 43247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_parser_vars->m_target_info.IsValid()) 43347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 434a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 435fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 436fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 437427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 43847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 43947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 4408c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4418c12720c108cd5e7ed792596749218d8400f647eSean Callanan 442427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 4438c12720c108cd5e7ed792596749218d8400f647eSean Callanan 444427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4458c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4468c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 4516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 4536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 4556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 4596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 4606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 4636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 4646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 465427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableParserVars(); 4668c12720c108cd5e7ed792596749218d8400f647eSean Callanan 467427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_named_decl = decl; 468427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_parser_type = parser_type; 4698c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4708c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 471a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 472a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 473a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 4748de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 4758de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 4778de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4788de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 4798de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 4808de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 4818de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 4828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 483aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 484aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 485aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 486e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 48745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 488aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 4898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 4918c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 4928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 493427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 4948c12720c108cd5e7ed792596749218d8400f647eSean Callanan 495427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 496427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 4978c12720c108cd5e7ed792596749218d8400f647eSean Callanan 498427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4998c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5008c12720c108cd5e7ed792596749218d8400f647eSean Callanan 50145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 50245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan log->Printf("Adding value for decl %p [%s - %s] to the structure", 50345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 5048de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 505427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 50645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 5078c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 5088c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 509427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_llvm_value = value; 5108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 511427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableJITVars(); 512427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_alignment = alignment; 513427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_size = size; 5148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 515427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 5168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 5228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 523aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 525aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 5268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 5298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 530aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 531aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 5328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 533427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 5348c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 5368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 539427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 540427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 5428c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5448c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 545427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment; 5468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 547427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (cursor % member_sp->m_jit_vars->m_alignment) 548427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment)); 5498c12720c108cd5e7ed792596749218d8400f647eSean Callanan 550427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset = cursor; 551427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += member_sp->m_jit_vars->m_size; 5528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 5538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 554aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 5558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 556aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5608de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 5618de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5628de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 5638de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 5648de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 5658de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 567aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 568aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 569aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 5708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 572427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 573aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 574aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 5758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5808de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 5818de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *&decl, 5838de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 5848de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 5858de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 5868de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 5878de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 589aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 590aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 591aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 5928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 594427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 5958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 597427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 5988c12720c108cd5e7ed792596749218d8400f647eSean Callanan 599427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp || 600427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_parser_vars.get() || 601427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_jit_vars.get()) 6028c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 6038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 604427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton decl = member_sp->m_parser_vars->m_named_decl; 605427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = member_sp->m_parser_vars->m_llvm_value; 606427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton offset = member_sp->m_jit_vars->m_offset; 607427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 6088c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 61202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 6138de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 6148de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 6168de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 6178de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 618ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 619427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl)); 6208c12720c108cd5e7ed792596749218d8400f647eSean Callanan 621427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 6228c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 623ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 6248c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 6258c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 626ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 627427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 6288c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6298c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 630ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 631ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 632ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void 633ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext 634ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan( 635ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan const ConstString &name, 636ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContext &sym_ctx, 637ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContextList &sc_list 638ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan) 639ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{ 640ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (sym_ctx.module_sp) 641aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 642ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 643ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (!sc_list.GetSize()) 644ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 645ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan} 646ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 647f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 6488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 6498de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6508de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 651da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 6528de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 653f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 654aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 655aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 656aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 657567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 658567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 659567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 660567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 661f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 662567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 66378b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 66478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 665f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 666f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 667e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 668f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 669ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 670ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 671e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 672aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 673aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 674aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 675aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 6760eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan if (!strncmp(name.GetCString(), "_ZN", 3) && 6770eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan strncmp(name.GetCString(), "_ZNK", 4)) 678aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 6790eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan std::string fixed_scratch("_ZNK"); 6800eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan fixed_scratch.append(name.GetCString() + 3); 6810eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan ConstString fixed_name(fixed_scratch.c_str()); 682aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 683aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 6840eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString()); 6850eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan 6860eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list); 687aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 688aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 689aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 690aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 691f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 692f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 693f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 694e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 696da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 697f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 698f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 699da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 700f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 701da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 702f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 703f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 704f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 705ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 706ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 707ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 708567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton func_addr = func_so_addr->GetCallableLoadAddress (target); 709da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 710f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 711f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 712f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 713cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 714cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name) 715c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 716c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 717c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 718819749647b1605f75753f625050cb240292c08b0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); 719c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 720cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 721cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 722cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 723cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++) 724cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 725cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 726cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 727c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 728cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 729ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 730ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 731ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return LLDB_INVALID_ADDRESS; 732ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 733cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 734cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 735cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 736cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 737cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 738cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 739cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 740cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 741cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 742cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 743cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 744cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 745cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 746cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 748cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 749cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeExtern: 750cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 752cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 753cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 757cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 765cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 766cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 768cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 769cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 770c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 771cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 772c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 773c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 774cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 775cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name) 776819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 777819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 778819749647b1605f75753f625050cb240292c08b0Sean Callanan 779819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!m_parser_vars->m_exe_ctx || 780567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !m_parser_vars->m_exe_ctx->GetTargetPtr()) 781819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 782819749647b1605f75753f625050cb240292c08b0Sean Callanan 783567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name); 784819749647b1605f75753f625050cb240292c08b0Sean Callanan} 785819749647b1605f75753f625050cb240292c08b0Sean Callanan 78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter 78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 788557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue 789557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr) 790557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{ 791557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan Value ret; 792557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 793557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 794557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 795557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (m_parser_vars->m_exe_ctx && m_parser_vars->m_exe_ctx->GetProcessPtr()) 796557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 797557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 798557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeFileAddress); 799557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 800557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.GetScalar() = (unsigned long long)addr; 801557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 802557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return ret; 803557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan} 804557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value, 80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint8_t *data, 80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 80947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 81047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 814567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 817567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 81847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterContext *reg_ctx = exe_ctx->GetRegisterContext(); 82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 82347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 82447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 82847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 829567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err)) 83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 83147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return reg_ctx->WriteRegister(reg_info, reg_value); 83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 842567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 845567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 848567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 851567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = file_addr.GetLoadAddress(target); 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 854567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory(load_addr, data, length, err); 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 860567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 864567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy ((void *)value.GetScalar().ULongLong(), data, length); 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data, 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 885567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 886567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 887567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 890567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterContext *reg_ctx = exe_ctx->GetRegisterContext(); 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx->ReadRegister(reg_info, reg_value)) 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 905567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err); 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 915567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 916567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 921567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 925567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton target->ReadMemory(file_addr, true, data, length, err); 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 931567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 935567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy (data, (const void *)value.GetScalar().ULongLong(), length); 94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl) 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx; 95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl)); 95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl)); 9571c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (expr_var_sp) 95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 9604a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var) 9616d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan return Value(); 9626d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 9631c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference; 9641c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 9654b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan std::auto_ptr<Value> value(GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL)); 9664b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 9671c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 9681c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan { 9691c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan Process *process = m_parser_vars->m_exe_ctx->GetProcessPtr(); 9701c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 9711c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan if (!process) 9721c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 9731c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 9741c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 9751c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan Error read_error; 9761c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error); 9771c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 9781c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan if (!read_error.Success()) 9791c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 9801c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 9811c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan value->GetScalar() = (unsigned long long)ref_value; 9821c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan } 9831c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 9844b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (value.get()) 9854b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return *value; 9864b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 9874b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 98847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else if (persistent_var_sp) 99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 991a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference || 992a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) && 99386a07da76f615533a06a797dc4539566951b58d3Sean Callanan persistent_var_sp->m_live_sp && 99486a07da76f615533a06a797dc4539566951b58d3Sean Callanan m_parser_vars->m_exe_ctx->GetProcessSP() && 99586a07da76f615533a06a797dc4539566951b58d3Sean Callanan m_parser_vars->m_exe_ctx->GetProcessSP()->IsAlive()) 996a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 9974b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return persistent_var_sp->m_live_sp->GetValue(); 998a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 999a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan else 1000a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 1001a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::Value ret; 1002a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetValueType(Value::eValueTypeHostAddress); 1003a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 1004a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes(); 1005a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return ret; 1006a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 100847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 100947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 101047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Value(); 101147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 101247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 101347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 10144b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue 10154b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name) 10164b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{ 10174b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan assert(m_parser_vars.get()); 10184b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10194b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!m_parser_vars->m_exe_ctx) 10204b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10214b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10224b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr(); 10234b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10244b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!frame) 10254b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10264b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan VariableList *vars = frame->GetVariableList(false); 10284b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10294b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!vars) 10304b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10314b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10324b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::VariableSP var = vars->FindVariable(name); 10334b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10344b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!var || 10354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->IsInScope(frame) || 10364b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->LocationIsValidForFrame (frame)) 10374b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan std::auto_ptr<Value> value(GetVariableValue(*m_parser_vars->m_exe_ctx, var, NULL)); 10404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 10414b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (value.get()) 10424b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return *value; 10434b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 10444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 10454b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan} 10464b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1047810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 1048f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1049f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 10508de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 10518de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1052aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 10538de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 10548de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 10558de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1056f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1057aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 1058aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1059567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_material_vars->m_process = exe_ctx.GetProcessPtr(); 1060aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 10610ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan bool result = DoMaterialize(false /* dematerialize */, 10620ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan exe_ctx, 10630ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* top of stack frame */, 10640ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* bottom of stack frame */, 10650ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan NULL, /* result SP */ 10660ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan err); 1067f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1068f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 1069aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 1070f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1071f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 1072f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1073f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1074f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 10758de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 10768de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 10778de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 10783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 1079aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 1080047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 1081047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 10828de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 10833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 1084aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1085aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1086567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1087567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1088567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1089567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1090567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL || process == NULL || target == NULL) 10913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because the context is incomplete"); 10933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1096aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 10973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because its type is unknown"); 10993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 11003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP object_ptr_var = FindVariableInScope (*frame, 1103696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 1104696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type)); 11053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 11073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 11083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString()); 11093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 11103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 11133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr_var, 1114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 11153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 11173c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 11183aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 11193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 11203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 112250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 11233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 112450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 112550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 112650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 112750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 11283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 112950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 1130567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize(); 113150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 113250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 113350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 113450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 113550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 113650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 113750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 113850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 113950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 1140567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton object_ptr = process->ReadPointerFromMemory (value_addr, read_error); 1141c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS) 114250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 114350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 114450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 1145c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 114650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 11473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 114850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 11493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 115050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 115150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 115250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 115350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 115450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 115550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 115650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 115750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 115850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1159061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 116050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1161061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 116250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 116350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 116450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 116550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 116650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1167061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 116850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1169061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 117050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 1171061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 117250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 117350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 117450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1175061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 117650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1177061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 117850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 117950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 11803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 11833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11843c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 11858de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 11868de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 1188427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 11890ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 11900ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 11918de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 11928de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1193f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 11940ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err); 1195aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1196aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 1197aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 1198aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1199aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 1200aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 1201aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1202aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 1203aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1204aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1205aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1206aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 1207aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1208aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 1209aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 1210aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 1211aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1212aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1213aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1214aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 1215aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1216f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1217f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 121832824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 12198de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 12208de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1221aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 12238de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 12248de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 122532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 1226aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1227aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 1228aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1229aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 123032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 123132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 123232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 123332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 1234567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1235567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1236567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 123732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 123832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 123932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 124032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 124132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1242567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1243567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 124432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 124532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 124632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 124732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 124832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 12493371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 12503371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 12513371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 12523371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 12533371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 12543371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 1255c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 125632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 125732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 1258567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (m_material_vars->m_materialized_location, 1259c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetBytes(), 1260c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetByteSize(), error) != data_sp->GetByteSize()) 126132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 126232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 126332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 126432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 126532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1266567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize()); 126732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1268427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 1269427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 1270427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 127132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 1272427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 127332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1274427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 1275427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 1276427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1277427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 12788c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1279427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 12808c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 12818c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1282427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 1283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 1284427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 1285427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 1286427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 1287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 1288427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 1289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 1290427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 129132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 129232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 129332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 129432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 129532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 129632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 129732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1298f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 12998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 13008de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 13018de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 1302aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 13030ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 13040ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 1305427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 13068de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13078de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1308810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 1309427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 1310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 1311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1312aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1313aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1314e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 131582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 1316aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 1317810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1318810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 131957067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 1320810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1321810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1322567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1323567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 132445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 132545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 132657067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 132745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 1328567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 132945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 1330567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangPersistentVariables &persistent_vars = target->GetPersistentVariables(); 1331aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1332aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 1333e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 1334e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 1335e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 1336e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 13379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_material_vars->m_allocated_area = NULL; 1338e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1339e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 1340e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 1341e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1342567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything)); 1343810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1344f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 1345f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1346567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1347aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1348f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1349567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->DeallocateMemory(m_material_vars->m_materialized_location); 1350aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1351f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1352810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 13537a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 13547a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 13557a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 1356567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 1357aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 1358aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan err); 1359f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1360f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 1361f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1362f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1363aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 1364f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1365810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1366aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 1367810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1368aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 1369aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 1370810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1371427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 13728c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 13738c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 1374810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1375427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 13764d0b110715d321d366dec1dc690300f713b63236Sean Callanan 1377a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 1378336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 1379a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 1380427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 13811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 13821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 13831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1384aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 13851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 13871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 1390427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 1391427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 1392427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 1393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1394427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 13951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 13981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1399427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 14001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 1403427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 14056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 1406427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1407427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 14081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 14108c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1411a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 14128c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 1413a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 1414a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 1415a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 141645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 14176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1418a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 1419a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1420a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 1421a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1423a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 1424a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 14256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1426a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 1427a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 1428a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 14296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx, 1430a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 14310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 14320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_top, 14330ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom, 1434a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 1435a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 1436f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1437a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 1438a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1439a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 14408c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1441a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 14428c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1443810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1444810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1445f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1446f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1447f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1448a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 14498de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 14508de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 14518de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 14528de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 1453427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 14548de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 14550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 14560ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 14578de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 14588de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1459aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 14606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 14616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1462427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1463a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1464427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1465a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1466a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1467a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1468427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1469a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1470427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1471427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 1472a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 1473a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1474a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1475567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1476567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1479a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1480a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 14816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 14826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 14836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 14856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 14866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 1490567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->ReadPointerFromMemory (addr, read_error); 14916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 14936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 14956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 14996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 15006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 15026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 15036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 150447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (), 150547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 150647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 150747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 150847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 150947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 151047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 15116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 15146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 15166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1519b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 15206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 15226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 152597678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 152697678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 15276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 15296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 15316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 15326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 15340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 15356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 1536567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 15376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 15396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15420ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan if (stack_frame_top != LLDB_INVALID_ADDRESS && 15430ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom != LLDB_INVALID_ADDRESS && 15440ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem >= stack_frame_bottom && 15450ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem <= stack_frame_top) 15460ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 15470ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // If the variable is resident in the stack frame created by the expression, 15480ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // then it cannot be relied upon to stay around. We treat it as needing 15490ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // reallocation. 15500ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 15510ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 15520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 15530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; 15540ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 15550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 15566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 15576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 15606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 15616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 15656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1568567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(mem); 15696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 15716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 15736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1579a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 15806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1581a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1582a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1583a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1584a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1585a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 15866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 15876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 15886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 15906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 15926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 15946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1595567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->AllocateMemory(pvar_byte_size, 15964b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 15974b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan allocate_error); 15986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 16026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 16066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 16076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 16096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 161047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 161147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 161247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 161347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 161447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 161547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 161647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 16176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 16196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 16216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 16226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 16246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1625567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 16266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 16286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 16336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 16346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 16366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1637567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 16384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan var_sp->m_live_sp->GetValue().GetScalar(), 16394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan process->GetAddressByteSize(), 16404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan write_error)) 16416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 16436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1647c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong()); 16486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1649696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1650a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 16516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1652a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1653a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1654a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1655a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1656a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1657a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1658a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1659f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 16608de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 16618de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 16628de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 16638de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 16648de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 16656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 16668de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 16678de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 16688de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1669f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1670e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1671567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1672567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1673567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1674567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 16756d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get()) 1676cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 1677cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 16786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 16796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 16816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 16826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16834a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var(expr_var->m_parser_vars->m_lldb_var); 16844a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym); 1685f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 16866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference); 16876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 1688819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 16894a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1690819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1691819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1692819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(GetVariableValue(exe_ctx, 1693819749647b1605f75753f625050cb240292c08b0Sean Callanan var, 1694819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1695819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1696819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym) 16974a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan { 1698567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton addr_t location_load_addr = GetSymbolAddress(*target, name); 1699819749647b1605f75753f625050cb240292c08b0Sean Callanan 1700cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (location_load_addr == LLDB_INVALID_ADDRESS) 1701819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1702819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1703c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s", 1704c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1705819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1706819749647b1605f75753f625050cb240292c08b0Sean Callanan 17074a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan location_value.reset(new Value); 17084a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1709819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1710819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1711819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1712819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1713f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1714c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type", 1715c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1716f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1717f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1718f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1719841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 1720fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1721fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan StreamString my_stream_string; 1722fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1723fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangASTType::DumpTypeDescription (type.GetASTContext(), 1724fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan type.GetOpaqueQualType(), 1725fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan &my_stream_string); 1726fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1727c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf ("%s %s with type %s", 1728c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton dematerialize ? "Dematerializing" : "Materializing", 1729c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1730c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton my_stream_string.GetString().c_str()); 1731fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1732f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1733f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1734f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 17358de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1736f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1737f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 173817c6a05cb96f7110332342326a90692d9505982eSean Callanan 173917c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1740f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 174317c6a05cb96f7110332342326a90692d9505982eSean Callanan 174417c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 174517c6a05cb96f7110332342326a90692d9505982eSean Callanan 174617c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1747f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 174817c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1749f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 175017c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 175117c6a05cb96f7110332342326a90692d9505982eSean Callanan 175217c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 175317c6a05cb96f7110332342326a90692d9505982eSean Callanan 1754c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s", 1755c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1756c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 175717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1758f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 175917c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 176017c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1761f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 17626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 176317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1764c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error write_error; 17656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17666f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17686f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error read_error; 17696f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 17706f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error); 17716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 17726f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!read_error.Success()) 17736f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 17746f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s", 17756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 17766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan read_error.AsCString()); 17776f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 17786f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 17796f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 17806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WritePointerToMemory(addr, 17816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan ref_value, 17826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 17836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 17846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 17856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 17866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 17876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 17886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 17896f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 17906f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 17916f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 17926f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WriteScalarToMemory (addr, 17936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan location_value->GetScalar(), 17946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 17956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 17966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 17976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 17986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 17996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 18006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 18016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 18026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 180317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1804f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 180517c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 180617c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 18086916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 180917c6a05cb96f7110332342326a90692d9505982eSean Callanan { 181017c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 181117c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 181217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1813c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s", 1814c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1815c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 181617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 181717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 181817c6a05cb96f7110332342326a90692d9505982eSean Callanan 1819061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 182017c6a05cb96f7110332342326a90692d9505982eSean Callanan 1821061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 182217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1823c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't get the register information for %s", 1824c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 182517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 182617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 182717c6a05cb96f7110332342326a90692d9505982eSean Callanan 1828061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1829061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1830061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 1831061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1832061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 183317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1834c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s", 1835c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1836c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 183717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 183817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 183917c6a05cb96f7110332342326a90692d9505982eSean Callanan 1840061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 184117c6a05cb96f7110332342326a90692d9505982eSean Callanan 184217c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 184317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 18446f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 18456f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; // reference types don't need demateralizing 18466f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 18476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 18486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 18506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 18516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 18526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1855b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 18566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 18576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 18586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1861c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar ®_addr = expr_var->m_live_sp->GetValue().GetScalar(); 186217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1863c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, 1864c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1865c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1866c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1867061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 186817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1869061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1870061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 187117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1872c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to register %s", 1873c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1874c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 187517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 187617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 18776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 18796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1880567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong()); 18816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 18836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1884c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s", 1885c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1886c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton deallocate_error.AsCString()); 18876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 189117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 189217c6a05cb96f7110332342326a90692d9505982eSean Callanan else 189317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 18946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error write_error; 18956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 18966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan RegisterValue reg_value; 18976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 18986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!reg_ctx->ReadRegister (reg_info, reg_value)) 18996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read %s from %s", 19016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name); 19036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 19076f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error = reg_ctx->WriteRegisterValueToMemory(reg_info, 19096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr, 19106f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 19116f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_value); 19126f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!write_error.Success()) 19146f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19156f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s", 19166f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name, 19186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 19196f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19206f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19216f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19226f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; 19236f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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 19266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 19276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 19296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Scalar reg_addr (process->AllocateMemory (value_byte_size, 19316f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 19326f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan allocate_error)); 19336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1934c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS) 19356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1936c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s", 1937c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1938c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error.AsCString()); 19396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 19416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 19436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 194447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 194547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 194647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 194747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 1948c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 194947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 195047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 19516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 19536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 1954567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 19556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_addr, 19566f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 19576f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 19586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1959c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 1960c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1961c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 19626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 19646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 196617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1967c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is too big to store in %s", 1968c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1969c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 197017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 197117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1972061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1973061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 197417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1975c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from %s", 1976c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1977c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 197817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 197917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 198017c6a05cb96f7110332342326a90692d9505982eSean Callanan 1981c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->WriteRegisterValueToMemory (reg_info, 1982c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1983c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1984c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1985061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 198617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 198717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1988f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1989f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1990f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1991f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1992810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 1993810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 19941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 19951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 19961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 19971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 19981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ExecutionContext &exe_ctx, 19991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 2000b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 20011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 20021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 20031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 20041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 20051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 2006061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 20071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 20081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2009061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 2010061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 20111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2012bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 20131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 20141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 20151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2016061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 20171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2018061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 20191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 20201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 20211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 20221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 20231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 20241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2025061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 20261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2027061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 20281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 20291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 20301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2031061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 2032061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 20331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 203495b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString()); 20351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 20361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 20371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 20381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 20391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 20401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 20411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2042696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 20438de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 20448de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 20458de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 20468de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 20478de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *type 20488de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 2049aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 2050e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2051cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 2052f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan ValueObjectSP valobj; 2053f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan VariableSP var_sp; 2054f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan Error err; 2055f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan 2056f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan valobj = frame.GetValueForVariableExpressionPath(name.GetCString(), 2057f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan eNoDynamicValues, 2058f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 2059f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan var_sp, 2060f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan err); 20613bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2062f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan if (!err.Success() || 2063f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan !var_sp || 2064ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->IsInScope(&frame) || 2065ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->LocationIsValidForFrame (&frame)) 2066ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return lldb::VariableSP(); 20673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 20683bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 20693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 20703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 20713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 207204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 2073696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 20743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 20753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 20763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 20773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 20783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 2079696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 20803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 20813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 20823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2083696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return var_sp; 2084cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 2085336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2086819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol * 2087819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol 2088819749647b1605f75753f625050cb240292c08b0Sean Callanan( 2089819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 2090aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan const ConstString &name 2091819749647b1605f75753f625050cb240292c08b0Sean Callanan) 2092819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2093819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 2094819749647b1605f75753f625050cb240292c08b0Sean Callanan 2095aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, 2096aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan eSymbolTypeData, 2097aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sc_list); 2098819749647b1605f75753f625050cb240292c08b0Sean Callanan 2099819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 2100819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2101819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 2102819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 2103819749647b1605f75753f625050cb240292c08b0Sean Callanan 2104819749647b1605f75753f625050cb240292c08b0Sean Callanan return sym_ctx.symbol; 2105819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2106819749647b1605f75753f625050cb240292c08b0Sean Callanan 2107819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 2108819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2109819749647b1605f75753f625050cb240292c08b0Sean Callanan 211047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP 211147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable 211247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan( 211347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target &target, 211494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ModuleSP &module, 211594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan const ConstString &name, 211694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ClangNamespaceDecl *namespace_decl, 211747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser *type 211847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan) 211947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 212047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList vars; 212147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 212294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan if (module && namespace_decl) 212394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module->FindGlobalVariables (name, namespace_decl, true, -1, vars); 212494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan else 212594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan target.GetImages().FindGlobalVariables(name, true, -1, vars); 212647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 212747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (vars.GetSize()) 212847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 212947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type) 213047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 213147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < vars.GetSize(); ++i) 213247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 213347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableSP var_sp = vars.GetVariableAtIndex(i); 213447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 213547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 213647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 213747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 213847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return var_sp; 213947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 214047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 214147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 214247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 214347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 214447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return vars.GetVariableAtIndex(0); 214547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 214647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 214747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 214847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return VariableSP(); 214947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 215047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 215124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 215247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 215316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 2154f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context) 215524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2156f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 2157f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2158f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 2159f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2160e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 216124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21629394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (GetImportInProgress()) 2163ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 216467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 2165ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 2166ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 2167ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 2168e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 216967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan static unsigned int invocation_id = 0; 217067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id = invocation_id++; 217167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan 217216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 217316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 217416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (!context.m_decl_context) 21759394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString()); 217616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context)) 21779394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str()); 217816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 21799394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName()); 218016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 21819394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 218216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context)) 218316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 218473b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context); 2185a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 218667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 21879394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Inspecting namespace map %p (%d entries)", 218867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 218967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan namespace_map.get(), 219067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (int)namespace_map->size()); 2191a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2192a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan if (!namespace_map) 2193a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan return; 2194a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan 219516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); 219616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i != e; 219716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ++i) 219816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 219916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 22009394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", 220167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 220216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->second.GetNamespaceDecl()->getNameAsString().c_str(), 220316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->first->GetFileSpec().GetFilename().GetCString()); 220416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 2205c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan FindExternalVisibleDecls(context, 2206c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->first, 2207c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->second, 220867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 220916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 221016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 221116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (!isa<TranslationUnitDecl>(context.m_decl_context)) 221216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 221316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan // we shouldn't be getting FindExternalVisibleDecls calls for these 221416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan return; 221516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 221616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 221716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 221816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangNamespaceDecl namespace_decl; 221916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 222016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 22219394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id); 222216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 222316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan FindExternalVisibleDecls(context, 222416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP(), 222516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl, 222667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 222716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2228a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 22299394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (!context.m_found.variable) 22309394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan ClangASTSource::FindExternalVisibleDecls(context); 223116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan} 223216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 223316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 223416b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, 223538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan lldb::ModuleSP module_sp, 223603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl &namespace_decl, 223767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 223816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{ 2239f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 224016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 224116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 22429394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 2243e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 224424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22459394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 22469394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 22473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 22483bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 22493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 22503bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 22519394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 22528de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 22538de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 2254567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2255567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr(); 225603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (name_unique_cstr[0] == '$' && !namespace_decl) 22573cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 225857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 225947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 226057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 226157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 226257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 226357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2264567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 226547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 226647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2267567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableList *vars = frame->GetVariableList(false); 226857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 226957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!vars) 227057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 227157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 227257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 227357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 227475a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!this_var || 2275567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !this_var->IsInScope(frame) || 2276567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !this_var->LocationIsValidForFrame (frame)) 227757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 227857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 227957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton Type *this_type = this_var->GetType(); 228057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 228157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_type) 228257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 228357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 228467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 22852403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 22869394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf (" CEDM::FEVD[%u] Type for \"this\" is: ", current_id); 22872403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton StreamString strm; 22882403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton this_type->Dump(&strm, true); 22892403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString (strm.GetData()); 22902403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 229103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 229204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser this_user_type(this_type->GetClangFullType(), 229357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 229457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2295aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type = this_user_type; 229657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 229758baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 229857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 229957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(), 230057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton &pointer_target_type)) 230157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 230257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2303c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type); 2304c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2305c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan if (pointer_target_qual_type.isConstQualified()) 2306c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan pointer_target_qual_type.removeLocalConst(); 2307c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2308c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(), 230957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 231003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 23113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 23123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 2313a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(pointer_target_qual_type); 23149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString()); 23153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 23163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2317e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan AddOneType(context, class_user_type, current_id, true); 231857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 231957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 232057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 232157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 23223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 23233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 23243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 23253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 23263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2327567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 232847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 232947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2330567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableList *vars = frame->GetVariableList(false); 233103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 23323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!vars) 23333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 233403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 23353aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 233603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 233775a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!self_var || 2338567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !self_var->IsInScope(frame) || 2339567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !self_var->LocationIsValidForFrame (frame)) 23403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 234103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 23423aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Type *self_type = self_var->GetType(); 23433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 23443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_type) 23453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 234603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 234704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser self_user_type(self_type->GetClangFullType(), 23483aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 23493aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 23503aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 235103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 235258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 235303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 23543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(), 235527a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham &pointer_target_type) 235619c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton || pointer_target_type == NULL) 23573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 235803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 23593aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser class_user_type(pointer_target_type, 23603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 23613aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 23623aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 23633aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 2364a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(pointer_target_type); 2365a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 23663aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 23673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2368e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan AddOneType(context, class_user_type, current_id, false); 23693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 23703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 23713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 2372c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan 2373c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan // any other $__lldb names should be weeded out now 2374c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) 2375c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan return; 237603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 23772431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan do 23782431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan { 2379567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 23802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 23812431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2382567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); 23832431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_clang_ast_context) 23852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 23862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 23882431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23892431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_ast_context) 23902431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 23912431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23922431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); 239303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 23942431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!ptype_type_decl) 23952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 23962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2397f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan Decl *parser_ptype_decl = ClangASTContext::CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl); 23982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 23992431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_decl) 24002431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 24012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 24022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); 24032431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 24042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_type_decl) 24052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 24062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 24072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (log) 24089394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString()); 24092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 24102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan context.AddNamedDecl(parser_ptype_type_decl); 24112431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan } while (0); 24122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 241403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2415427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 24161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 241767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, pvar_sp, current_id); 24181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 24191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 24201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 24211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 24221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2423aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->GetRegisterContext()) 24241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2425b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); 24269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 24271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 2428e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan { 2429e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (log) 24309394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name); 2431e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 243267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneRegister(context, reg_info, current_id); 2433e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan } 24341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 24358de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 243603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 243703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 243803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ValueObjectSP valobj; 243903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan VariableSP var; 244003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Error err; 244103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 244203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (frame && !namespace_decl) 244303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 244403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr, 244503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan eNoDynamicValues, 244603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 244703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan var, 244803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan err); 244903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 245003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // If we found a variable in scope, no need to pull up function names 245103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (err.Success() && var != NULL) 245203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 245367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, var, current_id); 245416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 24553a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan return; 245603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 245703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 245803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (target) 245903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 246094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan var = FindGlobalVariable (*target, 246138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp, 246294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan name, 246394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan &namespace_decl, 246403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NULL); 246503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 246603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (var) 246703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 246867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, var, current_id); 246916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 247003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 247103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 247203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 247316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 247403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 247503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool include_symbols = true; 247603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool append = false; 2477a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 247838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (namespace_decl && module_sp) 2479a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 248038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp->FindFunctions(name, 248138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan &namespace_decl, 248238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan eFunctionNameTypeBase, 248338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan include_symbols, 248438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan append, 248538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan sc_list); 2486a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2487a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan else 2488a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 2489a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan target->GetImages().FindFunctions(name, 2490a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan eFunctionNameTypeBase, 2491a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 2492a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 2493a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 2494a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2495a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 249603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sc_list.GetSize()) 249703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 249803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *generic_symbol = NULL; 249903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *non_extern_symbol = NULL; 250003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 250103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 250203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan index < num_indices; 250303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++index) 250403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 250503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext sym_ctx; 250603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 250703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 250803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.function) 250903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 251003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // TODO only do this if it's a C function; C++ functions may be 251103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // overloaded 251216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 251367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction(context, sym_ctx.function, NULL, current_id); 251416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function_with_type_info = true; 251516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 251603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 251703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (sym_ctx.symbol) 251803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 251903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.symbol->IsExternal()) 252003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan generic_symbol = sym_ctx.symbol; 252103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 252203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan non_extern_symbol = sym_ctx.symbol; 252303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 252403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 252503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 252616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 252703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 252803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (generic_symbol) 252903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 253067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, generic_symbol, current_id); 253116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 253203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 253303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (non_extern_symbol) 253403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 253567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, non_extern_symbol, current_id); 253616c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 253703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 253803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 253903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 254003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 254116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 254203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 254316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic 254403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 254503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2546aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan Symbol *data_symbol = FindGlobalDataSymbol(*target, name); 254703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 254803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (data_symbol) 254903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 255067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneGenericVariable(context, *data_symbol, current_id); 255116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 255203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 255303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 255403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 2555b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan } 255624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2557e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2558336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 25598de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 25608de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 25618de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 25624a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var, 25639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context, 25648de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 25658de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 25668de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 256724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2568e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 25696184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 257024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 257124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 257224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 257324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2574810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2575810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 2576336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 257724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 257824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 257904c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 258024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 258124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 258224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2583810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2584810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 2585336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 258624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 258724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 258924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2590b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 259124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2592810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2593810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 2594336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 259524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 259624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2597336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 2598336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 259924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 260024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2601178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 2602178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 2603567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2604567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2605178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 2606178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 2607178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 2608178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 2609567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target); 2610178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 261124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 261224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2613bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 261424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2615810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2616810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 2617336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 261824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2619b01000fd063629facd45044f137446fb748ee179Greg Clayton 262058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *type_to_use = NULL; 2621336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2622f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 2623f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 2624b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 2625f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 26264b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 26274b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 26284b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 26294b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 26304b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 26314b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 26324b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 26334b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 2634f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 2635f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 2636f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2637336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 2638336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 26416916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 264424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 2647336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 2649336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 265224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 265324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 2654336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 2655336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 265624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2658567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 266047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 266147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 266247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->GetScalar() = load_addr; 266347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->SetValueType(Value::eValueTypeLoadAddress); 266447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 2668b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 2669336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2670336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 2671336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 2672336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2673336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 267467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, unsigned int current_id) 2675336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 2676aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2677aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2678e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 267947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2680f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 2681f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 2682336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2683aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx, 26848de27c761a22187ef63fb60000894be163e7285fGreg Clayton var, 2685f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context, 26868de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 26878de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 2688336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 26894b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 26904b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 26914b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 26926f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan NamedDecl *var_decl; 26936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 26946f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType()); 26956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 26966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 26976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); 26986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 26996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 27006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 27018de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2702427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 2703fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2704fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham entity_name, 2705427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ut, 270647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 270747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2708427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 2709427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2710427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 2711427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2712427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2713427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 2714696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan entity->m_parser_vars->m_lldb_var = var; 271524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27166f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 27176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan entity->m_flags |= ClangExpressionVariable::EVTypeIsReference; 27186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 2719810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 27208de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2721a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 27229394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 27238de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 27248f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 27258f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 27268f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 2727a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 272867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan ClangExpressionVariableSP &pvar_sp, 272967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 2730a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 2731e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 273245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 2733427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 2734a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2735f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (GuardedCopyType(m_ast_context, 2736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 2737427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 2738f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 2739a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 27406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 27418c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2742427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 2743427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 2744427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 2745427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 2746427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 274745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 274845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 2749a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 2750a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 27519394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString()); 2752a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 2753a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 2754a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 27551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 2756819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 275767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol &symbol, 275867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 2759819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2760819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 2761819749647b1605f75753f625050cb240292c08b0Sean Callanan 2762819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2763819749647b1605f75753f625050cb240292c08b0Sean Callanan 2764567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2765567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2766567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 2767567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return; 2768567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2769567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 2770819749647b1605f75753f625050cb240292c08b0Sean Callanan 2771fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)), 2772819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 2773819749647b1605f75753f625050cb240292c08b0Sean Callanan 2774f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)), 2775f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 2776819749647b1605f75753f625050cb240292c08b0Sean Callanan 2777fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 2778819749647b1605f75753f625050cb240292c08b0Sean Callanan 2779819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2780819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 2781819749647b1605f75753f625050cb240292c08b0Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2782819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 2783819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 278447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 278547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2786819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 2787819749647b1605f75753f625050cb240292c08b0Sean Callanan 2788819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 2789819749647b1605f75753f625050cb240292c08b0Sean Callanan 2790819749647b1605f75753f625050cb240292c08b0Sean Callanan AddressRange &symbol_range = symbol.GetAddressRangeRef(); 2791819749647b1605f75753f625050cb240292c08b0Sean Callanan Address &symbol_address = symbol_range.GetBaseAddress(); 2792567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 2793819749647b1605f75753f625050cb240292c08b0Sean Callanan 2794819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2795819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 2796819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 2797819749647b1605f75753f625050cb240292c08b0Sean Callanan 2798fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->EnableParserVars(); 2799819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2800819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_named_decl = var_decl; 2801819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_llvm_value = NULL; 2802819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_value = symbol_location.release(); 2803819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_sym = &symbol; 2804819749647b1605f75753f625050cb240292c08b0Sean Callanan 2805819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 2806819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2807a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 2808819749647b1605f75753f625050cb240292c08b0Sean Callanan 28099394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 2810819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2811819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2812819749647b1605f75753f625050cb240292c08b0Sean Callanan 2813fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 2814fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 2815fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 2816fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2817567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2818567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2819567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 2820fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2821fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 2822fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 2823fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 2824fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2825fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 2826fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2827fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 2828fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2829fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl; 2830fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 2831fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2832fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 2833fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2834fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2835fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 2836fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 2837fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2838fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2839fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2840fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2841a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl)); 2842a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString()); 2843fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2844fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2845fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 2846fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 2847fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2848fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 2849fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2850fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 2851fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2852fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2853fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2854fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2855fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangAST(user_type.GetASTContext()); 2856fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangType(user_type.GetOpaqueQualType()); 2857fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2858fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 2859fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2860fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2861fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2862fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 2863fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 2864fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2865819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 2866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 286767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const RegisterInfo *reg_info, 286867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 28691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 28701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 28711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2872f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context, 28731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 28741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 28751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 28761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 28771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2878122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen if (log) 287967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 28801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 28811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 28821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 2884f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 28851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 28861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 28871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2888fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 288947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 289047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2891427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 28921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 2894427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 2895427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 2897427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2898427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2899427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 29001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 290167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 29021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2903a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 29049394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString()); 29051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 29061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 29071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2908a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 2909da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 2910da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Function* fun, 291167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol* symbol, 291267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 29138f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 2914aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2915aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2916e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 29178f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 291858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan NamedDecl *fun_decl = NULL; 29190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 292058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan const Address *fun_address = NULL; 29218f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 29220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 29230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 29249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *fun_ast_context = NULL; 29258f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 29260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 29270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 29280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 29290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 29300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 29310fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 29320fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 293367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no type"); 29340fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 29350fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 29360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 293704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton fun_opaque_type = fun_type->GetClangFullType(); 29380fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 29390fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 29400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 29410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 294267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no Clang type"); 29430fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 29440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 29450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 29460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 29470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 2948b01000fd063629facd45044f137446fb748ee179Greg Clayton fun_ast_context = fun_type->GetClangASTContext().getASTContext(); 2949f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type); 2950a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (copied_type) 2951a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 2952a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_decl = context.AddFunDecl(copied_type); 2953a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 2954a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton else 2955a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 2956a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton // We failed to copy the type we found 2957a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (log) 2958a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 2959a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt", 2960a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetName().GetCString(), 2961a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetID()); 2962a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 2963a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 29640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 29650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 29660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 29670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 29680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 29690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 29700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 29710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 29728f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 2973810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 297467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" AddOneFunction called with no function and no symbol"); 29758f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 29768f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 29778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 2978567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2979567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2980567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target); 29818f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 29828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 29838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 2984fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 298547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 298647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2987427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 29888de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2989427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 2990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 2991427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 2992427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 29978c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2998810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 29998de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3000a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(fun_decl); 3001a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 30029394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found %s function %s, returned %s", 300367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 300467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (fun ? "specific" : "generic"), 300567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan decl_name.c_str(), 3006a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ast_dumper.GetCString()); 30078de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 300824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 300993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 301093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 301193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 30123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 301367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id, 30143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 301593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 3016f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan ASTContext *parser_ast_context = m_ast_context; 30179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *user_ast_context = ut.GetASTContext(); 30183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3019ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 30209394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 30213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 30223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 30233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 30243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 30253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 30263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3027716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 3028716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 3029716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan args, 3030716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 1, 3031716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan false, 3032716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 3033716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 30341d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 30351d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 30361d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 303730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 303828ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan const bool is_attr_used = true; 30392581dbf7292c6272bb771fe396ab30921385d669Sean Callanan const bool is_artificial = false; 304030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 30411d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 30421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 30438de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 30441d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 30451d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 30461d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 30471d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 304830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 3049716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan is_explicit, 30502581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_attr_used, 30512581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_artificial); 30523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 305393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 305493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 305593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 3056