ClangExpressionDeclMap.cpp revision a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2
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 516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) : 528de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 538de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 54dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_keep_result_in_memory (keep_result_in_memory), 55aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 56dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_struct_vars () 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 636d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // Note: The model is now that the parser's AST context and all associated 646d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // data does not vanish until the expression has been executed. This means 656d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // that valuable lookup data (like namespaces) doesn't vanish, but 666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan DidParse(); 68aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 69aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 72166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool 73427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 748c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 75aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_exe_ctx = &exe_ctx; 77567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 78567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr()) 80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetThreadPtr()) 82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetProcessPtr()) 84987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 85987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 86567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 87987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 88567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (target) 89987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 90987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 91567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 92987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 9397ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan 94567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_persistent_vars = &target->GetPersistentVariables(); 97166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetScratchClangASTContext()) 99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 101166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 10247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info = GetTargetInfo(); 10347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 104166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan return true; 105aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 106c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 107427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 108427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 112427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 117427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (var_sp && 118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars.get() && 119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_lldb_value) 120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton delete var_sp->m_parser_vars->m_lldb_value; 121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->DisableParserVars(); 123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 129427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 130427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->DisableParserVars(); 132aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1357a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 14047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo 14147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo() 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetInfo ret; 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 148567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx) 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 150567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 151567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process) 152567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 153567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.byte_order = process->GetByteOrder(); 154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.address_byte_size = process->GetAddressByteSize(); 155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else 157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 158567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 159567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 160567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.byte_order = target->GetArchitecture().GetByteOrder(); 162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 16747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ret; 16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1708de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 17282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 173aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 176427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 177427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton Target *target = m_parser_vars->GetTarget(); 178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (target); 179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName(); 180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 181aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 18282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 18382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 18405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP 18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name, 18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan lldb_private::TypeFromParser type, 18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan const llvm::APInt& value) 18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{ 18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan assert (m_parser_vars.get()); 190166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 191fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 192567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 193567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 194567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 195567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 196567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 19705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 19805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 19905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetASTContext(), 20005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetOpaqueQualType()), 20105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 20247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 203fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 204fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 2050e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 20647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 20747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 2080e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 2090e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2100e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 2110e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2120e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 2130e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 21405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2150e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 2160e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 2170e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 21805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 21905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 22047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 22105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 22305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 22405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 22505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2282bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (size_t byte_idx = 0; 22905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 23205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 23405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (m_parser_vars->m_target_info.byte_order) 23705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 2380e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 2390e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 2400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 2410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 2420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 2440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 2460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 2470e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 2480e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 2500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 25105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 25205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 2536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 255696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 256696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 25905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 26005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 261696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP 262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name, 2639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan VarDecl *decl, 264696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb_private::TypeFromParser type) 265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{ 266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan assert (m_parser_vars.get()); 267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 270696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 271567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 272567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 273567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 274567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 275567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 276567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 283696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 284696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 285696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return ClangExpressionVariableSP(); 286696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 287696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 288696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan type.GetASTContext(), 289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan type.GetOpaqueQualType()), 290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan context); 291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser var_type = var_sp->GetTypeFromUser(); 293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 294567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx->GetFramePtr(); 295567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL) 296567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 297567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 298567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type); 299696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var) 301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable 302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 303567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues); 304696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 305696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_valobj) 306696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 307696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 308696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type); 309696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 310696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_casted_valobj) 311696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 312696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (log) 314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan { 315696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan StreamString my_stream_string; 316696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 317696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangASTType::DumpTypeDescription (var_type.GetASTContext(), 318696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_type.GetOpaqueQualType(), 319696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan &my_stream_string); 320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str()); 323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan } 324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj); 326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!pvar_sp) 328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name)) 331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return pvar_sp; 338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan} 339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 34047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 34147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name) 34247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 34347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 34447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference); 34647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 34747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 34847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 34947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj, 35047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 35147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ConstString &name, 352a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::TypeFromParser type, 353a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan bool transient) 35447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 35547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 35647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 35847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 35947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pvar_sp) 36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 363a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !pvar_sp->m_live_sp && 364a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !transient) 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The reference comes from the program. We need to set up a live SP for it. 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetASTContext(), 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetOpaqueQualType(), 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetName(), 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value.GetScalar().ULongLong(), 37347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan value.GetValueAddressType(), 37447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetByteSize()); 37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry) 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->ValueUpdated(); 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t pvar_byte_size = pvar_sp->GetByteSize(); 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 38347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!ReadTarget(pvar_data, value, pvar_byte_size)) 38547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 38647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry); 38847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan valobj = pvar_sp; 39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 3958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 3968de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 3978de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 3998de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 4016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 4026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 4038de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 404a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 405aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 406aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 4076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 408fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 409567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 410567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 412567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 413567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 414567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 415567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 416a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 417a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 41882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetASTContext(), 41982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetOpaqueQualType()), 42097678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_parser_vars->m_target_info.IsValid()) 42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 424a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 425fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 426fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 427427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 42847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 42947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 4308c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4318c12720c108cd5e7ed792596749218d8400f647eSean Callanan 432427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 4338c12720c108cd5e7ed792596749218d8400f647eSean Callanan 434427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4358c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4368c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 4386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 4396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 4416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 4456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 4506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 4536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 4546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 455427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableParserVars(); 4568c12720c108cd5e7ed792596749218d8400f647eSean Callanan 457427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_named_decl = decl; 458427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_parser_type = parser_type; 4598c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4608c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 461a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 462a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 463a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 4648de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 4658de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 4678de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4688de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 4698de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 4708de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 4718de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 4728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 473aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 476e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 47745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 478aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 4798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 4828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 483427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 4848c12720c108cd5e7ed792596749218d8400f647eSean Callanan 485427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 486427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 4878c12720c108cd5e7ed792596749218d8400f647eSean Callanan 488427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4898c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan 49145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 49245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan log->Printf("Adding value for decl %p [%s - %s] to the structure", 49345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 4948de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 495427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 49645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 4978c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 4988c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 499427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_llvm_value = value; 5008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 501427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableJITVars(); 502427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_alignment = alignment; 503427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_size = size; 5048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 505427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 5068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 5128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 513aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 514aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 515aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 5168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 5198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 520aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 521aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 5228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 523427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 5248c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 5258c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 5268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 527427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 528427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 529427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 530427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 5328c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5348c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 535427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment; 5368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (cursor % member_sp->m_jit_vars->m_alignment) 538427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment)); 5398c12720c108cd5e7ed792596749218d8400f647eSean Callanan 540427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset = cursor; 541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += member_sp->m_jit_vars->m_size; 5428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 5438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 544aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 5458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 546aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 5478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5508de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 5518de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5528de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 5538de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 5548de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 5558de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 557aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 558aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 559aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 5608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 562427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 563aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 5718de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *&decl, 5738de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 5748de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 5758de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 5768de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 5778de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 579aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 5828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 584427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 5858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 5868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 5888c12720c108cd5e7ed792596749218d8400f647eSean Callanan 589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp || 590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_parser_vars.get() || 591427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_jit_vars.get()) 5928c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 594427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton decl = member_sp->m_parser_vars->m_named_decl; 595427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = member_sp->m_parser_vars->m_llvm_value; 596427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton offset = member_sp->m_jit_vars->m_offset; 597427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 5988c12720c108cd5e7ed792596749218d8400f647eSean Callanan 5998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 60202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 6038de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 6048de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 6068de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value**& value, 6078de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 6088de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 609ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 610427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl)); 6118c12720c108cd5e7ed792596749218d8400f647eSean Callanan 612427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 6138c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 614ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 6158c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 6168c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 617ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 618427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = &entity_sp->m_parser_vars->m_llvm_value; 619427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 6208c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6218c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 622ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 623ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 624ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void 625ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext 626ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan( 627ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan const ConstString &name, 628ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContext &sym_ctx, 629ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContextList &sc_list 630ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan) 631ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{ 632ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (sym_ctx.module_sp) 633aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 634ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 635ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (!sc_list.GetSize()) 636ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 637ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan} 638ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 639f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 6408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 6418de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6428de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 643da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 6448de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 645f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 646aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 648aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 649567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 650567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx == NULL) 651567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 652567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 653f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 654567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 65578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 65678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 657f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 658f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 659e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 660f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 661ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 662ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 663e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 664aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 665aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 666aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 667aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 668aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan Mangled mangled(name.GetCString(), true); 669aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 670aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan ConstString demangled_name = mangled.GetDemangledName(); 671aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 672aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (strlen(demangled_name.GetCString())) 673aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 674aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan std::string const_name_scratch(demangled_name.GetCString()); 675aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 676aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan const_name_scratch.append(" const"); 677aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 678aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan ConstString const_name(const_name_scratch.c_str()); 679aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 680ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 681aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 682aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 683aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString()); 684aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 685aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 686aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 687aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 688f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 689f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 690f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 691e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 692f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 693da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 694f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 696da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 697f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 698da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 699f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 700f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 701f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 702ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 703ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 704ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 705567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton func_addr = func_so_addr->GetCallableLoadAddress (target); 706da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 707f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 708f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 709f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 710cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 711cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name) 712c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 713c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 714c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 715819749647b1605f75753f625050cb240292c08b0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); 716c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 717cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 718cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 719cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 720cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++) 721cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 722cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 723cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 724c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 725cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 726ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 727ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 728ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return LLDB_INVALID_ADDRESS; 729ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 730cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 731cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 732cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 733cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 734cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 735cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 736cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 737cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 738cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 739cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 740cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 741cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 742cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 743cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 744cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 745cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 746cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeExtern: 747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 748cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 749cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 750cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 752cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 753cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 757cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 761cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 765cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 766cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 767c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 768cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 769c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 770c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 771cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 772cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name) 773819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 774819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 775819749647b1605f75753f625050cb240292c08b0Sean Callanan 776819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!m_parser_vars->m_exe_ctx || 777567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !m_parser_vars->m_exe_ctx->GetTargetPtr()) 778819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 779819749647b1605f75753f625050cb240292c08b0Sean Callanan 780567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return GetSymbolAddress(m_parser_vars->m_exe_ctx->GetTargetRef(), name); 781819749647b1605f75753f625050cb240292c08b0Sean Callanan} 782819749647b1605f75753f625050cb240292c08b0Sean Callanan 78347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter 78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value, 78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint8_t *data, 78847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 79047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 79147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 79247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 79347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 794567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 79547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 79647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 797567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 79847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 79947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterContext *reg_ctx = exe_ctx->GetRegisterContext(); 80147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 80247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 80447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 80547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 80647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 80747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 80847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 809567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err)) 81047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 81147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 81247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return reg_ctx->WriteRegister(reg_info, reg_value); 81347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 81447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 81547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 81647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 81747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 81847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 81947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 82047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 822567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 82347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 82447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 825567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 82747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 828567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 82947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 83047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 831567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = file_addr.GetLoadAddress(target); 83247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 834567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory(load_addr, data, length, err); 83547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 83647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 83747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 83847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 83947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 840567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 844567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy ((void *)value.GetScalar().ULongLong(), data, length); 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data, 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 865567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 866567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx->GetProcessPtr(); 867567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 870567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterContext *reg_ctx = exe_ctx->GetRegisterContext(); 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx->ReadRegister(reg_info, reg_value)) 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 885567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err); 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 895567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx->GetTargetPtr(); 896567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 901567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 905567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton target->ReadMemory(file_addr, true, data, length, err); 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 90847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 90947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 911567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 915567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan memcpy (data, (const void *)value.GetScalar().ULongLong(), length); 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value 92947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl) 93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ExecutionContext exe_ctx = *m_parser_vars->m_exe_ctx; 93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl)); 93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl)); 93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (expr_var_sp) 93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 9404a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan if (!expr_var_sp->m_parser_vars.get() || !expr_var_sp->m_parser_vars->m_lldb_var) 9416d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan return Value(); 9426d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 9434a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan return *GetVariableValue(exe_ctx, expr_var_sp->m_parser_vars->m_lldb_var, NULL); 94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else if (persistent_var_sp) 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 947a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference || 948a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) && 949a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_live_sp) 950a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 951a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return persistent_var_sp->m_live_sp->GetValue(); 952a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 953a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan else 954a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 955a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::Value ret; 956a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetValueType(Value::eValueTypeHostAddress); 957a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 958a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes(); 959a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return ret; 960a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 96447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Value(); 96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 968810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 969f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 970f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 9718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 9728de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 973aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 9748de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 9758de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 9768de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 977f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 978aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 979aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 980567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_material_vars->m_process = exe_ctx.GetProcessPtr(); 981aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 9820ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan bool result = DoMaterialize(false /* dematerialize */, 9830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan exe_ctx, 9840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* top of stack frame */, 9850ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* bottom of stack frame */, 9860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan NULL, /* result SP */ 9870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan err); 988f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 989f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 990aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 991f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 992f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 993f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 994f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 995f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 9968de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 9978de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 9988de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 9993aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 1000aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 1001047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 1002047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 10038de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 10043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 1005aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1006aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1007567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1008567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1009567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1010567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1011567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL || process == NULL || target == NULL) 10123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because the context is incomplete"); 10143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1017aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 10183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because its type is unknown"); 10203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1023567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP object_ptr_var = FindVariableInScope (*frame, 1024696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 1025696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type)); 10263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 10273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 10283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString()); 10303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1033aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 10343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr_var, 1035aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 10363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 10373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 10383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 10393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 10403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 10413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 10423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 104350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 10443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 104550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 104650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 104750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 104850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 10493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 105050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 1051567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize(); 105250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 105350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 105450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 105550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 105650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 105750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 105850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 105950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 106050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 1061567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton object_ptr = process->ReadPointerFromMemory (value_addr, read_error); 1062c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS) 106350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 106450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 106550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 1066c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 106750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 10683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 106950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 10703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 107150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 107250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 107350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 107450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 107550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 107650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 107750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 107850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 107950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1080061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 108150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1082061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 108350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 108450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 108550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 108650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 108750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1088061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 108950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1090061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 109150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 1092061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 109350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 109450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 109550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1096061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 109750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1098061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 109950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 110050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 11013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 11033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 11043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 11053c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 11068de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 11078de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1108aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 1109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 11100ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 11110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 11128de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 11138de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1114f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 11150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err); 1116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 1118aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 1119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 1121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 1122aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 1124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 1128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 1130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 1131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 1132aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 1136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1137f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1138f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 113932824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 11408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 11418de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1142aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 11438de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 11448de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 11458de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 114632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 1147aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1148aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 1149aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1150aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 115132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 115232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 115332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 115432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 1155567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1156567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 115832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 115932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 116032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 116132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 116232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1163567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 116532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 116632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 116732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 116832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 116932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 11703371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 11713371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 11723371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 11733371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 11743371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 11753371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 1176c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 117732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 117832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 1179567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (m_material_vars->m_materialized_location, 1180c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetBytes(), 1181c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetByteSize(), error) != data_sp->GetByteSize()) 118232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 118332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 118432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 118532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 118632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1187567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize()); 118832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1189427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 1190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 1191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 119232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 1193427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 119432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1195427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 1196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 1197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 11998c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1200427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 12018c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 12028c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1203427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 1204427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 1205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 1206427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 1207427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 1208427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 1209427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 1210427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 1211427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 121232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 121332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 121432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 121532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 121632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 121732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 121832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1219f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 12208de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 12218de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 1223aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 12240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 12250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 1226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 12278de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 12288de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1229810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 1230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 1231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 1232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1233aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1234aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1235e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 123682b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 1237aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 1238810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1239810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 124057067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 1241810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1242810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1243567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1244567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 124545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 124645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 124757067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 124845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 1249567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 125045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 1251567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangPersistentVariables &persistent_vars = target->GetPersistentVariables(); 1252aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1253aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 1254e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 1255e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 1256e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 1257e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 12589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_material_vars->m_allocated_area = NULL; 1259e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1260e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 1261e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 1262e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1263567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything)); 1264810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1265f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 1266f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1267567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1268aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1269f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1270567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->DeallocateMemory(m_material_vars->m_materialized_location); 1271aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1272f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1273810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 12747a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 12757a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 12767a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 1277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 1278aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 1279aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan err); 1280f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1281f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 1282f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1283f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1284aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 1285f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1286810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1287aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 1288810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1289aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 1290aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 1291810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1292427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 12938c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 12948c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 1295810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 12974d0b110715d321d366dec1dc690300f713b63236Sean Callanan 1298a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 1299336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 1300a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 1301427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 13021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 13031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 13041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1305aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 13061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 13081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 1311427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 1312427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 1313427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 1314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 13161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 13191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1320427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 13211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 1324427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 13256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 13266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 1327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 13291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13318c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1332a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 13338c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 1334a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 1335a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 1336a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 133745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 13386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1339a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 1340a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1341a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 1342a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 13436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1344a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 1345a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 13466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1347a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 1348a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 1349a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 13506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx, 1351a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 13520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 13530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_top, 13540ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom, 1355a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 1356a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 1357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1358a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 1359a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1360a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 13618c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1362a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 13638c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1364810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1365810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1366f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1369a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 13708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 13718de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 13728de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 13738de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 1374427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 13758de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 13760ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 13770ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 13788de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13798de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1380aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 13816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 13826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1383427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1384a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1385427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1386a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1387a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1388a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1390a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1391427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1392427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 1393a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 1394a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1395a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1396567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1397567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 13986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 13996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1400a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1401a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 14026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 14036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 14066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 14076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 14096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 1411567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->ReadPointerFromMemory (addr, read_error); 14126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 14146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 14166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 14206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 14216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 14236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 14246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 142547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (), 142647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 142747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 142847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 142947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 143047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 143147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 14326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 14356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 14376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1440b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 14416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 14436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 144697678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 144797678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 14486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 14506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 14526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 14536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 14550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 14566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 1457567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 14586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 14606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14630ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan if (stack_frame_top != LLDB_INVALID_ADDRESS && 14640ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom != LLDB_INVALID_ADDRESS && 14650ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem >= stack_frame_bottom && 14660ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem <= stack_frame_top) 14670ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 14680ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // If the variable is resident in the stack frame created by the expression, 14690ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // then it cannot be relied upon to stay around. We treat it as needing 14700ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // reallocation. 14710ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 14720ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 14730ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 14740ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; 14750ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 14760ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 14816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 14826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 14846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 14866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 14886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1489567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(mem); 14906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 14926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 14946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1500a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 15016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1502a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1503a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1504a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1505a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1506a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 15076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 15086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 15096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 15116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 15136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 15156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1516567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->AllocateMemory(pvar_byte_size, 15176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 15186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan allocate_error); 15196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 15216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 15236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 15276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 15286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 15306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 153147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 153247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 153347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 153447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 153547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 153647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 153747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 15386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 15406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 15426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 15456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1546567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 15476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 15496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 15546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 15556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 15576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1558567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 1559c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton var_sp->m_live_sp->GetValue().GetScalar(), 1560567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->GetAddressByteSize(), 1561c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 15626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 15646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 15656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 15666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 15676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1568c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong()); 15696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1570696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1571a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 15726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1573a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1574a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1575a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1576a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1577a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1578a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1579a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1580f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 15818de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 15828de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 15838de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 15848de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 15858de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 15866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 15878de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 15888de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 15898de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1590f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1591e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1592567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1593567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 1594567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1595567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 15966d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get()) 1597cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 1598cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 15996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 16006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 16026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 16036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16044a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var(expr_var->m_parser_vars->m_lldb_var); 16054a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym); 1606f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1607819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 16084a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1609819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1610819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1611819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(GetVariableValue(exe_ctx, 1612819749647b1605f75753f625050cb240292c08b0Sean Callanan var, 1613819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1614819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1615819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym) 16164a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan { 1617567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton addr_t location_load_addr = GetSymbolAddress(*target, name); 1618819749647b1605f75753f625050cb240292c08b0Sean Callanan 1619cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (location_load_addr == LLDB_INVALID_ADDRESS) 1620819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1621819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1622c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s", 1623c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1624819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1625819749647b1605f75753f625050cb240292c08b0Sean Callanan 16264a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan location_value.reset(new Value); 16274a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1628819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1629819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1630819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1631819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1632f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1633c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type", 1634c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1635f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1636f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1637f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1638841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 1639fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1640fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan StreamString my_stream_string; 1641fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1642fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangASTType::DumpTypeDescription (type.GetASTContext(), 1643fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan type.GetOpaqueQualType(), 1644fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan &my_stream_string); 1645fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1646c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf ("%s %s with type %s", 1647c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton dematerialize ? "Dematerializing" : "Materializing", 1648c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1649c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton my_stream_string.GetString().c_str()); 1650fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1651f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1652f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1653f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 16548de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1655f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1656f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 165717c6a05cb96f7110332342326a90692d9505982eSean Callanan 165817c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1659f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 166217c6a05cb96f7110332342326a90692d9505982eSean Callanan 166317c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 166417c6a05cb96f7110332342326a90692d9505982eSean Callanan 166517c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1666f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 166717c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1668f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 166917c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 167017c6a05cb96f7110332342326a90692d9505982eSean Callanan 167117c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 167217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1673c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s", 1674c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1675c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 167617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1677f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 167817c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 167917c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1680f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 16816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 168217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1683c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error write_error; 16846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1685567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 1686c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton location_value->GetScalar(), 1687567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->GetAddressByteSize(), 1688c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 16896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1690c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 1691c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1692c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 16936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 169517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1696f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 169717c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 169817c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1699f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 17006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 170117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 170217c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 170317c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 170417c6a05cb96f7110332342326a90692d9505982eSean Callanan 1705c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s", 1706c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1707c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 170817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 170917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 171017c6a05cb96f7110332342326a90692d9505982eSean Callanan 1711061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 171217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1713061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 171417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1715c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't get the register information for %s", 1716c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 171717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 171817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 171917c6a05cb96f7110332342326a90692d9505982eSean Callanan 1720061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1721061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1722061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 1723061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1724061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 172517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1726c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s", 1727c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1728c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 172917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 173017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 173117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1732061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 173317c6a05cb96f7110332342326a90692d9505982eSean Callanan 173417c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 173517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 17366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 17396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1744b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 17456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 17476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1750c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar ®_addr = expr_var->m_live_sp->GetValue().GetScalar(); 175117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1752c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, 1753c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1754c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1755c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1756061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 175717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1758061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1759061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 176017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1761c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to register %s", 1762c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1763c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 176417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 176517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 17666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1769567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong()); 17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1773c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s", 1774c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1775c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton deallocate_error.AsCString()); 17766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 178017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 178117c6a05cb96f7110332342326a90692d9505982eSean Callanan else 178217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 17836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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 17846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 17856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 17876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1788567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Scalar reg_addr (process->AllocateMemory (value_byte_size, 1789c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::ePermissionsReadable | lldb::ePermissionsWritable, 1790c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error)); 17916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1792c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS) 17936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1794c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s", 1795c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1796c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error.AsCString()); 17976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 18016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 180247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 180347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 180447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 180547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 1806c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 180747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 180847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 18096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 18116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1813c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1814567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 1815c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr, 1816567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->GetAddressByteSize(), 1817c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 18186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1819c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 1820c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1821c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 18236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 18246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 182617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1827c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is too big to store in %s", 1828c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1829c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 183017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 183117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1832061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1833061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1834061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1835061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 183617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1837c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from %s", 1838c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1839c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 184017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 184117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 184217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1843c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->WriteRegisterValueToMemory (reg_info, 1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1845c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1846c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1847061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 184817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 184917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1850f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1851f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1852f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1853f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1854810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 1855810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 18561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 18571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 18581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 18591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 18601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ExecutionContext &exe_ctx, 18611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 1862b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 18631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 18641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 18651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 18661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 18671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 1868061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 18691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 18701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1871061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 1872061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 18731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1874bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 18751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 18761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 18771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1878061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 18791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1880061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 18811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 18821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 18831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 18841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 18851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 18861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1887061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 18881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1889061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 18901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 18911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 18921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1893061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 1894061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 18951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 189695b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString()); 18971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 18981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 18991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 19021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 19031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1904696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 19058de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 19068de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 19078de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 19088de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 19098de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *type 19108de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1911aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1912e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1913cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1914f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan ValueObjectSP valobj; 1915f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan VariableSP var_sp; 1916f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan Error err; 1917f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan 1918f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan valobj = frame.GetValueForVariableExpressionPath(name.GetCString(), 1919f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan eNoDynamicValues, 1920f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 1921f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan var_sp, 1922f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan err); 19233bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 1924f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan if (!err.Success() || 1925f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan !var_sp || 1926ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->IsInScope(&frame) || 1927ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->LocationIsValidForFrame (&frame)) 1928ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return lldb::VariableSP(); 19293bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 19303bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 19313bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 19323bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 19333bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 193404c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 1935696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 19363bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 19373bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 19383bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 19393bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 19403bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 1941696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 19423bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 19433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 19443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 1945696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return var_sp; 1946cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 1947336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1948819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol * 1949819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol 1950819749647b1605f75753f625050cb240292c08b0Sean Callanan( 1951819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 1952aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan const ConstString &name 1953819749647b1605f75753f625050cb240292c08b0Sean Callanan) 1954819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 1955819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 1956819749647b1605f75753f625050cb240292c08b0Sean Callanan 1957aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, 1958aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan eSymbolTypeData, 1959aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sc_list); 1960819749647b1605f75753f625050cb240292c08b0Sean Callanan 1961819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 1962819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1963819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 1964819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 1965819749647b1605f75753f625050cb240292c08b0Sean Callanan 1966819749647b1605f75753f625050cb240292c08b0Sean Callanan return sym_ctx.symbol; 1967819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1968819749647b1605f75753f625050cb240292c08b0Sean Callanan 1969819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 1970819749647b1605f75753f625050cb240292c08b0Sean Callanan} 1971819749647b1605f75753f625050cb240292c08b0Sean Callanan 197247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP 197347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable 197447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan( 197547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target &target, 197694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ModuleSP &module, 197794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan const ConstString &name, 197894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ClangNamespaceDecl *namespace_decl, 197947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser *type 198047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan) 198147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 198247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList vars; 198347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 198494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan if (module && namespace_decl) 198594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module->FindGlobalVariables (name, namespace_decl, true, -1, vars); 198694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan else 198794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan target.GetImages().FindGlobalVariables(name, true, -1, vars); 198847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 198947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (vars.GetSize()) 199047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 199147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type) 199247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 199347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < vars.GetSize(); ++i) 199447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 199547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableSP var_sp = vars.GetVariableAtIndex(i); 199647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 199747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 199847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 199947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 200047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return var_sp; 200147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 200247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 200347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 200447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 200547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 200647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return vars.GetVariableAtIndex(0); 200747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 200847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 200947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 201047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return VariableSP(); 201147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 201247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 201447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 201516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 201616b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, const ConstString &name) 201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2018e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2020aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_ignore_lookups) 2021ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 202267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 2023ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 2024ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 2025ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 2026e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 202767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan static unsigned int invocation_id = 0; 202867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id = invocation_id++; 202967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan 203016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 203116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 203216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (!context.m_decl_context) 203367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf("FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString()); 203416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context)) 203567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf("FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str()); 203616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 203767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf("FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName()); 203816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2039a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2040a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan context.m_namespace_map.reset(new ClangASTImporter::NamespaceMap); 204116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 204216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context)) 204316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 204416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangASTImporter::NamespaceMapSP namespace_map = m_parser_vars->m_ast_importer->GetNamespaceMap(namespace_context); 2045a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 204667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 204767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Inspecting namespace map %p (%d entries)", 204867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 204967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan namespace_map.get(), 205067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (int)namespace_map->size()); 2051a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 205216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); 205316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i != e; 205416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ++i) 205516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 205616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 205767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Searching namespace %s in module %s", 205867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 205916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->second.GetNamespaceDecl()->getNameAsString().c_str(), 206016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->first->GetFileSpec().GetFilename().GetCString()); 206116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 2062c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan FindExternalVisibleDecls(context, 2063c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->first, 2064c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->second, 206567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan name, 206667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 206716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 206816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 206916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (!isa<TranslationUnitDecl>(context.m_decl_context)) 207016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 207116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan // we shouldn't be getting FindExternalVisibleDecls calls for these 207216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan return; 207316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 207416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 207516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 207616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangNamespaceDecl namespace_decl; 207716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 207816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 207967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Searching the root namespace", current_id); 208016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 208116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan FindExternalVisibleDecls(context, 208216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP(), 208316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl, 208467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan name, 208567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 208616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2087a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2088a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (!context.m_namespace_map->empty()) 2089a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan { 209067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 209167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Registering namespace map %p (%d entries)", 209267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 209367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan context.m_namespace_map.get(), 209467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (int)context.m_namespace_map->size()); 2095a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2096a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan NamespaceDecl *clang_namespace_decl = AddNamespace(context, context.m_namespace_map); 2097a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2098a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (clang_namespace_decl) 2099a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan clang_namespace_decl->setHasExternalVisibleStorage(); 2100a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan } 210116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan} 210216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 210316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 210416b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, 210538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan lldb::ModuleSP module_sp, 210603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl &namespace_decl, 210767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const ConstString &name, 210867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 210916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{ 211016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan assert (m_struct_vars.get()); 211116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan assert (m_parser_vars.get()); 211216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 211316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2114e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2115e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21173bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 21183bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 21193bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 21203bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 21213bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 21228de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 21238de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 2124567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2125567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton StackFrame *frame = m_parser_vars->m_exe_ctx->GetFramePtr(); 212603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (name_unique_cstr[0] == '$' && !namespace_decl) 21273cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 212857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 212947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 213057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 213157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 213257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 213357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2134567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 213547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 213647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2137567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableList *vars = frame->GetVariableList(false); 213857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 213957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!vars) 214057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 214157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 214257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 214357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 214475a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!this_var || 2145567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !this_var->IsInScope(frame) || 2146567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !this_var->LocationIsValidForFrame (frame)) 214757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 214857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 214957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton Type *this_type = this_var->GetType(); 215057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 215157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_type) 215257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 215357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 215467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 21552403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 215667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf (" FEVD[%u] Type for \"this\" is: ", current_id); 21572403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton StreamString strm; 21582403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton this_type->Dump(&strm, true); 21592403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString (strm.GetData()); 21602403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 216103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 216204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser this_user_type(this_type->GetClangFullType(), 216357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 216457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2165aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type = this_user_type; 216657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 216758baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 216857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 216957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(), 217057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton &pointer_target_type)) 217157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 217257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2173c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan clang::QualType pointer_target_qual_type = QualType::getFromOpaquePtr(pointer_target_type); 2174c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2175c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan if (pointer_target_qual_type.isConstQualified()) 2176c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan pointer_target_qual_type.removeLocalConst(); 2177c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 2178c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan TypeFromUser class_user_type(pointer_target_qual_type.getAsOpaquePtr(), 217957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 218003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 21813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 21823aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 2183a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(pointer_target_qual_type); 2184a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString()); 21853aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 21863aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2187e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan AddOneType(context, class_user_type, current_id, true); 218857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 218957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 219057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 219157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 21923aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 21933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 21943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 21953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 21963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2197567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 219847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 219947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2200567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableList *vars = frame->GetVariableList(false); 220103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!vars) 22033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 220403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 220603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 220775a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!self_var || 2208567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !self_var->IsInScope(frame) || 2209567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton !self_var->LocationIsValidForFrame (frame)) 22103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 221103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Type *self_type = self_var->GetType(); 22133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_type) 22153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 221603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 221704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser self_user_type(self_type->GetClangFullType(), 22183aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 22193aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 222103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 222258baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 222303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(), 222527a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham &pointer_target_type) 222619c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton || pointer_target_type == NULL) 22273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 222803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser class_user_type(pointer_target_type, 22303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 22313aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 22333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 2234a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(pointer_target_type); 2235a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 22363aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 22373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2238e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan AddOneType(context, class_user_type, current_id, false); 22393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 22403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 22413aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 2242c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan 2243c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan // any other $__lldb names should be weeded out now 2244c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) 2245c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan return; 224603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22472431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan do 22482431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan { 2249567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 22502431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22512431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2252567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); 22532431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22542431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_clang_ast_context) 22552431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22562431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22572431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 22582431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22592431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_ast_context) 22602431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22612431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22622431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); 226303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 22642431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!ptype_type_decl) 22652431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22662431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22672431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan Decl *parser_ptype_decl = ClangASTContext::CopyDecl(context.GetASTContext(), scratch_ast_context, ptype_type_decl); 22682431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22692431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_decl) 22702431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22712431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22722431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); 22732431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22742431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_type_decl) 22752431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 22762431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22772431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (log) 227867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Found persistent type %s", current_id, name.GetCString()); 22792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 22802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan context.AddNamedDecl(parser_ptype_type_decl); 22812431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan } while (0); 22822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2283427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 228403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2285427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 22861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 228767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, pvar_sp, current_id); 22881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 22891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 22901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 22911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 22921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2293aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->GetRegisterContext()) 22941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2295b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); 2296e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 22971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 2298e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan { 2299e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (log) 2300e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan log->Printf(" FEVD[%u] Found register %s", current_id, reg_info->name); 2301e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 230267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneRegister(context, reg_info, current_id); 2303e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan } 23041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 23058de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 230603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 230703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 230803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ValueObjectSP valobj; 230903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan VariableSP var; 231003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Error err; 231103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 231203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (frame && !namespace_decl) 231303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 231403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr, 231503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan eNoDynamicValues, 231603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 231703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan var, 231803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan err); 231903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 232003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // If we found a variable in scope, no need to pull up function names 232103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (err.Success() && var != NULL) 232203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 232367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, var, current_id); 232416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 232503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 232603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 232703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (target) 232803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 232994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan var = FindGlobalVariable (*target, 233038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp, 233194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan name, 233294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan &namespace_decl, 233303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NULL); 233403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 233503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (var) 233603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 233767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, var, current_id); 233816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 233903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 234003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 234103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 234216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 234303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 234403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool include_symbols = true; 234503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool append = false; 2346a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 234738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (namespace_decl && module_sp) 2348a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 234938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp->FindFunctions(name, 235038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan &namespace_decl, 235138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan eFunctionNameTypeBase, 235238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan include_symbols, 235338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan append, 235438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan sc_list); 2355a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2356a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan else 2357a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 2358a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan target->GetImages().FindFunctions(name, 2359a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan eFunctionNameTypeBase, 2360a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 2361a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 2362a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 2363a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2364a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 236503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sc_list.GetSize()) 236603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 236703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *generic_symbol = NULL; 236803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *non_extern_symbol = NULL; 236903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 237003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 237103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan index < num_indices; 237203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++index) 237303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 237403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext sym_ctx; 237503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 237603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 237703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.function) 237803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 237903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // TODO only do this if it's a C function; C++ functions may be 238003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // overloaded 238116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 238267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction(context, sym_ctx.function, NULL, current_id); 238316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function_with_type_info = true; 238416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 238503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 238603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (sym_ctx.symbol) 238703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 238803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.symbol->IsExternal()) 238903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan generic_symbol = sym_ctx.symbol; 239003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 239103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan non_extern_symbol = sym_ctx.symbol; 239203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 239303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 239403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 239516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 239603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 239703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (generic_symbol) 239803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 239967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, generic_symbol, current_id); 240016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 240103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 240203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (non_extern_symbol) 240303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 240467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, non_extern_symbol, current_id); 240516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 240603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 240703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 240803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 240903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 241016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 241103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 241216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic 241303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 241403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2415aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan Symbol *data_symbol = FindGlobalDataSymbol(*target, name); 241603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 241703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (data_symbol) 241803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 241967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneGenericVariable(context, *data_symbol, current_id); 242016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 242103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 242203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 242303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 242403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2425a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (module_sp && namespace_decl) 242603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2427a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan ClangNamespaceDecl found_namespace_decl; 242803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2429a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan SymbolVendor *symbol_vendor = module_sp->GetSymbolVendor(); 243003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2431a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (symbol_vendor) 243203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2433a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan SymbolContext null_sc; 243403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2435a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &namespace_decl); 2436a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2437a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (found_namespace_decl) 2438a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan { 2439a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan context.m_namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(module_sp, found_namespace_decl)); 244003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2441a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (log) 244267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Found namespace %s in module %s", 244367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 2444a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan name.GetCString(), 2445a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan module_sp->GetFileSpec().GetFilename().GetCString()); 244603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 244703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 244803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 2449a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan else 245003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2451a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan ModuleList &images = m_parser_vars->m_sym_ctx.target_sp->GetImages(); 2452a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2453a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan for (uint32_t i = 0, e = images.GetSize(); 2454a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan i != e; 2455a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan ++i) 2456a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan { 2457a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan ModuleSP image = images.GetModuleAtIndex(i); 2458a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2459a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (!image) 2460a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan continue; 2461a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2462a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan ClangNamespaceDecl found_namespace_decl; 2463a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2464a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan SymbolVendor *symbol_vendor = image->GetSymbolVendor(); 2465a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2466a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (!symbol_vendor) 2467a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan continue; 2468a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2469a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan SymbolContext null_sc; 2470a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2471a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan found_namespace_decl = symbol_vendor->FindNamespace(null_sc, name, &namespace_decl); 2472a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2473a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (found_namespace_decl) 2474a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan { 2475a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan context.m_namespace_map->push_back(std::pair<ModuleSP, ClangNamespaceDecl>(image, found_namespace_decl)); 2476a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2477a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan if (log) 247867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Found namespace %s in module %s", 247967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 2480a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan name.GetCString(), 2481a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan image->GetFileSpec().GetFilename().GetCString()); 2482a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan } 2483a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan } 248403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 248503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 2486a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 248738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan TypeList types; 248838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan SymbolContext null_sc; 248938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan 249038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (module_sp && namespace_decl) 249138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp->FindTypes(null_sc, name, &namespace_decl, true, 1, types); 249238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan else 249338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan target->GetImages().FindTypes (null_sc, name, true, 1, types); 249438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan 249538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (types.GetSize()) 2496ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 249738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan TypeSP type_sp = types.GetTypeAtIndex(0); 249838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan 2499ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 25006df0840c87be29724055716db951aa6d494ddabcSean Callanan { 250167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const char *name_string = type_sp->GetName().GetCString(); 250267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan 250367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Matching type found for \"%s\": %s", 250467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 250567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan name.GetCString(), 250667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (name_string ? name_string : "<anonymous>")); 2507ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 25082403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 250938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan TypeFromUser user_type(type_sp->GetClangFullType(), 251038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan type_sp->GetClangAST()); 25116df0840c87be29724055716db951aa6d494ddabcSean Callanan 2512e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan AddOneType(context, user_type, current_id, false); 25136df0840c87be29724055716db951aa6d494ddabcSean Callanan } 251424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2515e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananclang::ExternalLoadResult 25179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context, 25189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan bool (*predicate)(Decl::Kind), 25199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan llvm::SmallVectorImpl<Decl*> &decls) 2520e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{ 25219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 25229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 2523e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 25249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const Decl *context_decl = dyn_cast<Decl>(decl_context); 25269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!context_decl) 25289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 25299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast_context = &context_decl->getASTContext(); 25319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 2532c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan static unsigned int invocation_id = 0; 2533c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan unsigned int current_id = invocation_id++; 2534c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan 25359b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (log) 253616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 253716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl)) 2538c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan log->Printf("FindExternalLexicalDecls[%u] in '%s' (a %s) with %s predicate", 2539c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan current_id, 254016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan context_named_decl->getNameAsString().c_str(), 254116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan context_decl->getDeclKindName(), 254216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan (predicate ? "non-null" : "null")); 254316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if(context_decl) 2544c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan log->Printf("FindExternalLexicalDecls[%u] in a %s with %s predicate", 2545c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan current_id, 254616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan context_decl->getDeclKindName(), 254716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan (predicate ? "non-null" : "null")); 254816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 2549c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan log->Printf("FindExternalLexicalDecls[%u] in a NULL context with %s predicate", 2550c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan current_id, 255116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan (predicate ? "non-null" : "null")); 255216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 25539b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25549b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *original_decl = NULL; 25559b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *original_ctx = NULL; 25569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25579b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context); 25589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!ast_importer) 25609b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 25619b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25629b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx)) 25639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 25649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 2565e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (log) 2566e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan { 2567e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan log->Printf(" FELD[%u] Original decl:", current_id); 2568e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan ASTDumper(original_decl).ToLog(log, " "); 25699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan } 25709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 25719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl)) 25729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan { 25739b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ExternalASTSource *external_source = original_ctx->getExternalSource(); 2574336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2575c613971c0016484053b60db95d01648a3f6ea849Sean Callanan if (external_source) 2576c613971c0016484053b60db95d01648a3f6ea849Sean Callanan external_source->CompleteType (original_tag_decl); 2577e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2578e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25799b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl); 2580e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25819b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!original_decl_context) 25829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 2583e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan for (TagDecl::decl_iterator iter = original_decl_context->decls_begin(); 25859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan iter != original_decl_context->decls_end(); 25869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ++iter) 2587e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 25889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *decl = *iter; 2589e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 25909b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!predicate || predicate(decl->getKind())) 2591e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 25929b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (log) 25939b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan { 2594a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(decl); 2595c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl)) 2596a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FELD[%d] Adding [to %s] lexical decl %s", current_id, context_named_decl->getNameAsString().c_str(), ast_dumper.GetCString()); 2597c22cde8a86d7f885a38acfbb0b570d5ade9831faSean Callanan else 2598a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FELD[%d] Adding lexical decl %s", current_id, ast_dumper.GetCString()); 25999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan } 26009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl); 2602e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 26039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decls.push_back(copied_decl); 2604e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2605e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2606e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 26079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_AlreadyLoaded; 26089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan} 26099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid 26119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl) 26129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{ 26139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 26149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl); 26169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan} 26179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid 26199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl) 26209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{ 26219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 26229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 26239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl); 2624e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton} 2625e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2626336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 26278de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 26288de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 26298de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 26304a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var, 26319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context, 26328de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 26338de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 26348de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 263524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2636e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 26376184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 263824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 263924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 264124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2642810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2643810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 2644336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 264524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 264624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 264824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 264924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 265024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2651810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2652810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 2653336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 265424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 265524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 265724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2658b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 265924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2660810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2661810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 2662336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 266324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 266424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2665336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 2666336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 266724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 266824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2669178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 2670178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 2671567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2672567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2673178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 2674178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 2675178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 2676178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 2677567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target); 2678178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2681bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2683810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2684810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 2685336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2687b01000fd063629facd45044f137446fb748ee179Greg Clayton 268858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *type_to_use = NULL; 2689336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2690f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 2691f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 2692b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 2693f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 26944b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 26954b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 26964b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 26974b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 26984b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 26994b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 27004b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 27014b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 2702f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 2703f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 2704f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2705336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 2706336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 270724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 270824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 27096916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 271024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 271224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 271424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 2715336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 271624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 2717336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 2722336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 2723336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2726567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 272847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 272947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 273047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->GetScalar() = load_addr; 273147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->SetValueType(Value::eValueTypeLoadAddress); 273247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2735f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 2736b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 2737336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2738336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 2739336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 2740336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2741336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 274267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, unsigned int current_id) 2743336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 2744aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2745aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2746e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 274747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2748f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 2749f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 2750336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2751aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx, 27528de27c761a22187ef63fb60000894be163e7285fGreg Clayton var, 27538de27c761a22187ef63fb60000894be163e7285fGreg Clayton context.GetASTContext(), 27548de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 27558de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 2756336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 27574b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 27584b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 27594b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 27606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 27618de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2762427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 2763fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2764fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham entity_name, 2765427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ut, 276647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 276747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2768427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 2769427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2770427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 2771427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2772427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2773427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 2774696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan entity->m_parser_vars->m_lldb_var = var; 277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2776810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 27778de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2778a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 2779a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 27808de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 27818f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 27828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 27838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 2784a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 278567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan ClangExpressionVariableSP &pvar_sp, 278667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 2787a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 2788e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 278945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 2790427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 2791a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2792427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(), 2793427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 2794427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 2795427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 2796a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 27976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 27988c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2799427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 2800427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 2801427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 2802427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 2803427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 280445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 280545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 2806a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 2807a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 2808a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString()); 2809a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 2810a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 2811a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 28121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 2813819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 281467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol &symbol, 281567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 2816819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2817819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 2818819749647b1605f75753f625050cb240292c08b0Sean Callanan 2819819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2820819749647b1605f75753f625050cb240292c08b0Sean Callanan 2821567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2822567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2823567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 2824567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return; 2825567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2826567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 2827819749647b1605f75753f625050cb240292c08b0Sean Callanan 2828fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)), 2829819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 2830819749647b1605f75753f625050cb240292c08b0Sean Callanan 2831fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)), 2832819749647b1605f75753f625050cb240292c08b0Sean Callanan context.GetASTContext()); 2833819749647b1605f75753f625050cb240292c08b0Sean Callanan 2834fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 2835819749647b1605f75753f625050cb240292c08b0Sean Callanan 2836819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2837819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 2838819749647b1605f75753f625050cb240292c08b0Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2839819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 2840819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 284147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 284247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2843819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 2844819749647b1605f75753f625050cb240292c08b0Sean Callanan 2845819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 2846819749647b1605f75753f625050cb240292c08b0Sean Callanan 2847819749647b1605f75753f625050cb240292c08b0Sean Callanan AddressRange &symbol_range = symbol.GetAddressRangeRef(); 2848819749647b1605f75753f625050cb240292c08b0Sean Callanan Address &symbol_address = symbol_range.GetBaseAddress(); 2849567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 2850819749647b1605f75753f625050cb240292c08b0Sean Callanan 2851819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2852819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 2853819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 2854819749647b1605f75753f625050cb240292c08b0Sean Callanan 2855fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->EnableParserVars(); 2856819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2857819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_named_decl = var_decl; 2858819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_llvm_value = NULL; 2859819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_value = symbol_location.release(); 2860819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_sym = &symbol; 2861fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan //entity->m_flags |= ClangExpressionVariable::EVUnknownType; 2862819749647b1605f75753f625050cb240292c08b0Sean Callanan 2863819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 2864819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2865a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 2866819749647b1605f75753f625050cb240292c08b0Sean Callanan 2867a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 2868819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2869819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2870819749647b1605f75753f625050cb240292c08b0Sean Callanan 2871fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 2872fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 2873fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 2874fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2875567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 2876567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2877567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 2878fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2879fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 2880fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 2881fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 2882fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2883fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 2884fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2885fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 2886fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2887fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl; 2888fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 2889fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2890fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 2891fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2892fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2893fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 2894fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 2895fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2896fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2897fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2898fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2899a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl)); 2900a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString()); 2901fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2902fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2903fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 2904fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 2905fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2906fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 2907fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2908fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 2909fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2910fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2911fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2912fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2913fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangAST(user_type.GetASTContext()); 2914fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangType(user_type.GetOpaqueQualType()); 2915fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2916fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 2917fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2918fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2919fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2920fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 2921fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 2922fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2923819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 2924427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 292567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const RegisterInfo *reg_info, 292667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 29271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 29281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 29291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(), 29311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 29321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 29331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 29351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2936122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen if (log) 293767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 29381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 29391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 29401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 2942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 29431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 29451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2946fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 294747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 294847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 2949427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 29501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2951427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 2952427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 2953427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2954427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 2955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2956427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2957427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 29581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 295967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 29601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2961a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 2962a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf(" FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString()); 29631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 29641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 29651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 29669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananNamespaceDecl * 296716b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::AddNamespace (NameSearchContext &context, ClangASTImporter::NamespaceMapSP &namespace_decls) 29686916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{ 296916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (namespace_decls.empty()) 297016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan return NULL; 297116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 29726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 29736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 2974e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton assert (m_parser_vars.get()); 2975e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 297616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan const ClangNamespaceDecl &namespace_decl = namespace_decls->begin()->second; 297716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 29789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(), 297916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl.GetNamespaceDecl()); 298016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 298116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl); 298216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 298316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan m_parser_vars->GetASTImporter(context.GetASTContext())->RegisterNamespaceMap(copied_namespace_decl, namespace_decls); 298416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 29859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return dyn_cast<NamespaceDecl>(copied_decl); 29866916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 29876916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 2988a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 2989da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 2990da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Function* fun, 299167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol* symbol, 299267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 29938f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 2994aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2995aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2996e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 29978f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 299858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan NamedDecl *fun_decl = NULL; 29990fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 300058baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan const Address *fun_address = NULL; 30018f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 30020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 30030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 30049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *fun_ast_context = NULL; 30058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 30060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 30070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 30090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 30110fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 301367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no type"); 30140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 30150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30160fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 301704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton fun_opaque_type = fun_type->GetClangFullType(); 30180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 30200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 302267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no Clang type"); 30230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 30240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 30270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 3028b01000fd063629facd45044f137446fb748ee179Greg Clayton fun_ast_context = fun_type->GetClangASTContext().getASTContext(); 3029ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 3030a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (copied_type) 3031a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3032a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_decl = context.AddFunDecl(copied_type); 3033a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 3034a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton else 3035a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3036a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton // We failed to copy the type we found 3037a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (log) 3038a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3039a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt", 3040a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetName().GetCString(), 3041a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetID()); 3042a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 3043a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 30440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 30460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 30470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 30480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 30490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 30500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 30510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 30528f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 3053810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 305467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" AddOneFunction called with no function and no symbol"); 30558f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 30568f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 30578f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3058567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = m_parser_vars->m_exe_ctx->GetTargetPtr(); 3059567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3060567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target); 30618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 30628f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 30638f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3064fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 306547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 306647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3067427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 30688de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 3069427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 3070427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 3071427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 3072427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3073427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 3074427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 3075427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 3076427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 30778c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3078810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 30798de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3080a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(fun_decl); 3081a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 308267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" FEVD[%u] Found %s function %s, returned %s", 308367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 308467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (fun ? "specific" : "generic"), 308567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan decl_name.c_str(), 3086a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ast_dumper.GetCString()); 30878de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 308824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 308993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 309093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 309193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 30923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 309367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id, 30943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 309593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 30969b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context = context.GetASTContext(); 30979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *user_ast_context = ut.GetASTContext(); 30983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3099ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 31003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 31013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromParser parser_type(copied_type, parser_ast_context); 310293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 31033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 31043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 31053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 31063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 31073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 31083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 31093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 31103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 31113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args, 31123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1, 31133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan false, 31143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 311530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 31161d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 31171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 31181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 311930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 312030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 31211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 31221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 31238de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 31241d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 31251d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 31261d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 31271d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 312830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 312930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit); 31303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 313193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 313293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 313393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 3134ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 3135ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid * 3136ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context, 3137ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan ASTContext *source_context, 3138ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *clang_type) 3139ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{ 3140aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 3141aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 3142aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = true; 3143ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 3144e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context); 3145e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 3146e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton QualType ret_qual_type = importer->CopyType (source_context, 3147e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton QualType::getFromOpaquePtr(clang_type)); 3148e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 3149e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton void *ret = ret_qual_type.getAsOpaquePtr(); 3150ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 3151aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = false; 3152ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 3153ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return ret; 3154ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan} 3155