ClangExpressionDeclMap.cpp revision 30a5dd5ae4ec13f07c788a488f2999e70cb75451
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangExpressionDeclMap.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h" 17a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 20810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h" 216184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 23061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h" 25f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan#include "lldb/Core/ValueObjectVariable.h" 266e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 28a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h" 29cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 316916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 41f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 42810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 4317c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 45f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 483bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5273b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) : 5373b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTSource (exe_ctx.GetTargetSP()), 548de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 558de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 56dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_keep_result_in_memory (keep_result_in_memory), 57aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 58dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_struct_vars () 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 656d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // Note: The model is now that the parser's AST context and all associated 666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // data does not vanish until the expression has been executed. This means 676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // that valuable lookup data (like namespaces) doesn't vanish, but 686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan DidParse(); 70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 74166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool 75427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 768c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 78dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx = exe_ctx; 79567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr()) 82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetThreadPtr()) 84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetProcessPtr()) 86987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 87987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 88567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 89987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (target) 91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 92987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 93567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 94987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 9597ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan 96567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 97567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_persistent_vars = &target->GetPersistentVariables(); 99166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 100567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetScratchClangASTContext()) 101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 103166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 10447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info = GetTargetInfo(); 10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 106166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan return true; 107aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 108c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 109427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 110427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 114427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (var_sp && 120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars.get() && 121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_lldb_value) 122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton delete var_sp->m_parser_vars->m_lldb_value; 123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 124427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->DisableParserVars(); 125aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 127427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 133427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->DisableParserVars(); 134aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1377a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 14247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo() 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetInfo ret; 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 149dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 150dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 151dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 152dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (process) 15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 154dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.byte_order = process->GetByteOrder(); 155dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.address_byte_size = process->GetAddressByteSize(); 156dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan } 157dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan else 158dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan { 159dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 160dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (target) 161567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 162dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.byte_order = target->GetArchitecture().GetByteOrder(); 163dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 164567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 16547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 166dd1dcfdbad297562951169ad621f895daf32b382Sean 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 191dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 192dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 193dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 194dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 195dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!target) 196dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return ClangExpressionVariableSP(); 197567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 198567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 19905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2005a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan TypeFromUser user_type(m_ast_importer->CopyType(context, 2015a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetASTContext(), 2025a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetOpaqueQualType()), 20305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 20447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 205dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!user_type.GetOpaqueQualType()) 206dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 207dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 208dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 209dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 210dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result"); 211dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 212dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 213dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 214dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 215dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (), 216fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 2170e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 21847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 21947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 2200e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 2210e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 2230e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2240e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 2250e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 22605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2270e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 2280e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 2290e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 23005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 23247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 2340e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 23505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 23705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 23905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2402bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (size_t byte_idx = 0; 24105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 24205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 24305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 24405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 24505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 24605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 24847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (m_parser_vars->m_target_info.byte_order) 24905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 2500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 2510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 2520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 2530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 2540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2550e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 2560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 2600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2610e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 2620e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 26305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 26405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 2656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2690e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2700e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 27105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 27205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 273696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP 274696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name, 2759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan VarDecl *decl, 276696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb_private::TypeFromParser type) 277696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{ 278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan assert (m_parser_vars.get()); 279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 282dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 283dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 284567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 285567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 286567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 287567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 288696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 294696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return ClangExpressionVariableSP(); 296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 2975a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan TypeFromUser user_type(m_ast_importer->CopyType(context, 2985a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetASTContext(), 2995a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetOpaqueQualType()), 300696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan context); 301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 302dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!user_type.GetOpaqueQualType()) 303dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 304dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 305dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 306dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 307dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result"); 308dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 309dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 310dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 311dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 312696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser var_type = var_sp->GetTypeFromUser(); 313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 314dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = exe_ctx.GetFramePtr(); 315567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL) 316567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 317567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 318567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type); 319696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var) 321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable 322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 323567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues); 324696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_valobj) 326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type); 329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_casted_valobj) 331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (log) 334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan { 335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan StreamString my_stream_string; 336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangASTType::DumpTypeDescription (var_type.GetASTContext(), 338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_type.GetOpaqueQualType(), 339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan &my_stream_string); 340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 341696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 342696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str()); 343696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan } 344696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 345696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj); 346696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 347696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!pvar_sp) 348696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 349696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 350696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name)) 351696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 352696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 353696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 354696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 355696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 356696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 357696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return pvar_sp; 358696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan} 359696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 36047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name) 36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference); 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj, 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ConstString &name, 372a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::TypeFromParser type, 373557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool transient, 374557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool maybe_make_load) 37547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pvar_sp) 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 382557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 383557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (maybe_make_load && 384557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.GetValueType() == Value::eValueTypeFileAddress && 385dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessPtr()) 386557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 387557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.SetValueType(Value::eValueTypeLoadAddress); 388557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 38947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 391a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !pvar_sp->m_live_sp && 392a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !transient) 39347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The reference comes from the program. We need to set up a live SP for it. 39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 396dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen unsigned long long address = value.GetScalar().ULongLong(); 397dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen AddressType address_type = value.GetValueAddressType(); 398dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen 399dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 40047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetASTContext(), 40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetOpaqueQualType(), 40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetName(), 403dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen address, 404dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen address_type, 40547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetByteSize()); 40647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 40747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry) 40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->ValueUpdated(); 41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t pvar_byte_size = pvar_sp->GetByteSize(); 41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4158f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (!ReadTarget(pvar_data, value, pvar_byte_size)) 4168f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return false; 41747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry); 41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan valobj = pvar_sp; 42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4268f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananvoid 4278f2e392e8937aaf66f91201dc5f4190d61902c67Sean CallananClangExpressionDeclMap::RemoveResultVariable 4288f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan( 4298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan const ConstString &name 4308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan) 4318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan{ 4328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 4338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan m_parser_vars->m_persistent_vars->RemovePersistentVariable(pvar_sp); 4348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan} 4358f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 4368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 4378de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 4388de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4399b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 4408de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 4448de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 445a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 446aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 447aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 4486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 449dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 450dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 451567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 452567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 453567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 455a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 4560539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan TypeFromUser user_type(m_ast_importer->DeportType(context, 4570539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetASTContext(), 4580539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetOpaqueQualType()), 45997678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 4605a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 4615a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!user_type.GetOpaqueQualType()) 4625a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 4635a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (log) 4645a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Persistent variable's type wasn't copied successfully"); 4655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 4665a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 46747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 46847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_parser_vars->m_target_info.IsValid()) 46947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 470a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 471dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (), 472fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 473427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 47447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 4768c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4778c12720c108cd5e7ed792596749218d8400f647eSean Callanan 478427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 4798c12720c108cd5e7ed792596749218d8400f647eSean Callanan 480427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 4846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 4856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 4876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 4896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 4916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 4956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 4966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 4996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 5006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 501427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableParserVars(); 5028c12720c108cd5e7ed792596749218d8400f647eSean Callanan 503427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_named_decl = decl; 504427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_parser_type = parser_type; 5058c12720c108cd5e7ed792596749218d8400f647eSean Callanan 5068c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 507a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 508a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 509a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 5108de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 5118de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 5138de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 5148de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 5158de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 5168de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 5178de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 519aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 520aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 521aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 522e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 52345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 5258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5268c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 5278c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 5288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 529427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 5308c12720c108cd5e7ed792596749218d8400f647eSean Callanan 531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 532427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 5338c12720c108cd5e7ed792596749218d8400f647eSean Callanan 534427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5368c12720c108cd5e7ed792596749218d8400f647eSean Callanan 53745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 5385a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure", 53945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 5408de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 54245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 5438c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 5448c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 545427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_llvm_value = value; 5468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 547427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableJITVars(); 548427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_alignment = alignment; 549427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_size = size; 5508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 551427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 5528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 5588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 559aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 560aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 561aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 5628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 566aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 567aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 569427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 5708c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 5718c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 5728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 573427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 574427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 575427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 576427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 577427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 5788c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5808c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 581427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment; 5828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 583427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (cursor % member_sp->m_jit_vars->m_alignment) 584427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment)); 5858c12720c108cd5e7ed792596749218d8400f647eSean Callanan 586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset = cursor; 587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += member_sp->m_jit_vars->m_size; 5888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 5898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 590aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 5918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 592aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 5938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5968de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 5978de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5988de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 5998de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 6008de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 6018de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 603aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 604aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 605aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 6068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 608427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 609aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 610aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 6118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 6168de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 6178de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *&decl, 6198de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 6208de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 6218de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 6228de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 6238de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6248bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 625aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 626aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 627aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 6288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 630427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 6318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 633427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 6348c12720c108cd5e7ed792596749218d8400f647eSean Callanan 635427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp || 636427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_parser_vars.get() || 637427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_jit_vars.get()) 6388c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 6398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 640427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton decl = member_sp->m_parser_vars->m_named_decl; 641427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = member_sp->m_parser_vars->m_llvm_value; 642427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton offset = member_sp->m_jit_vars->m_offset; 643427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 6448c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 64802fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 6498de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 6508de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6519b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 6528de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 6538de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 654ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 655427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl)); 6568c12720c108cd5e7ed792596749218d8400f647eSean Callanan 657427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 6588c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 659ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 6608c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 6618c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 662ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 663427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 6648c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 666ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 667ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 668ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void 669ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext 670ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan( 671ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan const ConstString &name, 672ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContext &sym_ctx, 673ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContextList &sc_list 674ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan) 675ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{ 676ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (sym_ctx.module_sp) 677aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 678ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 679ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (!sc_list.GetSize()) 680ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 681ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan} 682ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 683f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 6848de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 6858de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6868de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 687da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 6888de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 689f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 690aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 691aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 692aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 693dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 694dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 695f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 696567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 69778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 69878b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 699f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 700f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 701e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 702f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 703ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 704ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 705e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 706aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 707aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 708aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 709aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 7100eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan if (!strncmp(name.GetCString(), "_ZN", 3) && 7110eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan strncmp(name.GetCString(), "_ZNK", 4)) 712aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 7130eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan std::string fixed_scratch("_ZNK"); 7140eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan fixed_scratch.append(name.GetCString() + 3); 7150eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan ConstString fixed_name(fixed_scratch.c_str()); 716aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 717aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 7180eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString()); 7190eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan 7200eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list); 721aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 722aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 723aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 724aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 725f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 726f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 727f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 728e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 729f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 730da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 731f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 732f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 733da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 734f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 7350c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_so_addr = &sym_ctx.symbol->GetAddress(); 736f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 737f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 738f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 739ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 740ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 741ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 742567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton func_addr = func_so_addr->GetCallableLoadAddress (target); 743da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 744f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 745f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 746f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 747cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 74821ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type) 749c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 750c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 751c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 75221ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list); 753c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 754cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 755cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 756cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 75721ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++) 758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 761c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 7620c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddress(); 763ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 764ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 765ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return LLDB_INVALID_ADDRESS; 766ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 767cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 768cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 769cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 770cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 771cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 772cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 773cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 774cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 775cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 776cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 777cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 778cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 779cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 780cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 781cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 782cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 783cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 784cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 785cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 786cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 787cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 788cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 789cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 790cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 791cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 792cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 793cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 794cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 795cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 796cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 797cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 7983f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCClass: 7993f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCMetaClass: 8003f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCIVar: 801cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 802cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 803cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 804cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 805cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 806c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 807cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 808c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 809c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 810cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 81121ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type) 812819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 813819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 814819749647b1605f75753f625050cb240292c08b0Sean Callanan 815dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_exe_ctx.GetTargetPtr()) 816819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 817819749647b1605f75753f625050cb240292c08b0Sean Callanan 818dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), name, symbol_type); 819819749647b1605f75753f625050cb240292c08b0Sean Callanan} 820819749647b1605f75753f625050cb240292c08b0Sean Callanan 82147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter 82247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 823557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue 824557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr) 825557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{ 826557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan Value ret; 827557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 828557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 829557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 830dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (m_parser_vars->m_exe_ctx.GetProcessPtr()) 831557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 832557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 833557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeFileAddress); 834557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 835557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.GetScalar() = (unsigned long long)addr; 836557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 837557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return ret; 838557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan} 839557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 84047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 84147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value, 84247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint8_t *data, 84347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 847dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 849dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 85147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 852567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 85347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 855dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 85647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 85947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 864567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err)) 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return reg_ctx->WriteRegister(reg_info, reg_value); 86847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 877567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 880dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 88147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 883567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 88447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 886567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = file_addr.GetLoadAddress(target); 88747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 889567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory(load_addr, data, length, err); 89047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 89347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 895567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 899567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 90347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 904e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan { 905e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan if (value.GetScalar().ULongLong() == 0 || data == NULL) 906e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan return false; 907e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan memcpy ((void *)value.GetScalar().ULongLong(), data, length); 908e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan return true; 909e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan } 91047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 91147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data, 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 923dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 924567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 925dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 926567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 92747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 92847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 929567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 93047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 932dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 93347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 93647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx->ReadRegister(reg_info, reg_value)) 94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 944567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err); 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 94847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 954dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 955567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 95847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 95947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 960567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 964b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan target->ReadMemory(file_addr, false, data, length, err); 96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 96847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 970567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 974567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 97847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 9795a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 9805a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan void *host_addr = (void*)value.GetScalar().ULongLong(); 9815a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 9825a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!host_addr) 9835a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 9845a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 9855a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan memcpy (data, host_addr, length); 98647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 9875a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 98847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 98947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 99147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 99347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value 99552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags) 99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 998dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 99947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl)); 100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl)); 10011c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 100247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (expr_var_sp) 100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 100452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan flags = expr_var_sp->m_flags; 100552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 1006b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!expr_var_sp->m_parser_vars.get()) 10076d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan return Value(); 10086d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 10091c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference; 1010b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1011b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (expr_var_sp->m_parser_vars->m_lldb_var) 10121c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan { 1013dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan std::auto_ptr<Value> value(GetVariableValue(expr_var_sp->m_parser_vars->m_lldb_var, NULL)); 10141c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1015b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 1016b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 1017dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1018b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1019b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!process) 1020b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return Value(); 1021b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1022b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 1023b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan Error read_error; 1024b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error); 1025b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1026b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!read_error.Success()) 1027b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return Value(); 1028b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1029b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan value->GetScalar() = (unsigned long long)ref_value; 1030b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 1031b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1032b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (value.get()) 1033b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return *value; 1034b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan else 10351c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 1036b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 1037b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan else if (expr_var_sp->m_parser_vars->m_lldb_sym) 1038b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 10390c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton const Address sym_address = expr_var_sp->m_parser_vars->m_lldb_sym->GetAddress(); 10401c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1041b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!sym_address.IsValid()) 10421c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 1043b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1044b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan Value ret; 1045b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 10466cdedde154e8b95758596775463a086352baee63Sean Callanan ProcessSP process_sp (m_parser_vars->m_exe_ctx.GetProcessSP()); 10476cdedde154e8b95758596775463a086352baee63Sean Callanan 10486cdedde154e8b95758596775463a086352baee63Sean Callanan if (process_sp) 10496cdedde154e8b95758596775463a086352baee63Sean Callanan { 10506cdedde154e8b95758596775463a086352baee63Sean Callanan uint64_t symbol_load_addr = sym_address.GetLoadAddress(&process_sp->GetTarget()); 10516cdedde154e8b95758596775463a086352baee63Sean Callanan 10526cdedde154e8b95758596775463a086352baee63Sean Callanan ret.GetScalar() = symbol_load_addr; 10536cdedde154e8b95758596775463a086352baee63Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 10546cdedde154e8b95758596775463a086352baee63Sean Callanan } 10556cdedde154e8b95758596775463a086352baee63Sean Callanan else 10566cdedde154e8b95758596775463a086352baee63Sean Callanan { 10576cdedde154e8b95758596775463a086352baee63Sean Callanan uint64_t symbol_file_addr = sym_address.GetFileAddress(); 10586cdedde154e8b95758596775463a086352baee63Sean Callanan 10596cdedde154e8b95758596775463a086352baee63Sean Callanan ret.GetScalar() = symbol_file_addr; 10606cdedde154e8b95758596775463a086352baee63Sean Callanan ret.SetValueType(Value::eValueTypeFileAddress); 10616cdedde154e8b95758596775463a086352baee63Sean Callanan } 10621c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1063b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return ret; 10641c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan } 106552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo()) 106652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan { 106752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 106852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 106952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (!frame) 107052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return Value(); 107152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 107252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan RegisterContextSP reg_context_sp(frame->GetRegisterContextSP()); 107352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 107452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan RegisterValue reg_value; 107552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 107652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (!reg_context_sp->ReadRegister(reg_info, reg_value)) 107752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return Value(); 107852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 107952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan Value ret; 108052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 108152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan ret.SetContext(Value::eContextTypeRegisterInfo, reg_info); 108252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (!reg_value.GetScalarValue(ret.GetScalar())) 108352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return Value(); 108452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 108552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return ret; 108652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan } 10874b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 1088b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 10894b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 1090b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 109147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 109247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else if (persistent_var_sp) 109347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 109452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan flags = persistent_var_sp->m_flags; 109552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 1096a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference || 1097a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) && 109886a07da76f615533a06a797dc4539566951b58d3Sean Callanan persistent_var_sp->m_live_sp && 1099f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress && 1100dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessSP() && 1101dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessSP()->IsAlive()) || 1102f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress))) 1103a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 11044b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return persistent_var_sp->m_live_sp->GetValue(); 1105a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 1106a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan else 1107a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 1108a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::Value ret; 1109a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetValueType(Value::eValueTypeHostAddress); 1110a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 1111a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes(); 1112a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return ret; 1113a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 111447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 111547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 111647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 111747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Value(); 111847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 111947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 112047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11214b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue 11224b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name) 11234b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{ 11244b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan assert(m_parser_vars.get()); 11254b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1126dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 11274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11284b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!frame) 11294b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11304b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11314b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan VariableList *vars = frame->GetVariableList(false); 11324b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11334b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!vars) 11344b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11364b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::VariableSP var = vars->FindVariable(name); 11374b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!var || 11394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->IsInScope(frame) || 11404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->LocationIsValidForFrame (frame)) 11414b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11424b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1143dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan std::auto_ptr<Value> value(GetVariableValue(var, NULL)); 11444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 114541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 114641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan { 1147dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 114841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 114941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (!process) 115041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan return Value(); 115141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 115241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 115341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan Error read_error; 115441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error); 115541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 115641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (!read_error.Success()) 115741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan return Value(); 115841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 115941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan value->GetScalar() = (unsigned long long)ptr_value; 116041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan } 116141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 11624b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (value.get()) 11634b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return *value; 11644b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 11654b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11664b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan} 11674b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1168810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 1169f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1170f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 11718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 11728de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 11738de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 11748de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 11758de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1176f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1177dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars.get()) 1178dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return false; 1179dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 1180aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 1181aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1182dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_material_vars->m_process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1183aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 11840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan bool result = DoMaterialize(false /* dematerialize */, 11850ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* top of stack frame */, 11860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* bottom of stack frame */, 11870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan NULL, /* result SP */ 11880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan err); 1189f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1190f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 1191aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 1192f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1193f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 1194f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1195f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1196f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 11978de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 11988de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 11998de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 12003aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 1201047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 1202047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 12038de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 12043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 1205aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1206aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1207dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1208dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1209dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1210567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1211567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL || process == NULL || target == NULL) 12123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1213e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString()); 12143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1217aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 12183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1219e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString()); 12203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 122370c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan const bool ignore_const = true; 122470c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan 1225567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP object_ptr_var = FindVariableInScope (*frame, 1226696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 122770c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type), 122870c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan ignore_const); 12293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 12313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1232e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString()); 12333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1236dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(object_ptr_var, 1237aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 12383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 12403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 12413aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 12423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 124550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 12463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 124750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 124850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 124950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 125050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 12513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 125250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 1253567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize(); 125450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 125550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 125650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 125750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 125850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 125950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 126050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 126150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 126250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 1263567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton object_ptr = process->ReadPointerFromMemory (value_addr, read_error); 1264c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS) 126550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 126650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 126750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 1268c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 126950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 12703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 127150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 12723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 127350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 127450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 127550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 127650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 127750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 127850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 127950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 128050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 128150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1282061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 128350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1284061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 128550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 128650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 128750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 128850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 128950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1290dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 129150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1292061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 129350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 1294061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 129550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 129650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 129750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1298061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 129950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1300061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 130150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 130250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 13033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 13043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 13053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 13063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 13073c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 13088de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 13098de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1310427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 13110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 13120ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 13138de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13148de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1315f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1316dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return DoMaterialize(true, stack_frame_top, stack_frame_bottom, &result_sp, err); 1317aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1318aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 1319aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 1320aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1321aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 1322aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 1323aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1324aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 1325aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1326aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1327aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1328aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 1329aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1330aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 1331aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 1332aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 1333aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1334aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1335aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1336aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 1337aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1338f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1339f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 134032824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 13418de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 13428de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 13438de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 13448de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13458de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 134632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 1347aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1348aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 1349aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1350aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 135132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 135232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 135332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 135432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 1355dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1356567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1357567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 135832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 135932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 136032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 136132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 136232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1363dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1364567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 136532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 136632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 136732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 136832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 136932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 13703371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 13713371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 13723371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 13733371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 13743371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 13753371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 1376c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 137732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 137832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 1379567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (m_material_vars->m_materialized_location, 1380c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetBytes(), 1381c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetByteSize(), error) != data_sp->GetByteSize()) 138232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 138332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 138432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 138532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 138632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1387567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize()); 138832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 1390427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 1391427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 139232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 1393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 139432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1395427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 1396427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 1397427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1398427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 13998c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1400427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 14018c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 14028c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1403427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 1404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 1405427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 1406427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 1407427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 1408427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 1409427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 1410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 1411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 141232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 141332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 141432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 141532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 141632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 141732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 141832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1419f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 14208de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 14218de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 14228de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 14230ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 14240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 1425427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 14268de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 14278de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1428810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 1429427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 1430427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 1431427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1432aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1433aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1434e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 143582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 1436aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 1437810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1438810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 143957067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 1440810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1441810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1442dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1443567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 144445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 144545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 144657067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 144745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 1448dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 144945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 1450567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangPersistentVariables &persistent_vars = target->GetPersistentVariables(); 1451aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1452aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 1453e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 1454e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 1455e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 1456e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 14579b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_material_vars->m_allocated_area = NULL; 1458e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1459e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 1460e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 1461e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1462567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything)); 1463810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1464f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 1465f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1466dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1467aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1468f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1469567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->DeallocateMemory(m_material_vars->m_materialized_location); 1470aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1471f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1472810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 14737a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 14747a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 14757a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 1476567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 14775a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 14785a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err); 1479f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1480f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 14815a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 14825a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct", 14835a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size)); 1484f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 14855a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 14865a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 1487aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 1488f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1489810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1490aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 1491810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1492aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 1493aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 1494810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1495427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 14968c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 14978c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 1498810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1499427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 15004d0b110715d321d366dec1dc690300f713b63236Sean Callanan 1501a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 1502336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 1503a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 1504427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 15051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 15061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 15071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1508dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 15091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 15115a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 15125a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Couldn't get register context"); 15131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15145a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 15155a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 1516427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 1517427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 1518427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 1519427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1520427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 15211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 15241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1525427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 15265a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 15275a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Variable being materialized doesn't have necessary state"); 15281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15295a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 15301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1531427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 15326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 15336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 1534427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1535427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 15361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15388c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1539a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 15408c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 1541a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 1542a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 1543a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 154445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 15456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1546a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 1547a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1548a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 1549a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 15506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1551a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 1552a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 15536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1554a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 1555a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 1556a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 1557a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 15580ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 15590ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_top, 15600ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom, 1561a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 1562a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 1563f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1564a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 1565a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1566a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 15678c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1568a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 15698c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1570810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1571810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1572f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1573f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1574f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1575a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 15768de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 15778de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 15788de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 1579427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 15808de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 15810ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 15820ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 15838de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 15848de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1585aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 15866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 15876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1588427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1589a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1591a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1592a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1593a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1594427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1595a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1596427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1597427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 15985a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 15995a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Persistent variable being materialized contains no data"); 1600a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 16015a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 1602a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1603a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1604dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1605567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 16066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 16076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1608a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1609a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 16106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 16116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 16126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 16146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 16156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 16176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 1619567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->ReadPointerFromMemory (addr, read_error); 16206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 16226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 16246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 16286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 16296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 16316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 16326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1633dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 163447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 163547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 163647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 163747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 163847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 163947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 16406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 16436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 16456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1648b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 16496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 16516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 165497678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 165597678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 16566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 16586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 16630ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 1665567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 16666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 16686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16710ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan if (stack_frame_top != LLDB_INVALID_ADDRESS && 16720ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom != LLDB_INVALID_ADDRESS && 16730ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem >= stack_frame_bottom && 16740ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem <= stack_frame_top) 16750ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 16760ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // If the variable is resident in the stack frame created by the expression, 16770ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // then it cannot be relied upon to stay around. We treat it as needing 16780ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // reallocation. 16790ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16800ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 16810ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 16820ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; 16830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 16840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 16866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 16896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 16906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 16926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 16946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 16966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1697567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(mem); 16986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 17006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 17026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1708a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1710a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1711a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1712a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1713a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1714a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 17166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 17176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 17196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 17216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 17236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1724567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->AllocateMemory(pvar_byte_size, 17254b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 17264b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan allocate_error); 17276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 17296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 17316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 17356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 17366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 17386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1739dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 174047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 174147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 174247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 174347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 174447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 174547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 17466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 17486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 17506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 17516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 17536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1754567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 17556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 17576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 17626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 17636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 17656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1766567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 17674b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan var_sp->m_live_sp->GetValue().GetScalar(), 17684b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan process->GetAddressByteSize(), 17694b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan write_error)) 17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1776c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong()); 17776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1778696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1779a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1781a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1782a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1783a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1784a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1785a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1786a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1787a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1788f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 17898de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 17908de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 17918de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 17928de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 17936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 17948de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 17958de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 17968de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1797f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1798e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1799dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1800dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1801dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1802567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 18036d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get()) 18045a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 18055a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Necessary state for variable materialization isn't present"); 1806cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 18075a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 1808cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 18096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 18106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 18126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 18136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18144a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var(expr_var->m_parser_vars->m_lldb_var); 18154a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym); 1816f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 18176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference); 18186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 1819819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 18204a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1821819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1822819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1823dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan location_value.reset(GetVariableValue(var, 1824819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1825819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1826819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym) 18274a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan { 182821ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny); 1829819749647b1605f75753f625050cb240292c08b0Sean Callanan 1830cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (location_load_addr == LLDB_INVALID_ADDRESS) 1831819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1832819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1833c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s", 1834c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1835819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1836819749647b1605f75753f625050cb240292c08b0Sean Callanan 18374a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan location_value.reset(new Value); 18384a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1839819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1840819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1841819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1842819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1843f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type", 1845c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1846f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1847f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1848f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1849841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 1850fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1851fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan StreamString my_stream_string; 1852fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1853fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangASTType::DumpTypeDescription (type.GetASTContext(), 1854fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan type.GetOpaqueQualType(), 1855fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan &my_stream_string); 1856fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1857c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf ("%s %s with type %s", 1858c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton dematerialize ? "Dematerializing" : "Materializing", 1859c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1860c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton my_stream_string.GetString().c_str()); 1861fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1862f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1863f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1864f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 18658de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1866f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1867f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 186817c6a05cb96f7110332342326a90692d9505982eSean Callanan 186917c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1870f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 18716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 18726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 187317c6a05cb96f7110332342326a90692d9505982eSean Callanan 187417c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 187517c6a05cb96f7110332342326a90692d9505982eSean Callanan 187617c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1877f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 187817c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1879f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 188017c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 188117c6a05cb96f7110332342326a90692d9505982eSean Callanan 188217c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 188317c6a05cb96f7110332342326a90692d9505982eSean Callanan 1884c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s", 1885c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1886c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 188717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1888f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 188917c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 189017c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1891f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 18926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 189317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1894c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error write_error; 18956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 18976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 18986f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error read_error; 18996f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19006f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error); 19016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!read_error.Success()) 19036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19046f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s", 19056f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan read_error.AsCString()); 19076f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19106f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WritePointerToMemory(addr, 19116f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan ref_value, 19126f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 19136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19146f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 19156f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19166f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 19176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19196f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19206f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 19216f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19226f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WriteScalarToMemory (addr, 19236f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan location_value->GetScalar(), 19246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 19256f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 19266f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19276f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 19286f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19296f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 19306f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19316f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 193317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1934f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 193517c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 193617c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1937f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 19386916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 193917c6a05cb96f7110332342326a90692d9505982eSean Callanan { 194017c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 194117c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 194217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1943c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s", 1944c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1945c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 194617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 194717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 194817c6a05cb96f7110332342326a90692d9505982eSean Callanan 1949061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 195017c6a05cb96f7110332342326a90692d9505982eSean Callanan 1951061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 195217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1953c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't get the register information for %s", 1954c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 195517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 195617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 195717c6a05cb96f7110332342326a90692d9505982eSean Callanan 1958061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1959061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1960dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 1961061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1962061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 196317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1964c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s", 1965c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1966c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 196717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 196817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 196917c6a05cb96f7110332342326a90692d9505982eSean Callanan 1970061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 197117c6a05cb96f7110332342326a90692d9505982eSean Callanan 197217c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 197317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 19746f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 19756f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; // reference types don't need demateralizing 19766f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 19786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 19806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 19816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 19826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 19846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1985b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 19866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 19876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 19886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 19906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1991c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar ®_addr = expr_var->m_live_sp->GetValue().GetScalar(); 199217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1993c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, 1994c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1995c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1996c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1997061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 199817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1999061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2000061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 200117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2002c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to register %s", 2003c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2004c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 200517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 200617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 20076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 20096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2010567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong()); 20116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 20136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2014c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s", 2015c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2016c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton deallocate_error.AsCString()); 20176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 202117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 202217c6a05cb96f7110332342326a90692d9505982eSean Callanan else 202317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 20246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error write_error; 20256f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20266f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan RegisterValue reg_value; 20276f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20286f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!reg_ctx->ReadRegister (reg_info, reg_value)) 20296f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20306f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read %s from %s", 20316f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 20326f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name); 20336f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 20346f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20366f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 20376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20386f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error = reg_ctx->WriteRegisterValueToMemory(reg_info, 20396f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr, 20406f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 20416f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_value); 20426f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20436f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!write_error.Success()) 20446f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20456f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s", 20466f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 20476f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name, 20486f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 20496f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 20506f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; 20536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20546f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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 20566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 20576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 20596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2060567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Scalar reg_addr (process->AllocateMemory (value_byte_size, 20616f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 20626f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan allocate_error)); 20636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2064c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS) 20656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2066c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s", 2067c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2068c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error.AsCString()); 20696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 20736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2074dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan expr_var->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 207547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 207647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 207747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 2078c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 207947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 208047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 20816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 20836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 2084567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 20856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_addr, 20866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 20876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 20886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2089c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 2090c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2091c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 20926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 209617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2097c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is too big to store in %s", 2098c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2099c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 210017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 210117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 2102061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2103061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 210417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2105c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from %s", 2106c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2107c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 210817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 210917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 211017c6a05cb96f7110332342326a90692d9505982eSean Callanan 2111c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->WriteRegisterValueToMemory (reg_info, 2112c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 2113c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 2114c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 2115061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 211617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 211717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 2118f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2119f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2120f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 2121f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 2122810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 2123810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 21241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 21251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 21261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 21271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 21281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 2129b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 21301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 21311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 21321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 21331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 21341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 2135061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 21361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 21371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2138061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 2139061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 21401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2141bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 21421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2145061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 21461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2147061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 21481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 21521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 21531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2154061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 21551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2156061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 21571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2160061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 2161061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 21621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 216395b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString()); 21641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 21691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 21701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2171696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 21728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 21738de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 21748de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 21758de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 217670c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan TypeFromUser *type, 217770c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan bool ignore_const 21788de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 2179aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 2180e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2181cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 2182f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan ValueObjectSP valobj; 2183f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan VariableSP var_sp; 2184f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan Error err; 2185f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan 2186f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan valobj = frame.GetValueForVariableExpressionPath(name.GetCString(), 2187f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan eNoDynamicValues, 2188f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 2189f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan var_sp, 2190f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan err); 21913bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2192f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan if (!err.Success() || 2193f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan !var_sp || 2194ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->IsInScope(&frame) || 2195ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->LocationIsValidForFrame (&frame)) 2196ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return lldb::VariableSP(); 21973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 21983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 21993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 22003bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 22013bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 220270c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan if (!ClangASTContext::AreTypesSame(type->GetASTContext(), 220370c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan type->GetOpaqueQualType(), 220470c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan var_sp->GetType()->GetClangFullType(), 220570c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan ignore_const)) 2206696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 22073bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 22083bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 22093bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 22103bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 22113bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 2212696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 22133bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 22143bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 22153bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2216696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return var_sp; 2217cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 2218336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2219819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol * 2220819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol 2221819749647b1605f75753f625050cb240292c08b0Sean Callanan( 2222819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 2223aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan const ConstString &name 2224819749647b1605f75753f625050cb240292c08b0Sean Callanan) 2225819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2226819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 2227819749647b1605f75753f625050cb240292c08b0Sean Callanan 2228aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, 2229aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan eSymbolTypeData, 2230aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sc_list); 2231819749647b1605f75753f625050cb240292c08b0Sean Callanan 2232819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 2233819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2234819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 2235819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 2236819749647b1605f75753f625050cb240292c08b0Sean Callanan 2237819749647b1605f75753f625050cb240292c08b0Sean Callanan return sym_ctx.symbol; 2238819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2239819749647b1605f75753f625050cb240292c08b0Sean Callanan 2240819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 2241819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2242819749647b1605f75753f625050cb240292c08b0Sean Callanan 224347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP 224447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable 224547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan( 224647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target &target, 224794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ModuleSP &module, 224894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan const ConstString &name, 224994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ClangNamespaceDecl *namespace_decl, 225047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser *type 225147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan) 225247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 225347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList vars; 225447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 225594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan if (module && namespace_decl) 225694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module->FindGlobalVariables (name, namespace_decl, true, -1, vars); 225794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan else 225894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan target.GetImages().FindGlobalVariables(name, true, -1, vars); 225947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 226047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (vars.GetSize()) 226147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 226247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type) 226347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 226447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < vars.GetSize(); ++i) 226547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 226647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableSP var_sp = vars.GetVariableAtIndex(i); 226747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 226847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 226947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 227047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 227147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return var_sp; 227247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 227347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 227447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 227547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 227647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 227747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return vars.GetVariableAtIndex(0); 227847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 227947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 228047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 228147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return VariableSP(); 228247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 228347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 228547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 228616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 2287f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context) 228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2289f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 2290f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2291f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 2292f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2293e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22959394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (GetImportInProgress()) 2296ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 229767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 2298ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 2299ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 2300ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 2301e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 230267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan static unsigned int invocation_id = 0; 230367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id = invocation_id++; 230467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan 230516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 230616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 230716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (!context.m_decl_context) 23089394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString()); 230916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context)) 23109394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str()); 231116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 23129394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName()); 231316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 23149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 231516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context)) 231616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 231773b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context); 2318a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 231967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 23205a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", 232167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 232267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan namespace_map.get(), 232367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (int)namespace_map->size()); 2324a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2325a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan if (!namespace_map) 2326a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan return; 2327a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan 232816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); 232916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i != e; 233016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ++i) 233116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 233216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 23339394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", 233467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 233516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->second.GetNamespaceDecl()->getNameAsString().c_str(), 233616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->first->GetFileSpec().GetFilename().GetCString()); 233716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 2338c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan FindExternalVisibleDecls(context, 2339c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->first, 2340c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->second, 234167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 234216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 234316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2344e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan else if (isa<TranslationUnitDecl>(context.m_decl_context)) 234516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 234616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangNamespaceDecl namespace_decl; 234716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 234816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 23499394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id); 235016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 235116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan FindExternalVisibleDecls(context, 235216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP(), 235316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl, 235467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 235516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2356a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 23579394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (!context.m_found.variable) 23589394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan ClangASTSource::FindExternalVisibleDecls(context); 235916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan} 236016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 236116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 236216b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, 236338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan lldb::ModuleSP module_sp, 236403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl &namespace_decl, 236567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 236616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{ 2367f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 236816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 236916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 23709394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 2371e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23739394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 23749394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 23753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 23763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 23773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 23783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 23799394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 23808f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString id_name("id"); 23818f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString Class_name("Class"); 23828f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 23838f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (name == id_name || name == Class_name) 23848f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return; 23858f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 23868de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 23878de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 2388dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 2389dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 239003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (name_unique_cstr[0] == '$' && !namespace_decl) 23913cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 239257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 239347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 239457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 239557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 239657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 239775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 239875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (frame == NULL) 239947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 240047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 240175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 240257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 240375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!sym_ctx.function) 240457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 240557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 240675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan clang::DeclContext *decl_context; 240757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 240875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (sym_ctx.block && sym_ctx.block->GetInlinedFunctionInfo()) 240975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan decl_context = sym_ctx.block->GetClangDeclContextForInlinedFunction(); 241075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan else 241175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan decl_context = sym_ctx.function->GetClangDeclContext(); 241257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 241375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!decl_context) 241457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 241557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 241675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context); 241757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 241875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!method_decl) 241957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 242057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 242175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan clang::CXXRecordDecl *class_decl = method_decl->getParent(); 2422c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 242375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan QualType class_qual_type(class_decl->getTypeForDecl(), 0); 2424c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 242575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(), 242675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan &class_decl->getASTContext()); 242703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 24283aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 24293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 243075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan ASTDumper ast_dumper(class_qual_type); 24319394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString()); 24323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 24333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2434e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan AddOneType(context, class_user_type, current_id, true); 243557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2436bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan if (method_decl->isInstance()) 2437bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan { 2438bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan // self is a pointer to the object 2439bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2440bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type); 2441bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2442bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(), 2443bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan &method_decl->getASTContext()); 2444bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2445bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 2446bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan } 2447bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 244857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 244957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 245057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 24513aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 24523aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 24533aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 24543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 24553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2456567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 245747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 2458e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2459e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 246047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2461e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!sym_ctx.function) 2462e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 246303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2464e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan clang::DeclContext *decl_context; 2465e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2466e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (sym_ctx.block && sym_ctx.block->GetInlinedFunctionInfo()) 2467e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan decl_context = sym_ctx.block->GetClangDeclContextForInlinedFunction(); 2468e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan else 2469e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan decl_context = sym_ctx.function->GetClangDeclContext(); 2470e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2471e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!decl_context) 24723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 247303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2474e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context); 2475e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2476e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!method_decl) 2477e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 2478e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2479e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan ObjCInterfaceDecl* self_interface = method_decl->getClassInterface(); 2480e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2481e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!self_interface) 2482e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 2483e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2484e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan const clang::Type *interface_type = self_interface->getTypeForDecl(); 2485e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2486e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(), 2487e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan &method_decl->getASTContext()); 2488e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2489e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (log) 2490e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan { 2491e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan ASTDumper ast_dumper(interface_type); 2492e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 2493e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan } 2494e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2495e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan AddOneType(context, class_user_type, current_id, false); 2496e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 249775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan#if 0 2498e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan VariableList *vars = frame->GetVariableList(false); 2499e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 25003aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 250103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 250275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (self_var && 250375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan self_var->IsInScope(frame) && 250475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan self_var->LocationIsValidForFrame (frame)) { 250575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan Type *self_type = self_var->GetType(); 250675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 250775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!self_type) 250875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan return; 250975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 251075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan TypeFromUser self_user_type(self_type->GetClangFullType(), 251175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan self_type->GetClangAST()); 251275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 251375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan#endif 25143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 251575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (method_decl->isInstanceMethod()) 251675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan { 251775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan // self is a pointer to the object 251875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 251975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0)); 252003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 252175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(), 252275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan &method_decl->getASTContext()); 25233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 252475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 252575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 252675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan else 252775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan { 252875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan // self is a Class pointer 252975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan QualType class_type = method_decl->getASTContext().getObjCClassType(); 253075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 253175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan TypeFromUser self_user_type(class_type.getAsOpaquePtr(), 253275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan &method_decl->getASTContext()); 253375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 253475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 253575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 253675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 25373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 25383aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 2539c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan 2540c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan // any other $__lldb names should be weeded out now 2541c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) 2542c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan return; 254303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 25442431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan do 25452431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan { 2546567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 25472431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25482431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2549567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); 25502431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25512431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_clang_ast_context) 25522431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25532431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25542431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 25552431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25562431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_ast_context) 25572431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25582431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25592431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); 256003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 25612431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!ptype_type_decl) 25622431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25632431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2564e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl); 25652431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25662431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_decl) 25672431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25682431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25692431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); 25702431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25712431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_type_decl) 25722431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25732431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25742431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (log) 25759394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString()); 25762431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 25772431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan context.AddNamedDecl(parser_ptype_type_decl); 25782431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan } while (0); 25792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2580427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 258103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2582427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 25831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 258467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, pvar_sp, current_id); 25851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 25861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 25871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 25881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 25891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2590dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (m_parser_vars->m_exe_ctx.GetRegisterContext()) 25911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2592dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name)); 25939394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 25941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 2595e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan { 2596e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (log) 25979394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name); 2598e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 259967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneRegister(context, reg_info, current_id); 2600e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan } 26011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 26028de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 260303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 260403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 260503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ValueObjectSP valobj; 260603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan VariableSP var; 260703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Error err; 260803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 260903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (frame && !namespace_decl) 261003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 261103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr, 261203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan eNoDynamicValues, 261303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 261403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan var, 261503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan err); 261603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 261703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // If we found a variable in scope, no need to pull up function names 261803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (err.Success() && var != NULL) 261903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 262089e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 262116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 26223a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan return; 262303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 262403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 26251c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan 26261c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan if (target) 262703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 262894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan var = FindGlobalVariable (*target, 262938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp, 263094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan name, 263194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan &namespace_decl, 263203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NULL); 263303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 263403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (var) 263503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2636f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan valobj = ValueObjectVariable::Create(target, var); 263789e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 263816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 26391c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan return; 264003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 264103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 264203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 264316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 264403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2645302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan const bool include_inlines = false; 264603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool append = false; 2647a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 264838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (namespace_decl && module_sp) 2649a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 265051cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan const bool include_symbols = false; 265151cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan 265238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp->FindFunctions(name, 265338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan &namespace_decl, 265438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan eFunctionNameTypeBase, 265538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan include_symbols, 2656302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 265738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan append, 265838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan sc_list); 2659a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2660647fefd71c4364342aa116e45418592667fb8265Sean Callanan else if (!namespace_decl) 2661a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 266251cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan const bool include_symbols = true; 266351cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan 2664a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan target->GetImages().FindFunctions(name, 2665a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan eFunctionNameTypeBase, 2666a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 2667302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 2668a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 2669a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 2670a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2671a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 267203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sc_list.GetSize()) 267303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 267403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *generic_symbol = NULL; 267503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *non_extern_symbol = NULL; 267603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 267703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 267803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan index < num_indices; 267903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++index) 268003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 268103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext sym_ctx; 268203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 268303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 268403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.function) 268503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 268603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // TODO only do this if it's a C function; C++ functions may be 268703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // overloaded 268816c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 268967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction(context, sym_ctx.function, NULL, current_id); 269016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function_with_type_info = true; 269116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 269203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 269303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (sym_ctx.symbol) 269403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 269503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.symbol->IsExternal()) 269603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan generic_symbol = sym_ctx.symbol; 269703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 269803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan non_extern_symbol = sym_ctx.symbol; 269903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 270003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 270103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 270216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 270303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 270403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (generic_symbol) 270503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 270667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, generic_symbol, current_id); 270716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 270803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 270903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (non_extern_symbol) 271003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 271167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, non_extern_symbol, current_id); 271216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 271303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 271403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 271503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 271603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2717647fefd71c4364342aa116e45418592667fb8265Sean Callanan if (!context.m_found.variable && !namespace_decl) 271803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 271916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic 272003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 272103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2722aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan Symbol *data_symbol = FindGlobalDataSymbol(*target, name); 272303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 272403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (data_symbol) 272503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 272667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneGenericVariable(context, *data_symbol, current_id); 272716c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 272803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 272903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 273003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 2731b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan } 273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2733e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 273469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callananstatic clang_type_t 273569716a233f3240978bdbd7a8b682b31e7e07e498Sean CallananMaybePromoteToBlockPointerType 273669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan( 273769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan ASTContext *ast_context, 273869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan clang_type_t candidate_type 273969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan) 274069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan{ 274169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!candidate_type) 274269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 274369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 274469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type); 274569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 274669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type); 274769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 274869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!candidate_pointer_type) 274969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 275069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 275169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType pointee_qual_type = candidate_pointer_type->getPointeeType(); 275269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 275369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type); 275469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 275569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_type) 275669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 275769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 275869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan RecordDecl *pointee_record_decl = pointee_record_type->getDecl(); 275969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 276069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_decl->isRecord()) 276169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 276269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 276369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_"))) 276469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 276569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 276669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy); 276769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type); 276869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 276969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return block_pointer_type.getAsOpaquePtr(); 277069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan} 277169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 2772336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 27738de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 27748de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 27754a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var, 27769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context, 27778de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 27788de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 27798de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 278024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2781e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 27826184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 278324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 278424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 278524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 278624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2787810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2788810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 2789336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 279024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 279124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 279324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 279524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2796810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2797810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 2798336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 279924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 280024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 280224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2803b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 280424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2805810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2806810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 2807336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 280824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 280969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 281069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan var_opaque_type = MaybePromoteToBlockPointerType (ast, var_opaque_type); 281124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2812336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 2813336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 281424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 281524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2816178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 2817178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 2818dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 2819567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2820178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 2821178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 2822178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 2823178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 2824567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target); 2825178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 282624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2828dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!var_location_expr.Evaluate(&m_parser_vars->m_exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 282924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2830810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2831810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 2832336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 283324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2834b01000fd063629facd45044f137446fb748ee179Greg Clayton 283558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *type_to_use = NULL; 2836336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2837f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 2838f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 2839b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 2840f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 28414b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 28424b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 28434b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 28444b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 28454b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 28464b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 28474b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 28484b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 2849f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 2850f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 2851f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2852336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 2853336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 285424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 28566916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 285924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 286024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 2862336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 286324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 2864336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 286524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 286824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 2869336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 2870336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 287124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 287224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2873567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 287547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 287647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 287747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->GetScalar() = load_addr; 287847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->SetValueType(Value::eValueTypeLoadAddress); 287947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 288024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 288124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2882f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 2883b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 2884336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2885336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 2886336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 2887336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2888336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 288989e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id) 2890336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 2891aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2892aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2893e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 289447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2895f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 2896f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 2897336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2898dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Value *var_location = GetVariableValue (var, 2899f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context, 29008de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 29018de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 2902336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2903e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType()); 2904e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan 290530a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan if (parser_opaque_type.isNull()) 290630a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan return; 290730a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan 2908e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) 2909e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan { 2910e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan if (const TagType *tag_type = dyn_cast<TagType>(parser_type)) 2911e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan CompleteType(tag_type->getDecl()); 2912e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan } 2913e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan 29144b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 29154b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 29164b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 29176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan NamedDecl *var_decl; 29186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 29196f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType()); 29206f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 29216f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 29226f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); 29236f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 29246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 29256f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 29268de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2927427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 292889e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj)); 292989e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan 2930427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 2931427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2932427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 2933427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2934427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2935427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 2936696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan entity->m_parser_vars->m_lldb_var = var; 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29386f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 29396f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan entity->m_flags |= ClangExpressionVariable::EVTypeIsReference; 29406f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 2941810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 29428de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2943aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan ASTDumper orig_dumper(ut.GetOpaqueQualType()); 2944a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 2945aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString()); 29468de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 29478f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 29488f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 29498f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 2950a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 295167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan ClangExpressionVariableSP &pvar_sp, 295267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 2953a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 2954e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 295545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 2956427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 2957a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2958f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (GuardedCopyType(m_ast_context, 2959427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 2960427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 2961f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 2962a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2963dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!parser_type.GetOpaqueQualType()) 2964dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 2965dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 2966dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString()); 2967dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 2968dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 2969dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 29706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 29718c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2972427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 2973427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 2974427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 2975427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 2976427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 297745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 297845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 2979a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 2980a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 29819394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString()); 2982a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 2983a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 2984a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 29851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 2986819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 298767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol &symbol, 298867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 2989819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2990819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 2991819749647b1605f75753f625050cb240292c08b0Sean Callanan 2992819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2993819749647b1605f75753f625050cb240292c08b0Sean Callanan 2994dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 2995567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2996567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 2997567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return; 2998567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2999567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 3000819749647b1605f75753f625050cb240292c08b0Sean Callanan 3001fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)), 3002819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 3003819749647b1605f75753f625050cb240292c08b0Sean Callanan 3004f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)), 3005f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 3006819749647b1605f75753f625050cb240292c08b0Sean Callanan 3007fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 3008819749647b1605f75753f625050cb240292c08b0Sean Callanan 3009819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 3010819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 3011dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 3012819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 3013819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 301447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 301547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3016819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 3017819749647b1605f75753f625050cb240292c08b0Sean Callanan 3018819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 3019819749647b1605f75753f625050cb240292c08b0Sean Callanan 30200c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton Address &symbol_address = symbol.GetAddress(); 3021567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 3022819749647b1605f75753f625050cb240292c08b0Sean Callanan 3023819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 3024819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 3025819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 3026819749647b1605f75753f625050cb240292c08b0Sean Callanan 3027fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->EnableParserVars(); 3028819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 3029819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_named_decl = var_decl; 3030819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_llvm_value = NULL; 3031819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_value = symbol_location.release(); 3032819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_sym = &symbol; 3033819749647b1605f75753f625050cb240292c08b0Sean Callanan 3034819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 3035819749647b1605f75753f625050cb240292c08b0Sean Callanan { 3036a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 3037819749647b1605f75753f625050cb240292c08b0Sean Callanan 30389394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 3039819749647b1605f75753f625050cb240292c08b0Sean Callanan } 3040819749647b1605f75753f625050cb240292c08b0Sean Callanan} 3041819749647b1605f75753f625050cb240292c08b0Sean Callanan 3042fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 3043fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 3044fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 3045fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3046dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3047567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3048567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 3049fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3050fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 3051fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 3052fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 3053fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3054fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 3055fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3056fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 3057fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3058fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl; 3059fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 3060fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3061fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 3062fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3063fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 3064fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 3065fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 3066fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3067fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3068fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 3069fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3070a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl)); 3071a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString()); 3072fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3073fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3074fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 3075fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 3076fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 30775a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 3078fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3079dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 3080dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3081dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3082dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable"); 3083dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3084dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 3085dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 3086dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3087fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 3088fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3089fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 3090fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 3091fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3092fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangAST(user_type.GetASTContext()); 3093fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangType(user_type.GetOpaqueQualType()); 3094fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3095fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 3096fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3097fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3098fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3099fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 3100fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 3101fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3102819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 3103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 310467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const RegisterInfo *reg_info, 310567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 31061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 31071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 31081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3109f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context, 31101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 31111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 31121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 31131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 31141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 3115122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen if (log) 311667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 31171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 31181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 31191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 3121f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 31221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 31231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 31241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3125dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 312647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 312747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3128427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 31291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 3130427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 3131427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 3132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 3133427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 3134427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 3135427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 3136427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 313752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan entity->m_flags |= ClangExpressionVariable::EVBareRegister; 31381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 313952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (log) 31401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 3141a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 31429394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString()); 31431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 31441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 31451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3146a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 3147da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 3148da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Function* fun, 314967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol* symbol, 315067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 31518f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 3152aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 3153aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 3154e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 31558f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 315658baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan NamedDecl *fun_decl = NULL; 31570fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 315858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan const Address *fun_address = NULL; 31598f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 31600fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 31610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 31629b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *fun_ast_context = NULL; 31638f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 31640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 31650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 31660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 31670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 31680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 31690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 31700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 317167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no type"); 31720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 31730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 31740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 317504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton fun_opaque_type = fun_type->GetClangFullType(); 31760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 31770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 31780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 31790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 318067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no Clang type"); 31810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 31820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 31830fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 31840fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 31850fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 3186b01000fd063629facd45044f137446fb748ee179Greg Clayton fun_ast_context = fun_type->GetClangASTContext().getASTContext(); 3187f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type); 3188a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (copied_type) 3189a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3190a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_decl = context.AddFunDecl(copied_type); 3191a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 3192a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton else 3193a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3194a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton // We failed to copy the type we found 3195a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (log) 3196a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3197a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt", 3198a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetName().GetCString(), 3199a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetID()); 3200a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 320116089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan 320216089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan return; 3203a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 32040fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 32050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 32060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 32070c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton fun_address = &symbol->GetAddress(); 32080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 32090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 32100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 32118f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 3212810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 321367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" AddOneFunction called with no function and no symbol"); 32148f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 32158f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 32168f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3217dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3218567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3219567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target); 32208f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 32218f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 32228f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3223dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 322447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 322547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 32278de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 3228427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 3229427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 3230427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 3231427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3232427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 3233427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 3234427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 3235427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 32368c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3237810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 32388de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3239a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(fun_decl); 3240a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 32419394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found %s function %s, returned %s", 324267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 324367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (fun ? "specific" : "generic"), 324467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan decl_name.c_str(), 3245a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ast_dumper.GetCString()); 32468de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 324724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 324893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 324993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 325093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 32513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 325267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id, 32533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 325493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 3255f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan ASTContext *parser_ast_context = m_ast_context; 32569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *user_ast_context = ut.GetASTContext(); 32573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3258ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 3259dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3260dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 3261dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3262dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3263dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3264dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3265dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type"); 3266dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3267dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 3268dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 32699394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 32703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 32713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 32723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 32733c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 32743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 32753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3276716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 3277716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 3278716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan args, 3279716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 1, 3280716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan false, 3281716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 3282716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 32831d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 32841d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 32851d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 328630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 328728ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan const bool is_attr_used = true; 32882581dbf7292c6272bb771fe396ab30921385d669Sean Callanan const bool is_artificial = false; 328930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 32901d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 32911d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 32928de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 32931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 32941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 32951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 32961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 329730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 3298716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan is_explicit, 32992581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_attr_used, 33002581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_artificial); 33013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 330293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 330393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 330493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 3305