ClangExpressionDeclMap.cpp revision 06dc17f8eb821d7256fd42e56f85c2779a29f689
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 1606dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan#include "clang/AST/ASTContext.h" 1747a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h" 18a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 21810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h" 226184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 24061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h" 26f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan#include "lldb/Core/ValueObjectVariable.h" 276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 29a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h" 30cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 326916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 42f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 43810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 4417c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 46f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 493bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5373b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) : 5473b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTSource (exe_ctx.GetTargetSP()), 558de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 568de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 57dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_keep_result_in_memory (keep_result_in_memory), 58aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 59dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_struct_vars () 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 65aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 666d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // Note: The model is now that the parser's AST context and all associated 676d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // data does not vanish until the expression has been executed. This means 686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // that valuable lookup data (like namespaces) doesn't vanish, but 696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 706d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan DidParse(); 71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 75166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool 76427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 778c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 78aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 79dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx = exe_ctx; 80567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 81567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 82567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr()) 83567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetThreadPtr()) 85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 86567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetProcessPtr()) 87987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 88987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 89567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 90987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 91567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (target) 92987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 93987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton m_parser_vars->m_sym_ctx.Clear(); 94567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 95987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 9697ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan 97567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 99567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_persistent_vars = &target->GetPersistentVariables(); 100166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetScratchClangASTContext()) 102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 104166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 10547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info = GetTargetInfo(); 10647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 107166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan return true; 108aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 109c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 110427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 111427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 115427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 118aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (var_sp && 121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars.get() && 122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_lldb_value) 123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton delete var_sp->m_parser_vars->m_lldb_value; 124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->DisableParserVars(); 126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 128427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 129aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 130aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 132427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 133427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 134427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->DisableParserVars(); 135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 137aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1387a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 14347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo 14447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo() 14547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 14647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 14747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 14847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetInfo ret; 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 150dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 151dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 152dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 153dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (process) 15447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 155dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.byte_order = process->GetByteOrder(); 156dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.address_byte_size = process->GetAddressByteSize(); 157dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan } 158dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan else 159dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan { 160dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 161dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (target) 162567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 163dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.byte_order = target->GetArchitecture().GetByteOrder(); 164dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 165567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 16647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 167dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 16847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ret; 16947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 17047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1718de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1728de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 17382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 175aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 176aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 177427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 178427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton Target *target = m_parser_vars->GetTarget(); 179427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (target); 180427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName(); 181427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 182aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 18382b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 18482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 18505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP 18605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name, 18705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan lldb_private::TypeFromParser type, 18805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan const llvm::APInt& value) 18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{ 19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan assert (m_parser_vars.get()); 191166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 192dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 193dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 194dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 195dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 196dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!target) 197dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return ClangExpressionVariableSP(); 198567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 199567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 20005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2015a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan TypeFromUser user_type(m_ast_importer->CopyType(context, 2025a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetASTContext(), 2035a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetOpaqueQualType()), 20405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 20547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 206dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!user_type.GetOpaqueQualType()) 207dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 208dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 209dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 210dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 211dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::BuildIntegerVariable - Couldn't export the type for a constant integer result"); 212dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 213dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 214dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 215dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 216dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (), 217fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 2180e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 21947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 22047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 2210e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 2220e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2230e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 2240e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2250e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 2260e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 22705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2280e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 2290e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 2300e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 23105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 23347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 23405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 2350e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 23605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 23705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 23805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 23905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 24005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 2412bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (size_t byte_idx = 0; 24205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 24305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 24405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 24505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 24605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 24705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 24805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 24947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (m_parser_vars->m_target_info.byte_order) 25005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 2510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 2520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 2530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 2540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 2550e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 2570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 2590e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 2600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 2610e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 2620e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 2630e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 26405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 26505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 2666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2700e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2710e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 27205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 27305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 274696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP 275696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name, 2769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan VarDecl *decl, 277696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb_private::TypeFromParser type) 278696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{ 279696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan assert (m_parser_vars.get()); 280696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 281696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 282696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 283dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 284dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 285567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 286567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 287567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 288567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 289696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 290696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 291696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 292696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 293696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 294696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 295696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 296696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return ClangExpressionVariableSP(); 297696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 2985a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan TypeFromUser user_type(m_ast_importer->CopyType(context, 2995a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetASTContext(), 3005a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan type.GetOpaqueQualType()), 301696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan context); 302696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 303dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!user_type.GetOpaqueQualType()) 304dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 305dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 306dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 307dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 308dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::BuildCastVariable - Couldn't export the type for a constant cast result"); 309dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 310dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return lldb::ClangExpressionVariableSP(); 311dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 312dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 313696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser var_type = var_sp->GetTypeFromUser(); 314696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 315dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = exe_ctx.GetFramePtr(); 316567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL) 317567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return lldb::ClangExpressionVariableSP(); 318567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 319567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP var = FindVariableInScope (*frame, var_sp->GetName(), &var_type); 320696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 321696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var) 322696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable 323696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 324567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ValueObjectSP var_valobj = frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues); 325696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 326696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_valobj) 327696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 328696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 329696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type); 330696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 331696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_casted_valobj) 332696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 333696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 334696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (log) 335696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan { 336696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan StreamString my_stream_string; 337696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 338696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangASTType::DumpTypeDescription (var_type.GetASTContext(), 339696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_type.GetOpaqueQualType(), 340696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan &my_stream_string); 341696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 342696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 343696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str()); 344696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan } 345696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 346696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj); 347696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 348696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!pvar_sp) 349696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 350696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 351696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name)) 352696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 353696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 354696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 355696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 356696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 357696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 358696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return pvar_sp; 359696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan} 360696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 36147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 36247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ResultIsReference (const ConstString &name) 36347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 36447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 36547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference); 36747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 36847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 36947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 37047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::CompleteResultVariable (lldb::ClangExpressionVariableSP &valobj, 37147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 37247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const ConstString &name, 373a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::TypeFromParser type, 374557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool transient, 375557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan bool maybe_make_load) 37647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 37747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 37847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 37947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 38047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 38147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!pvar_sp) 38247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 383557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 384557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan if (maybe_make_load && 385557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.GetValueType() == Value::eValueTypeFileAddress && 386dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessPtr()) 387557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan { 388557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan value.SetValueType(Value::eValueTypeLoadAddress); 389557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan } 39047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 39147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 392a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !pvar_sp->m_live_sp && 393a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan !transient) 39447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 39547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan // The reference comes from the program. We need to set up a live SP for it. 39647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 397dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen unsigned long long address = value.GetScalar().ULongLong(); 398dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen AddressType address_type = value.GetValueAddressType(); 399dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen 400dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan pvar_sp->m_live_sp = ValueObjectConstResult::Create(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 40147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetASTContext(), 40247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetTypeFromUser().GetOpaqueQualType(), 40347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetName(), 404dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen address, 405dfafa141aa9d0dd0596bf08b3f941be8c308316dJohnny Chen address_type, 40647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->GetByteSize()); 40747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 40847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 40947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (pvar_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry) 41047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 41147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->ValueUpdated(); 41247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const size_t pvar_byte_size = pvar_sp->GetByteSize(); 41447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 41547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4168f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (!ReadTarget(pvar_data, value, pvar_byte_size)) 4178f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return false; 41847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 41947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan pvar_sp->m_flags &= ~(ClangExpressionVariable::EVNeedsFreezeDry); 42047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 42147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan valobj = pvar_sp; 42347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 42447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 42547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 42647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 4278f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callananvoid 4288f2e392e8937aaf66f91201dc5f4190d61902c67Sean CallananClangExpressionDeclMap::RemoveResultVariable 4298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan( 4308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan const ConstString &name 4318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan) 4328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan{ 4338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->GetVariable(name); 4348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan m_parser_vars->m_persistent_vars->RemovePersistentVariable(pvar_sp); 4358f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan} 4368f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 4378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 4388de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 4398de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 4418de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 4436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 4446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 4458de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 446a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 447aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 448aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 4496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 450dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 451dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 452567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 453567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 455567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 456a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 4570539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan TypeFromUser user_type(m_ast_importer->DeportType(context, 4580539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetASTContext(), 4590539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetOpaqueQualType()), 46097678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 4615a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 4625a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!user_type.GetOpaqueQualType()) 4635a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 4645a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (log) 4655a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Persistent variable's type wasn't copied successfully"); 4665a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 4675a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 46847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 46947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_parser_vars->m_target_info.IsValid()) 47047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 471a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 472dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (), 473fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 474427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 47547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 47647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)) 4778c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4788c12720c108cd5e7ed792596749218d8400f647eSean Callanan 479427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 4808c12720c108cd5e7ed792596749218d8400f647eSean Callanan 481427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4838c12720c108cd5e7ed792596749218d8400f647eSean Callanan 484bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan var_sp->m_frozen_sp->SetHasCompleteType(); 485bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan 4866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 4876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 4886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 4906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 4916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 4926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 4946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 4956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 4966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 4976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 4986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 4996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 5006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 5016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 5026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 5036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 504427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableParserVars(); 5058c12720c108cd5e7ed792596749218d8400f647eSean Callanan 506427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_named_decl = decl; 507427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_parser_type = parser_type; 5088c12720c108cd5e7ed792596749218d8400f647eSean Callanan 5098c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 510a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 511a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 512a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 5138de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 5148de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 5168de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 5178de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 5188de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 5198de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 5208de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 5218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 522aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 523aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 525e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 52645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 527aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 5288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5298c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 5308c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 5318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 532427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 5338c12720c108cd5e7ed792596749218d8400f647eSean Callanan 534427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 535427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 5368c12720c108cd5e7ed792596749218d8400f647eSean Callanan 537427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 5388c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5398c12720c108cd5e7ed792596749218d8400f647eSean Callanan 54045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 5415a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure", 54245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 5438de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 544427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 54545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 5468c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 5478c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 548427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_llvm_value = value; 5498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 550427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableJITVars(); 551427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_alignment = alignment; 552427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_size = size; 5538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 554427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 5558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 5608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 5618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 562aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 563aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 5658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 5688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 569aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 570aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 5718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 572427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 5738c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 5748c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 5758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 576427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 577427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 578427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 579427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 580427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 5818c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5838c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 584427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment; 5858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 586427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (cursor % member_sp->m_jit_vars->m_alignment) 587427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment)); 5888c12720c108cd5e7ed792596749218d8400f647eSean Callanan 589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset = cursor; 590427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += member_sp->m_jit_vars->m_size; 5918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 5928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 593aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 5948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 595aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 5968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 5978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 5988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 5998de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 6008de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6018de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 6028de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 6038de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 6048de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 606aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 607aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 608aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 6098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 611427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 612aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 613aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 6148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 6188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 6198de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 6208de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *&decl, 6228de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 6238de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 6248de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 6258de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 6268de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 628aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 629aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 630aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 6318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 633427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 6348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 6358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 636427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 6378c12720c108cd5e7ed792596749218d8400f647eSean Callanan 638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp || 639427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_parser_vars.get() || 64053a5a9986e2a201717ea723f67ae32571be95b32Sean Callanan !member_sp->m_jit_vars.get() || 64153a5a9986e2a201717ea723f67ae32571be95b32Sean Callanan !member_sp->GetValueObject()) 6428c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 6438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton decl = member_sp->m_parser_vars->m_named_decl; 645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = member_sp->m_parser_vars->m_llvm_value; 646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton offset = member_sp->m_jit_vars->m_offset; 647427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 6488c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 6508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 6518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 65202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 6538de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 6548de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6559b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 6568de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 6578de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 658ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 659427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl)); 6608c12720c108cd5e7ed792596749218d8400f647eSean Callanan 661427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 6628c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 663ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 6648c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 666ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 667427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 6688c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6698c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 670ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 671ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 672ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void 673ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext 674ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan( 675ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan const ConstString &name, 676ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContext &sym_ctx, 677ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContextList &sc_list 678ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan) 679ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{ 680ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (sym_ctx.module_sp) 681aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 682ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 683ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (!sc_list.GetSize()) 684ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeCode, sc_list); 685ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan} 686ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 687f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 6888de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 6898de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6908de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 691da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 6928de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 693f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 694aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 695aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 696aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 697dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 698dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 699f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 700567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 70178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 70278b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 703f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 704f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 705e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 706f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 707ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 708ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 709e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 710aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 711aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 712aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 713aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 7140eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan if (!strncmp(name.GetCString(), "_ZN", 3) && 7150eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan strncmp(name.GetCString(), "_ZNK", 4)) 716aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 7170eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan std::string fixed_scratch("_ZNK"); 7180eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan fixed_scratch.append(name.GetCString() + 3); 7190eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan ConstString fixed_name(fixed_scratch.c_str()); 720aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 721aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 7220eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString()); 7230eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan 7240eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list); 725aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 726aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 727aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 728aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 729f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 730f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 731f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 732e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 733f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 734da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 735f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 736f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 737da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 738f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 7390c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_so_addr = &sym_ctx.symbol->GetAddress(); 740f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 741f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 742f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 743ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 744ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 745ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 746567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton func_addr = func_so_addr->GetCallableLoadAddress (target); 747da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 748f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 749f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 750f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 751cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 75221ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name, lldb::SymbolType symbol_type) 753c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 754c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 755c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 75621ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list); 757c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 758cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 759cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 760cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 76121ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++) 762cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 763cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 764cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 765c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 7660c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddress(); 767ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 768ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 769ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return LLDB_INVALID_ADDRESS; 770ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 771cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 772cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 773cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 774cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 775cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 776cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 777cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 778cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 779cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 780cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 781cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 782cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 783cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 784cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 785cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 786cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 787cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 788cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 789cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 790cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 791cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 792cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 793cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 794cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 795cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 796cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 797cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 798cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 799cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 800cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 801cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 8023f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCClass: 8033f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCMetaClass: 8043f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCIVar: 805cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 806cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 807cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 808cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 809cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 810c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 811cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 812c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 813c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 814cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 81521ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type) 816819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 817819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 818819749647b1605f75753f625050cb240292c08b0Sean Callanan 819dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_exe_ctx.GetTargetPtr()) 820819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 821819749647b1605f75753f625050cb240292c08b0Sean Callanan 822dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), name, symbol_type); 823819749647b1605f75753f625050cb240292c08b0Sean Callanan} 824819749647b1605f75753f625050cb240292c08b0Sean Callanan 82547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan// Interface for IRInterpreter 82647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 827557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananValue 828557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean CallananClangExpressionDeclMap::WrapBareAddress (lldb::addr_t addr) 829557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan{ 830557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan Value ret; 831557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 832557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 833557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 834dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (m_parser_vars->m_exe_ctx.GetProcessPtr()) 835557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 836557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan else 837557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.SetValueType(Value::eValueTypeFileAddress); 838557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 839557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan ret.GetScalar() = (unsigned long long)addr; 840557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 841557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan return ret; 842557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan} 843557ccd6b47c5d4b3736e704e7f1e887a7fff6549Sean Callanan 84447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 84547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::WriteTarget (lldb_private::Value &value, 84647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan const uint8_t *data, 84747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 84847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 84947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 85047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 851dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 85247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 853dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 85447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 85547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 856567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 85747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 85847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 859dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 86047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 86147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 86347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 86447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 86547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 86647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 86747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 868567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!reg_value.SetFromMemoryData (reg_info, data, length, process->GetByteOrder(), err)) 86947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 87147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return reg_ctx->WriteRegister(reg_info, reg_value); 87247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 87347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 87447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 87547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 87647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 87747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 87847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 87947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 88047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 881567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 88247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 884dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 88547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 88647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 887567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 88847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 88947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 890567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = file_addr.GetLoadAddress(target); 89147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 893567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory(load_addr, data, length, err); 89447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 89547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 89647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 89747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 89847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 899567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 90047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 90147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 903567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->WriteMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 90447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 90747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 908e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan { 909e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan if (value.GetScalar().ULongLong() == 0 || data == NULL) 910e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan return false; 911e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan memcpy ((void *)value.GetScalar().ULongLong(), data, length); 912e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan return true; 913e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan } 91447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 91547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 91647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 91847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 91947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 92047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananbool 92147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::ReadTarget (uint8_t *data, 92247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::Value &value, 92347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan size_t length) 92447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 92547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 92647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 927dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 928567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 929dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 930567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 93147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (value.GetContextType() == Value::eContextTypeRegisterInfo) 93247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 933567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 93447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 93547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 936dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 93747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan RegisterInfo *reg_info = value.GetRegisterInfo(); 93847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 93947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx) 94047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 94147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan lldb_private::RegisterValue reg_value; 94347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 94447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 94547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!reg_ctx->ReadRegister(reg_info, reg_value)) 94647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 94747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 948567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return reg_value.GetAsMemoryData(reg_info, data, length, process->GetByteOrder(), err); 94947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 95047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 95147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 95247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan switch (value.GetValueType()) 95347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 95447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan default: 95547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 95647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeFileAddress: 95747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 958dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 959567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 96047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 96147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Address file_addr; 96347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 964567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetImages().ResolveFileAddress((lldb::addr_t)value.GetScalar().ULongLong(), file_addr)) 96547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 96647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 96747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 968b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan target->ReadMemory(file_addr, false, data, length, err); 96947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 97147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 97247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeLoadAddress: 97347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 974567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 97547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 97647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 97747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Error err; 978567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->ReadMemory((lldb::addr_t)value.GetScalar().ULongLong(), data, length, err); 97947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 98047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return err.Success(); 98147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 98247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeHostAddress: 9835a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 9845a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan void *host_addr = (void*)value.GetScalar().ULongLong(); 9855a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 9865a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!host_addr) 9875a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 9885a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 9895a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan memcpy (data, host_addr, length); 99047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return true; 9915a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 99247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan case Value::eValueTypeScalar: 99347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 99447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 99547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 99647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 99747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 99847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb_private::Value 99952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean CallananClangExpressionDeclMap::LookupDecl (clang::NamedDecl *decl, ClangExpressionVariable::FlagType &flags) 100047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 100147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 1002dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 100347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP expr_var_sp (m_found_entities.GetVariable(decl)); 100447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan ClangExpressionVariableSP persistent_var_sp (m_parser_vars->m_persistent_vars->GetVariable(decl)); 10051c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 100647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (expr_var_sp) 100747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 100852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan flags = expr_var_sp->m_flags; 100952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 1010b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!expr_var_sp->m_parser_vars.get()) 10116d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan return Value(); 10126d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 10131c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan bool is_reference = expr_var_sp->m_flags & ClangExpressionVariable::EVTypeIsReference; 1014b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1015b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (expr_var_sp->m_parser_vars->m_lldb_var) 10161c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan { 1017dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan std::auto_ptr<Value> value(GetVariableValue(expr_var_sp->m_parser_vars->m_lldb_var, NULL)); 10181c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1019b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (is_reference && value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 1020b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 1021dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1022b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1023b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!process) 1024b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return Value(); 1025b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1026b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 1027b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan Error read_error; 1028b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan addr_t ref_value = process->ReadPointerFromMemory (value_addr, read_error); 1029b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1030b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!read_error.Success()) 1031b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return Value(); 1032b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1033b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan value->GetScalar() = (unsigned long long)ref_value; 1034b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 1035b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1036b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (value.get()) 1037b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return *value; 1038b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan else 10391c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 1040b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 1041b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan else if (expr_var_sp->m_parser_vars->m_lldb_sym) 1042b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 10430c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton const Address sym_address = expr_var_sp->m_parser_vars->m_lldb_sym->GetAddress(); 10441c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1045b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan if (!sym_address.IsValid()) 10461c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan return Value(); 1047b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 1048b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan Value ret; 1049b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan 10506cdedde154e8b95758596775463a086352baee63Sean Callanan ProcessSP process_sp (m_parser_vars->m_exe_ctx.GetProcessSP()); 10516cdedde154e8b95758596775463a086352baee63Sean Callanan 10526cdedde154e8b95758596775463a086352baee63Sean Callanan if (process_sp) 10536cdedde154e8b95758596775463a086352baee63Sean Callanan { 10546cdedde154e8b95758596775463a086352baee63Sean Callanan uint64_t symbol_load_addr = sym_address.GetLoadAddress(&process_sp->GetTarget()); 10556cdedde154e8b95758596775463a086352baee63Sean Callanan 10566cdedde154e8b95758596775463a086352baee63Sean Callanan ret.GetScalar() = symbol_load_addr; 10576cdedde154e8b95758596775463a086352baee63Sean Callanan ret.SetValueType(Value::eValueTypeLoadAddress); 10586cdedde154e8b95758596775463a086352baee63Sean Callanan } 10596cdedde154e8b95758596775463a086352baee63Sean Callanan else 10606cdedde154e8b95758596775463a086352baee63Sean Callanan { 10616cdedde154e8b95758596775463a086352baee63Sean Callanan uint64_t symbol_file_addr = sym_address.GetFileAddress(); 10626cdedde154e8b95758596775463a086352baee63Sean Callanan 10636cdedde154e8b95758596775463a086352baee63Sean Callanan ret.GetScalar() = symbol_file_addr; 10646cdedde154e8b95758596775463a086352baee63Sean Callanan ret.SetValueType(Value::eValueTypeFileAddress); 10656cdedde154e8b95758596775463a086352baee63Sean Callanan } 10661c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan 1067b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan return ret; 10681c38d10238fe7edc342a10799acc65f8f5dceb90Sean Callanan } 106952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan else if (RegisterInfo *reg_info = expr_var_sp->GetRegisterInfo()) 107052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan { 107152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 107252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 107352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (!frame) 107452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return Value(); 107552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 107652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan RegisterContextSP reg_context_sp(frame->GetRegisterContextSP()); 107752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 107852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan RegisterValue reg_value; 107952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 108052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (!reg_context_sp->ReadRegister(reg_info, reg_value)) 108152d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return Value(); 108252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 108352d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan Value ret; 108452d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 108552d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan ret.SetContext(Value::eContextTypeRegisterInfo, reg_info); 108652d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (!reg_value.GetScalarValue(ret.GetScalar())) 108752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return Value(); 108852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 108952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan return ret; 109052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan } 10914b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 1092b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan { 10934b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 1094b2e8d19983a2f711c595737b08441e757dcb6cb0Sean Callanan } 109547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 109647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else if (persistent_var_sp) 109747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 109852d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan flags = persistent_var_sp->m_flags; 109952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan 1100a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan if ((persistent_var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference || 1101a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan persistent_var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) && 110286a07da76f615533a06a797dc4539566951b58d3Sean Callanan persistent_var_sp->m_live_sp && 1103f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan ((persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeLoadAddress && 1104dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessSP() && 1105dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx.GetProcessSP()->IsAlive()) || 1106f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan (persistent_var_sp->m_live_sp->GetValue().GetValueType() == Value::eValueTypeFileAddress))) 1107a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 11084b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return persistent_var_sp->m_live_sp->GetValue(); 1109a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 1110a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan else 1111a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan { 1112a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan lldb_private::Value ret; 1113a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetValueType(Value::eValueTypeHostAddress); 1114a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.SetContext(Value::eContextTypeInvalid, NULL); 1115a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan ret.GetScalar() = (lldb::addr_t)persistent_var_sp->GetValueBytes(); 1116a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan return ret; 1117a8428a458e779a64c8642fef5d29c7f6cc1b95f9Sean Callanan } 111847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 111947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 112047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 112147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return Value(); 112247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 112347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 112447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 11254b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananValue 11264b3cef072258eb17bd387ca7c7be18b6451fe09aSean CallananClangExpressionDeclMap::GetSpecialValue (const ConstString &name) 11274b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan{ 11284b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan assert(m_parser_vars.get()); 11294b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1130dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 11314b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11324b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!frame) 11334b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11344b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan VariableList *vars = frame->GetVariableList(false); 11364b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11374b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!vars) 11384b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11394b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11404b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::VariableSP var = vars->FindVariable(name); 11414b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 11424b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (!var || 11434b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->IsInScope(frame) || 11444b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan !var->LocationIsValidForFrame (frame)) 11454b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11464b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1147dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan std::auto_ptr<Value> value(GetVariableValue(var, NULL)); 11484b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 114941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (value.get() && value->GetValueType() == Value::eValueTypeLoadAddress) 115041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan { 1151dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 115241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 115341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (!process) 115441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan return Value(); 115541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 115641a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan lldb::addr_t value_addr = value->GetScalar().ULongLong(); 115741a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan Error read_error; 115841a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan addr_t ptr_value = process->ReadPointerFromMemory (value_addr, read_error); 115941a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 116041a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan if (!read_error.Success()) 116141a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan return Value(); 116241a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 116341a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan value->GetScalar() = (unsigned long long)ptr_value; 116441a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan } 116541a410d9fc46a3d4a1104f59befaaccc8ae55cabSean Callanan 11664b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan if (value.get()) 11674b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return *value; 11684b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan else 11694b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan return Value(); 11704b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan} 11714b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan 1172810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 1173f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1174f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 11758de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 11768de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 11778de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 11788de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 11798de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1180f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1181dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars.get()) 1182dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return false; 1183dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 1184aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 1185aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1186dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_material_vars->m_process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 11880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan bool result = DoMaterialize(false /* dematerialize */, 11890ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* top of stack frame */, 11900ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* bottom of stack frame */, 11910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan NULL, /* result SP */ 11920ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan err); 1193f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1194f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 1195aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 1196f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1197f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 1198f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1199f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1200f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 12018de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 12028de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 12038de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 12043aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 1205047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 1206047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 12078de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 12083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 1209aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1210aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1211dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1212dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1213dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1214567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1215567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (frame == NULL || process == NULL || target == NULL) 12163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1217e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't load '%s' because the context is incomplete", object_name.AsCString()); 12183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1221aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 12223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1223e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't load '%s' because its type is unknown", object_name.AsCString()); 12243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 122739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan const bool object_pointer = true; 122870c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan 1229567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton VariableSP object_ptr_var = FindVariableInScope (*frame, 1230696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 123170c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type), 123239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan object_pointer); 12333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 12353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 1236e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.AsCString()); 12373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1240dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(object_ptr_var, 1241aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 12423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 12433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 12443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 12453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 12463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 12473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 12483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 124950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 12503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 125150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 125250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 125350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 125450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 12553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 125650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 1257567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton uint32_t address_byte_size = target->GetArchitecture().GetAddressByteSize(); 125850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 125950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 126050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 126150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 126250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 126350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 126450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 126550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 126650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 1267567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton object_ptr = process->ReadPointerFromMemory (value_addr, read_error); 1268c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS) 126950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 127050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 127150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 1272c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 127350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 12743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 127550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 12763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 127750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 127850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 127950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 128050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 128150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 128250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 128350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 128450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 128550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1286061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 128750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1288061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 128950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 129050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 129150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 129250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 129350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1294dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 129550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1296061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 129750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 1298061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 129950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 130050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 130150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1302061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 130350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 1304061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 130550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 130650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 13073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 13083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 13093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 13103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 13113c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 13128de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 13138de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1314427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 13150ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 13160ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 13178de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13188de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1319f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1320dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan return DoMaterialize(true, stack_frame_top, stack_frame_bottom, &result_sp, err); 1321aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1322aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 1323aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 1324aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1325aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 1326aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 1327aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1328aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 1329aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1330aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1331aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 1332aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 1333aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1334aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 1335aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 1336aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 1337aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1338aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1339aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1340aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 1341aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 1342f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1343f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 134432824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 13458de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 13468de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 13478de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 13488de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 13498de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 135032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 1351aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1352aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 1353aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1354aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 135532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 135632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 135732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 135832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 1359dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1360567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1361567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process) 136232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 136332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 136432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 136532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 136632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1367dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1368567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 136932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 137032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 137132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 137232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 137332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 13743371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 13753371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 13763371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 13773371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 13783371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 13793371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 1380c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 138132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 138232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 1383567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (m_material_vars->m_materialized_location, 1384c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetBytes(), 1385c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetByteSize(), error) != data_sp->GetByteSize()) 138632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 138732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 138832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 138932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 139032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1391567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton DataExtractor extractor(data_sp, process->GetByteOrder(), target->GetArchitecture().GetAddressByteSize()); 139232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 1394427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 1395427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 139632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 1397427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 139832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1399427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 1400427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 1401427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 14038c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 14058c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 14068c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1407427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 1408427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 1409427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 1410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 1411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 1412427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 1413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 1414427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 1415427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 141632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 141732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 141832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 141932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 142032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 142132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 142232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1423f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 14248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 14258de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 14268de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 14270ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 14280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 1429427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 14308de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 14318de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1432810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 1433427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 1434427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 1435427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1436aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1437aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1438e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 143982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 1440aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 1441810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1442810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 144357067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 1444810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1445810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1446dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1447567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 144845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 144945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 145057067a0ec95a764cb8e31d7589f8a096807e9ec0Greg Clayton return false; 145145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 1452dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 145345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 1454567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangPersistentVariables &persistent_vars = target->GetPersistentVariables(); 1455aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1456aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 1457e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 1458e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 1459e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 1460e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1461f99355834bee84e48e2b6205ed13d307faa74405Filipe Cabecinhas m_material_vars->m_allocated_area = 0UL; 1462e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1463e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 1464e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 1465e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 1466567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton const SymbolContext &sym_ctx(frame->GetSymbolContext(lldb::eSymbolContextEverything)); 1467810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1468f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 1469f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1470dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1471aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 1472f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1473567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton process->DeallocateMemory(m_material_vars->m_materialized_location); 1474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 1475f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1476810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 14777a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 14787a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 14797a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 1480567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t mem = process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 14815a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 14825a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err); 1483f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1484f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 14855a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 14865a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate 0x%llx bytes for materialized argument struct", 14875a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan (unsigned long long)(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size)); 1488f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 14895a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 14905a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 1491aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 1492f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1493810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1494aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 1495810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1496aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 1497aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 1498810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1499427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 15008c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 15018c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 1502810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 1503427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 15044d0b110715d321d366dec1dc690300f713b63236Sean Callanan 1505a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 1506336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 150725db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan if (!member_sp->GetValueObject()) 150825db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan { 150925db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan err.SetErrorString("Variable being materialized doesn't have a frozen version"); 151025db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan return false; 151125db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan } 151225db51fbf9348e0266a91e0acdbbc3892f44893aSean Callanan 1513a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 1514427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 15151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 15161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 15171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1518dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 15191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 15215a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 15225a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Couldn't get register context"); 15231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15245a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 15255a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 1526427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 1527427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 1528427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 1529427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1530427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 15311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 15341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1535427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 15365a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 15375a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Variable being materialized doesn't have necessary state"); 15381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15395a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 15401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1541427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 15426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 15436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 1544427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 1545427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 15461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15488c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1549a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 15508c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 1551a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 1552a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 1553a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 155445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 15556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1556a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 1557a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1558a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 1559a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 15606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1561a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 1562a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 15636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1564a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 1565a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 1566a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 1567a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 15680ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 15690ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_top, 15700ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom, 1571a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 1572a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 1573f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1574a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 1575a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1576a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 15778c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1578a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 15798c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1580810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1581810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1582f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1583f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1584f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1585a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 15868de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 15878de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 15888de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 1589427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 15908de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 15910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 15920ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 15938de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 15948de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1595aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 15966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 15976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1598427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1599a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1600427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1601a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1602a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1603a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1604427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1605a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1606427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1607427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 16085a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 16095a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Persistent variable being materialized contains no data"); 1610a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 16115a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 1612a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1613a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1614dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1615567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 16166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 16176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1618a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1619a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 16206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 16216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 16226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 16246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 16256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 16276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 1629567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->ReadPointerFromMemory (addr, read_error); 16306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 16326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 16346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 16386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 16396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 16416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 16426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1643dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 164447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 164547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 164647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 164747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 164847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 164947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 16506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 16536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 16556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1658b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 16596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 16616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 166497678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 166597678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 16666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 16686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1670c4b6ab949a32a48f69d1aac295770505c99fd4f9Greg Clayton log->Printf("Dematerializing %s from 0x%llx (size = %u)", var_sp->GetName().GetCString(), (uint64_t)mem, (unsigned)pvar_byte_size); 16716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 16730ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 1675567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 16766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 16776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 16786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 16796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16810ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan if (stack_frame_top != LLDB_INVALID_ADDRESS && 16820ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom != LLDB_INVALID_ADDRESS && 16830ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem >= stack_frame_bottom && 16840ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem <= stack_frame_top) 16850ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 16860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // If the variable is resident in the stack frame created by the expression, 16870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // then it cannot be relied upon to stay around. We treat it as needing 16880ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // reallocation. 16890ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16900ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 16910ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 16920ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; 16930ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 16940ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 16956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 16966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 16976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 16986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 16996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 17006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 17026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 17046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 17066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1707567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(mem); 17086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 17106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 17126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1718a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1720a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1721a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1722a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1723a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1724a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 17266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 17276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 17296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 17316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 17336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1734567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton mem = process->AllocateMemory(pvar_byte_size, 17354b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 17364b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan allocate_error); 17376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 17396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 17416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 17456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 17466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 17486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1749dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan var_sp->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 175047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 175147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 175247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 175347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 175447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 175547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 17566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 17586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 17606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 17616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 17636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1764567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 17656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 17676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 17726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 17736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 17756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1776567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 17774b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan var_sp->m_live_sp->GetValue().GetScalar(), 17784b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan process->GetAddressByteSize(), 17794b3cef072258eb17bd387ca7c7be18b6451fe09aSean Callanan write_error)) 17806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 17816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 17826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 17836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 17846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 17856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1786c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong()); 17876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1788696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1789a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 17906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1791a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1792a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1793a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1794a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1795a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1796a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1797a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1798f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 17998de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 18008de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 18018de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 18028de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 18036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 18048de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 18058de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 18068de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1808e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1809dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1810dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = m_parser_vars->m_exe_ctx.GetProcessPtr(); 1811dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 1812567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 18136d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan if (!frame || !process || !target || !m_parser_vars.get() || !expr_var->m_parser_vars.get()) 18145a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 18155a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan err.SetErrorString("Necessary state for variable materialization isn't present"); 1816cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 18175a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 1818cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 18196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 18206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 18226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 18236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 18244a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var(expr_var->m_parser_vars->m_lldb_var); 18254a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan lldb_private::Symbol *sym(expr_var->m_parser_vars->m_lldb_sym); 1826f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 18276f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference(expr_var->m_flags & ClangExpressionVariable::EVTypeIsReference); 18286f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 1829819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 18304a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1831819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1832819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1833dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan location_value.reset(GetVariableValue(var, 1834819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1835819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1836819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym) 18374a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan { 183821ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan addr_t location_load_addr = GetSymbolAddress(*target, name, lldb::eSymbolTypeAny); 1839819749647b1605f75753f625050cb240292c08b0Sean Callanan 1840cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (location_load_addr == LLDB_INVALID_ADDRESS) 1841819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1842819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1843c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s", 1844c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1845819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1846819749647b1605f75753f625050cb240292c08b0Sean Callanan 18474a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan location_value.reset(new Value); 18484a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan 1849819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1850819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1851819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1852819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1853f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1854c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type", 1855c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1856f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1857f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1858f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1859841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 1860fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1861fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan StreamString my_stream_string; 1862fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1863fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangASTType::DumpTypeDescription (type.GetASTContext(), 1864fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan type.GetOpaqueQualType(), 1865fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan &my_stream_string); 1866fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1867c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf ("%s %s with type %s", 1868c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton dematerialize ? "Dematerializing" : "Materializing", 1869c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1870c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton my_stream_string.GetString().c_str()); 1871fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1872f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1873f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1874f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 18758de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1876f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1877f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 187817c6a05cb96f7110332342326a90692d9505982eSean Callanan 187917c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1880f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 18816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 18826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 188317c6a05cb96f7110332342326a90692d9505982eSean Callanan 188417c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 188517c6a05cb96f7110332342326a90692d9505982eSean Callanan 188617c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1887f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 188817c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1889f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 189017c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 189117c6a05cb96f7110332342326a90692d9505982eSean Callanan 189217c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 189317c6a05cb96f7110332342326a90692d9505982eSean Callanan 1894c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s", 1895c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1896c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 189717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1898f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 189917c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 190017c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1901f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 19026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 190317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1904c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error write_error; 19056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19066f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 19076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 19086f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error read_error; 19096f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19106f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr_t ref_value = process->ReadPointerFromMemory(location_value->GetScalar().ULongLong(), read_error); 19116f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19126f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!read_error.Success()) 19136f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19146f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read reference to %s from the target: %s", 19156f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19166f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan read_error.AsCString()); 19176f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19186f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19196f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19206f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WritePointerToMemory(addr, 19216f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan ref_value, 19226f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 19236f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19246f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 19256f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19266f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 19276f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19286f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19296f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19306f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 19316f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19326f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!process->WriteScalarToMemory (addr, 19336f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan location_value->GetScalar(), 19346f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 19356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 19366f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 19376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 19386f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 19396f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 19406f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 19416f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 19426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 194317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1944f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 194517c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 194617c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1947f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 19486916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 194917c6a05cb96f7110332342326a90692d9505982eSean Callanan { 195017c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 195117c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 195217c6a05cb96f7110332342326a90692d9505982eSean Callanan 1953c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s", 1954c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1955c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 195617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 195717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 195817c6a05cb96f7110332342326a90692d9505982eSean Callanan 1959061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 196017c6a05cb96f7110332342326a90692d9505982eSean Callanan 1961061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 196217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1963c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't get the register information for %s", 1964c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 196517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 196617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 196717c6a05cb96f7110332342326a90692d9505982eSean Callanan 1968061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1969061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1970dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan RegisterContext *reg_ctx = m_parser_vars->m_exe_ctx.GetRegisterContext(); 1971061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1972061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 197317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1974c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s", 1975c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1976c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 197717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 197817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 197917c6a05cb96f7110332342326a90692d9505982eSean Callanan 1980061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 198117c6a05cb96f7110332342326a90692d9505982eSean Callanan 198217c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 198317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 19846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 19856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; // reference types don't need demateralizing 19866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 19876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 19886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 19896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 19906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 19916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 19926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 19946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1995b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 19966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 19976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 19986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 19996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2001c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar ®_addr = expr_var->m_live_sp->GetValue().GetScalar(); 200217c6a05cb96f7110332342326a90692d9505982eSean Callanan 2003c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, 2004c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 2005c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 2006c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 2007061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 200817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 2009061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2010061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 201117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2012c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to register %s", 2013c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2014c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 201517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 201617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 20176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 20196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2020567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Error deallocate_error = process->DeallocateMemory(reg_addr.ULongLong()); 20216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 20236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2024c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s", 2025c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2026c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton deallocate_error.AsCString()); 20276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 203117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 203217c6a05cb96f7110332342326a90692d9505982eSean Callanan else 203317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 20346f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan Error write_error; 20356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20366f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan RegisterValue reg_value; 20376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20386f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!reg_ctx->ReadRegister (reg_info, reg_value)) 20396f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20406f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't read %s from %s", 20416f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 20426f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name); 20436f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 20446f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20456f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20466f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 20476f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20486f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error = reg_ctx->WriteRegisterValueToMemory(reg_info, 20496f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan addr, 20506f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 20516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_value); 20526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (!write_error.Success()) 20546f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan { 20556f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s from register %s to the target: %s", 20566f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan name.GetCString(), 20576f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_info->name, 20586f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error.AsCString()); 20596f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return false; 20606f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20616f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20626f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan return true; 20636f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan } 20646f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 20656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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 20666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 20676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 20696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2070567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Scalar reg_addr (process->AllocateMemory (value_byte_size, 20716f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 20726f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan allocate_error)); 20736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2074c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS) 20756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2076c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s", 2077c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2078c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error.AsCString()); 20796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 20806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 20816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 20836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2084dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan expr_var->m_live_sp = ValueObjectConstResult::Create (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 208547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 208647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 208747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 2088c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 208947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 209047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 20916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 20926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 20936f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 2094567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!process->WriteScalarToMemory (addr, 20956f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan reg_addr, 20966f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan process->GetAddressByteSize(), 20976f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan write_error)) 20986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2099c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 2100c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2101c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 21026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 21036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 21046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 21056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 210617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2107c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is too big to store in %s", 2108c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2109c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 211017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 211117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 2112061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 2113061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 211417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 2115c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from %s", 2116c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 2117c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 211817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 211917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 212017c6a05cb96f7110332342326a90692d9505982eSean Callanan 2121c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->WriteRegisterValueToMemory (reg_info, 2122c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 2123c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 2124c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 2125061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 212617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 212717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 2128f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2129f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2130f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 2131f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 2132810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 2133810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 21341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 21351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 21361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 21371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 21381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 2139b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 21401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 21411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 21421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 21431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 21441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 2145061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 21461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 21471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2148061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 2149061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 21501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2151bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 21521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2155061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 21561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2157061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 21581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 21621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 21631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2164061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 21651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2166061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 21671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2170061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 2171061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 21721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 217395b7b4362ca7135be088e4fbf04c2bd15767a104Jason Molenda err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", reg_info.name, write_error.AsCString()); 21741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 21751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 21791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 21801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2181696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 21828de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 21838de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 21848de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 21858de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 218670c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan TypeFromUser *type, 218739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan bool object_pointer 21888de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 2189aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 2190e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2191cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 2192f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan ValueObjectSP valobj; 2193f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan VariableSP var_sp; 2194f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan Error err; 2195f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan 2196f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan valobj = frame.GetValueForVariableExpressionPath(name.GetCString(), 2197f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan eNoDynamicValues, 2198f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 2199f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan var_sp, 2200f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan err); 22013bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 2202f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan if (!err.Success() || 2203f8b468e115f7cfe193b29c22104c7d04419f4e14Sean Callanan !var_sp || 2204ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->IsInScope(&frame) || 2205ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->LocationIsValidForFrame (&frame)) 2206ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return lldb::VariableSP(); 22073bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 22084207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (var_sp) 22093bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 22104207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (!type) 22114207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return var_sp; 22124207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 221339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan TypeFromUser candidate_type(var_sp->GetType()->GetClangFullType(), 221439d1af981f6a76603356fd84b2e9372a9172297cSean Callanan var_sp->GetType()->GetClangAST()); 221539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 221639d1af981f6a76603356fd84b2e9372a9172297cSean Callanan if (candidate_type.GetASTContext() != type->GetASTContext()) 22173bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 221839d1af981f6a76603356fd84b2e9372a9172297cSean Callanan if (log) 221939d1af981f6a76603356fd84b2e9372a9172297cSean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 222039d1af981f6a76603356fd84b2e9372a9172297cSean Callanan return lldb::VariableSP(); 222139d1af981f6a76603356fd84b2e9372a9172297cSean Callanan } 222239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 222339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan if (object_pointer) 222439d1af981f6a76603356fd84b2e9372a9172297cSean Callanan { 222539d1af981f6a76603356fd84b2e9372a9172297cSean Callanan clang::QualType desired_qual_type = clang::QualType::getFromOpaquePtr(type->GetOpaqueQualType()); 222639d1af981f6a76603356fd84b2e9372a9172297cSean Callanan clang::QualType candidate_qual_type = clang::QualType::getFromOpaquePtr(candidate_type.GetOpaqueQualType()); 222739d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 22284207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan const clang::ObjCObjectPointerType *desired_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>(); 22294207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan const clang::ObjCObjectPointerType *candidate_objc_ptr_type = desired_qual_type->getAs<clang::ObjCObjectPointerType>(); 22304207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 22314207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (desired_objc_ptr_type && candidate_objc_ptr_type) { 22324207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan clang::QualType desired_target_type = desired_objc_ptr_type->getPointeeType().getUnqualifiedType(); 22334207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan clang::QualType candidate_target_type = candidate_objc_ptr_type->getPointeeType().getUnqualifiedType(); 22344207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 22354207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), 22364207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan desired_target_type.getAsOpaquePtr(), 22374207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan candidate_target_type.getAsOpaquePtr())) 22384207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return var_sp; 22394207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan } 22404207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 224139d1af981f6a76603356fd84b2e9372a9172297cSean Callanan const clang::PointerType *desired_ptr_type = desired_qual_type->getAs<clang::PointerType>(); 224239d1af981f6a76603356fd84b2e9372a9172297cSean Callanan const clang::PointerType *candidate_ptr_type = candidate_qual_type->getAs<clang::PointerType>(); 224339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 22444207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (desired_ptr_type && candidate_ptr_type) { 22454207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan clang::QualType desired_target_type = desired_ptr_type->getPointeeType().getUnqualifiedType(); 22464207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan clang::QualType candidate_target_type = candidate_ptr_type->getPointeeType().getUnqualifiedType(); 22474207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan 22484207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), 22494207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan desired_target_type.getAsOpaquePtr(), 22504207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan candidate_target_type.getAsOpaquePtr())) 22514207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return var_sp; 22524207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan } 225339d1af981f6a76603356fd84b2e9372a9172297cSean Callanan 22544207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return lldb::VariableSP(); 22553bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 22563bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 22573bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 22584207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), 225939d1af981f6a76603356fd84b2e9372a9172297cSean Callanan type->GetOpaqueQualType(), 226039d1af981f6a76603356fd84b2e9372a9172297cSean Callanan var_sp->GetType()->GetClangFullType())) 22614207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return var_sp; 22623bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 22633bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 22643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 22654207296bfac40fa79beb9a01eecd26cd3350f59eSean Callanan return lldb::VariableSP(); 2266cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 2267336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2268819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol * 2269819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol 2270819749647b1605f75753f625050cb240292c08b0Sean Callanan( 2271819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 2272aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan const ConstString &name 2273819749647b1605f75753f625050cb240292c08b0Sean Callanan) 2274819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2275819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 2276819749647b1605f75753f625050cb240292c08b0Sean Callanan 2277aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, 2278aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan eSymbolTypeData, 2279aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan sc_list); 2280819749647b1605f75753f625050cb240292c08b0Sean Callanan 2281819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 2282819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2283819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 2284819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 2285819749647b1605f75753f625050cb240292c08b0Sean Callanan 2286819749647b1605f75753f625050cb240292c08b0Sean Callanan return sym_ctx.symbol; 2287819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2288819749647b1605f75753f625050cb240292c08b0Sean Callanan 2289819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 2290819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2291819749647b1605f75753f625050cb240292c08b0Sean Callanan 229247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP 229347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable 229447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan( 229547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target &target, 229694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ModuleSP &module, 229794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan const ConstString &name, 229894cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ClangNamespaceDecl *namespace_decl, 229947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser *type 230047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan) 230147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 230247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList vars; 230347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 230494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan if (module && namespace_decl) 230594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module->FindGlobalVariables (name, namespace_decl, true, -1, vars); 230694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan else 230794cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan target.GetImages().FindGlobalVariables(name, true, -1, vars); 230847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 230947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (vars.GetSize()) 231047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 231147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type) 231247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 231347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < vars.GetSize(); ++i) 231447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 231547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableSP var_sp = vars.GetVariableAtIndex(i); 231647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 231747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 231847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 231947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 232047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return var_sp; 232147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 232247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 232347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 232447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 232547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 232647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return vars.GetVariableAtIndex(0); 232747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 232847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 232947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 233047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return VariableSP(); 233147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 233247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 233324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 233447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 233516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 2336f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context) 233724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2338f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 2339f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2340f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 2341f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 2342e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23449394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (GetImportInProgress()) 2345ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 234667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 2347ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 2348ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 2349ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 2350e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 235167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan static unsigned int invocation_id = 0; 235267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id = invocation_id++; 235367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan 235416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 235516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 235616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (!context.m_decl_context) 23579394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString()); 235816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context)) 23599394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str()); 236016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 23619394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName()); 236216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 23639394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 236416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context)) 236516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 236673b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context); 2367a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 236867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 23695a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", 237067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 237167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan namespace_map.get(), 237267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (int)namespace_map->size()); 2373a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 2374a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan if (!namespace_map) 2375a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan return; 2376a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan 237716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); 237816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i != e; 237916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ++i) 238016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 238116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 23829394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", 238367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 238416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->second.GetNamespaceDecl()->getNameAsString().c_str(), 238516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->first->GetFileSpec().GetFilename().GetCString()); 238616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 2387c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan FindExternalVisibleDecls(context, 2388c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->first, 2389c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->second, 239067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 239116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 239216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2393e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan else if (isa<TranslationUnitDecl>(context.m_decl_context)) 239416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 239516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangNamespaceDecl namespace_decl; 239616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 239716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 23989394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id); 239916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 240016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan FindExternalVisibleDecls(context, 240116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP(), 240216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl, 240367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 240416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 2405a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 24069394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (!context.m_found.variable) 24079394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan ClangASTSource::FindExternalVisibleDecls(context); 240816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan} 240916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 241016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 241116b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, 241238d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan lldb::ModuleSP module_sp, 241303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl &namespace_decl, 241467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 241516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{ 2416f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 241716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 241816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 24199394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 2420e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 242124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24229394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 24239394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 24243bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 24253bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 24263bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 24273bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 24289394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 24298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString id_name("id"); 24308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString Class_name("Class"); 24318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 24328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (name == id_name || name == Class_name) 24338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return; 24348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 24358de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 24368de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 2437dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 2438dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 243903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (name_unique_cstr[0] == '$' && !namespace_decl) 24403cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 244157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 244247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 244357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 244457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 244557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 244675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 244775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (frame == NULL) 244847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 244947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 245075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 245157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 245275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!sym_ctx.function) 245357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 245457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2455b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton // Get the block that defines the function 2456b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton Block *function_block = sym_ctx.GetFunctionBlock(); 2457b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 2458b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton if (!function_block) 2459b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton return; 2460b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 2461b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton clang::DeclContext *decl_context = function_block->GetClangDeclContext(); 246257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 246375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!decl_context) 246457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 246557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 246675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context); 246757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 246875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!method_decl) 246957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 247057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 247175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan clang::CXXRecordDecl *class_decl = method_decl->getParent(); 2472c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 247375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan QualType class_qual_type(class_decl->getTypeForDecl(), 0); 2474c617a4cb4a451be9d7e97d7af6e165d282b5390fSean Callanan 247575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(), 247675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan &class_decl->getASTContext()); 247703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 24783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 24793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 248075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan ASTDumper ast_dumper(class_qual_type); 24819394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString()); 24823aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 24833aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2484e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan AddOneType(context, class_user_type, current_id, true); 248557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 2486bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan if (method_decl->isInstance()) 2487bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan { 2488bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan // self is a pointer to the object 2489bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2490bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type); 2491bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2492bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(), 2493bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan &method_decl->getASTContext()); 2494bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 2495bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 2496bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan } 2497bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 249857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 249957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 250057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 25013aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 25023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 25033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 25043aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 25053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 2506567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 250747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 2508e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2509e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 251047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2511e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!sym_ctx.function) 2512e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 251303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2514b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton // Get the block that defines the function 2515b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton Block *function_block = sym_ctx.GetFunctionBlock(); 2516e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2517b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton if (!function_block) 2518b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton return; 2519b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 2520b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton clang::DeclContext *decl_context = function_block->GetClangDeclContext(); 2521e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2522e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!decl_context) 25233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 252403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2525e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context); 2526e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2527e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!method_decl) 2528e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 2529e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2530e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan ObjCInterfaceDecl* self_interface = method_decl->getClassInterface(); 2531e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2532e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!self_interface) 2533e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 2534e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2535e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan const clang::Type *interface_type = self_interface->getTypeForDecl(); 2536e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2537e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(), 2538e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan &method_decl->getASTContext()); 2539e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2540e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (log) 2541e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan { 2542e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan ASTDumper ast_dumper(interface_type); 2543e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 2544e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan } 2545e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 2546e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan AddOneType(context, class_user_type, current_id, false); 2547e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 254875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan#if 0 2549e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan VariableList *vars = frame->GetVariableList(false); 2550e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 25513aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 255203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 255375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (self_var && 255475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan self_var->IsInScope(frame) && 255575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan self_var->LocationIsValidForFrame (frame)) { 255675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan Type *self_type = self_var->GetType(); 255775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 255875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!self_type) 255975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan return; 256075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 256175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan TypeFromUser self_user_type(self_type->GetClangFullType(), 256275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan self_type->GetClangAST()); 256375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 256475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan#endif 25653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 256675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (method_decl->isInstanceMethod()) 256775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan { 256875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan // self is a pointer to the object 256975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 257075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0)); 257103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 257275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(), 257375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan &method_decl->getASTContext()); 25743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 257575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 257675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 257775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan else 257875ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan { 257975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan // self is a Class pointer 258075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan QualType class_type = method_decl->getASTContext().getObjCClassType(); 258175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 258275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan TypeFromUser self_user_type(class_type.getAsOpaquePtr(), 258375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan &method_decl->getASTContext()); 258475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 258575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 258675ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 258775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 25883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 25893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 2590c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan 2591c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan // any other $__lldb names should be weeded out now 2592c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) 2593c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan return; 259403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 25952431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan do 25962431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan { 2597567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 25982431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 25992431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2600567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); 26012431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26022431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_clang_ast_context) 26032431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 26042431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26052431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 26062431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26072431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_ast_context) 26082431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 26092431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26102431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); 261103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 26122431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!ptype_type_decl) 26132431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 26142431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2615e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl); 26162431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26172431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_decl) 26182431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 26192431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26202431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); 26212431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26222431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_type_decl) 26232431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 26242431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26252431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (log) 26269394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString()); 26272431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 26282431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan context.AddNamedDecl(parser_ptype_type_decl); 26292431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan } while (0); 26302431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 2631427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 263203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2633427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 26341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 263567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, pvar_sp, current_id); 26361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 26371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 26381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 26391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 26401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2641dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (m_parser_vars->m_exe_ctx.GetRegisterContext()) 26421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 2643dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name)); 26449394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 26451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 2646e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan { 2647e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (log) 26489394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name); 2649e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 265067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneRegister(context, reg_info, current_id); 2651e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan } 26521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 26538de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 265403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 265503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 265603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ValueObjectSP valobj; 265703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan VariableSP var; 265803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Error err; 265903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 266003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (frame && !namespace_decl) 266103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 266203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr, 266303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan eNoDynamicValues, 266403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember, 266503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan var, 266603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan err); 266703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 266803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // If we found a variable in scope, no need to pull up function names 2669b386d82334b65fb984348f2027b1cb7714de993fSean Callanan if (err.Success() && var) 267003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 267189e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 267216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 26733a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan return; 267403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 267503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 26761c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan 26771c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan if (target) 267803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 267994cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan var = FindGlobalVariable (*target, 268038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp, 268194cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan name, 268294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan &namespace_decl, 268303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NULL); 268403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 268503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (var) 268603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2687f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan valobj = ValueObjectVariable::Create(target, var); 268889e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 268916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 26901c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan return; 269103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 269203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 269303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 269416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 269503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 2696302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan const bool include_inlines = false; 269703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool append = false; 2698a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 269938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (namespace_decl && module_sp) 2700a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 270151cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan const bool include_symbols = false; 270251cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan 270338d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp->FindFunctions(name, 270438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan &namespace_decl, 270538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan eFunctionNameTypeBase, 270638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan include_symbols, 2707302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 270838d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan append, 270938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan sc_list); 2710a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2711647fefd71c4364342aa116e45418592667fb8265Sean Callanan else if (!namespace_decl) 2712a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 271351cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan const bool include_symbols = true; 271451cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan 27152975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // TODO Fix FindFunctions so that it doesn't return 27162975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // instance methods for eFunctionNameTypeBase. 27172975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 2718a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan target->GetImages().FindFunctions(name, 2719a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan eFunctionNameTypeBase, 2720a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 2721302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 2722a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 2723a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 2724a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 2725a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 272603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sc_list.GetSize()) 272703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 272803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *generic_symbol = NULL; 272903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *non_extern_symbol = NULL; 273003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 273103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 273203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan index < num_indices; 273303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++index) 273403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 273503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext sym_ctx; 273603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 273703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 273803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.function) 273903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 27402975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext(); 27412975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 27422975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // Filter out class/instance methods. 27432975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx)) 27442975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan continue; 27452975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan if (dyn_cast<clang::CXXMethodDecl>(decl_ctx)) 27462975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan continue; 27472975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 274803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // TODO only do this if it's a C function; C++ functions may be 274903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // overloaded 275016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 275167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction(context, sym_ctx.function, NULL, current_id); 275216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function_with_type_info = true; 275316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 275403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 275503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (sym_ctx.symbol) 275603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 275703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.symbol->IsExternal()) 275803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan generic_symbol = sym_ctx.symbol; 275903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 276003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan non_extern_symbol = sym_ctx.symbol; 276103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 276203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 276303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 276416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 276503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 276603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (generic_symbol) 276703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 276867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, generic_symbol, current_id); 276916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 277003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 277103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (non_extern_symbol) 277203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 277367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, non_extern_symbol, current_id); 277416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 277503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 277603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 277703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 277803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2779647fefd71c4364342aa116e45418592667fb8265Sean Callanan if (!context.m_found.variable && !namespace_decl) 278003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 278116c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic 278203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 278303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 2784aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean Callanan Symbol *data_symbol = FindGlobalDataSymbol(*target, name); 278503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 278603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (data_symbol) 278703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 278867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneGenericVariable(context, *data_symbol, current_id); 278916c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 279003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 279103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 279203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 2793b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan } 279424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2795e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 279669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callananstatic clang_type_t 279769716a233f3240978bdbd7a8b682b31e7e07e498Sean CallananMaybePromoteToBlockPointerType 279869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan( 279969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan ASTContext *ast_context, 280069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan clang_type_t candidate_type 280169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan) 280269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan{ 280369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!candidate_type) 280469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 280569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 280669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type); 280769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 280869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type); 280969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 281069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!candidate_pointer_type) 281169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 281269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 281369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType pointee_qual_type = candidate_pointer_type->getPointeeType(); 281469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 281569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type); 281669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 281769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_type) 281869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 281969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 282069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan RecordDecl *pointee_record_decl = pointee_record_type->getDecl(); 282169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 282269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_decl->isRecord()) 282369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 282469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 282569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_"))) 282669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 282769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 282869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy); 282969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type); 283069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 283169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return block_pointer_type.getAsOpaquePtr(); 283269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan} 283369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 2834336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 28358de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 28368de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 28374a07832dc5028af55cacf247bedad9933bf8afdcSean Callanan VariableSP &var, 28389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context, 28398de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 28408de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 28418de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 284224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2843e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 28446184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 284524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 284624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 284724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 284824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2849810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2850810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 2851336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 285324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285404c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 285524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 285624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 285724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2858810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2859810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 2860336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 286124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 286224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 286424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2865b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2867810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2868810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 2869336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 287024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 28723418bfeeafef91b67a62f536d0ff4bbdb4d0d440Enrico Granata // commented out because of <rdar://problem/11024417> 28733418bfeeafef91b67a62f536d0ff4bbdb4d0d440Enrico Granata //var_opaque_type = MaybePromoteToBlockPointerType (ast, var_opaque_type); 287424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2875336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 2876336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 287724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 287824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2879178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 2880178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 2881dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 2882567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 2883178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 2884178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 2885178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 2886178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 2887567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target); 2888178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 288924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 289024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2891dd1dcfdbad297562951169ad621f895daf32b382Sean 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)) 289224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2893810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2894810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 2895336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 289624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2897b01000fd063629facd45044f137446fb748ee179Greg Clayton 289858baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *type_to_use = NULL; 2899336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2900f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 2901f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 2902b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 2903f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 29044b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 29054b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 29064b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 29074b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 29084b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 29094b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 29104b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 29114b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 2912f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 2913f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 2914f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2915336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 2916336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 291724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 291824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 29196916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 292024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 292224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 292324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 292424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 2925336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 292624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 2927336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 292824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 292924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 293024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 2932336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 2933336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 293424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 293524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2936567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 293724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 293847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 293947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 294047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->GetScalar() = load_addr; 294147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan var_location->SetValueType(Value::eValueTypeLoadAddress); 294247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 294324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 294424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2945f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 2946b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 2947336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2948336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 2949336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 2950336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2951336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 295289e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id) 2953336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 2954aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2955aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2956e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 295747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 2958f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 2959f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 2960336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2961dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Value *var_location = GetVariableValue (var, 2962f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context, 29638de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 29648de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 2965336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2966e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType()); 2967e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan 296830a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan if (parser_opaque_type.isNull()) 296930a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan return; 297030a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan 2971e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) 2972e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan { 2973e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan if (const TagType *tag_type = dyn_cast<TagType>(parser_type)) 2974e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan CompleteType(tag_type->getDecl()); 2975e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan } 2976e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan 29774b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 29784b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 29794b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 29806f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan NamedDecl *var_decl; 29816f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 29826f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan bool is_reference = ClangASTContext::IsReferenceType(pt.GetOpaqueQualType()); 29836f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 29846f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 29856f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); 29866f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 29876f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 29886f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 29898de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2990427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 299189e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj)); 299289e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan 2993427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 2994427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2995427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 2996427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2997427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2998427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 2999696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan entity->m_parser_vars->m_lldb_var = var; 300024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30016f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 30026f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan entity->m_flags |= ClangExpressionVariable::EVTypeIsReference; 30036f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 3004810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 30058de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3006aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan ASTDumper orig_dumper(ut.GetOpaqueQualType()); 3007a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 3008aa56141b061ca23a447d48c27bf1f35017405376Sean 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()); 30098de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 30108f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 30118f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 30128f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 3013a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 301467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan ClangExpressionVariableSP &pvar_sp, 301567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 3016a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 3017e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 301845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 3019427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 3020a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 3021f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (GuardedCopyType(m_ast_context, 3022427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 3023427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 3024f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 3025a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 3026dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!parser_type.GetOpaqueQualType()) 3027dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3028dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3029dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString()); 3030dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 3031dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 3032dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 30336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 30348c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3035427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 3036427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 3037427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 3038427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 3039427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 304045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 304145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 3042a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 3043a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 30449394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString()); 3045a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 3046a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 3047a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 30481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 3049819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 305067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol &symbol, 305167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 3052819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 3053819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 3054819749647b1605f75753f625050cb240292c08b0Sean Callanan 3055819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3056819749647b1605f75753f625050cb240292c08b0Sean Callanan 3057dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3058567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3059567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 3060567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return; 3061567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3062567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 3063819749647b1605f75753f625050cb240292c08b0Sean Callanan 3064fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)), 3065819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 3066819749647b1605f75753f625050cb240292c08b0Sean Callanan 3067f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(m_ast_context, true)), 3068f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 3069819749647b1605f75753f625050cb240292c08b0Sean Callanan 3070fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 3071819749647b1605f75753f625050cb240292c08b0Sean Callanan 3072819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 3073819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 3074dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 3075819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 3076819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 307747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 307847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3079819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 3080819749647b1605f75753f625050cb240292c08b0Sean Callanan 3081819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 3082819749647b1605f75753f625050cb240292c08b0Sean Callanan 30830c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton Address &symbol_address = symbol.GetAddress(); 3084567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 3085819749647b1605f75753f625050cb240292c08b0Sean Callanan 3086819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 3087819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 3088819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 3089819749647b1605f75753f625050cb240292c08b0Sean Callanan 3090fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->EnableParserVars(); 3091819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 3092819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_named_decl = var_decl; 3093819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_llvm_value = NULL; 3094819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_value = symbol_location.release(); 3095819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_sym = &symbol; 3096819749647b1605f75753f625050cb240292c08b0Sean Callanan 3097819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 3098819749647b1605f75753f625050cb240292c08b0Sean Callanan { 3099a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 3100819749647b1605f75753f625050cb240292c08b0Sean Callanan 31019394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 3102819749647b1605f75753f625050cb240292c08b0Sean Callanan } 3103819749647b1605f75753f625050cb240292c08b0Sean Callanan} 3104819749647b1605f75753f625050cb240292c08b0Sean Callanan 3105fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 3106fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 3107fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 3108fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3109dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3110567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3111567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 3112fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3113fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 3114fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 3115fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 3116fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3117fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 3118fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3119fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 3120fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3121fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl; 3122fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 3123fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3124fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 3125fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3126fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 3127fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 3128fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 3129fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3130fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3131fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 3132fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 3133a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl)); 3134a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString()); 3135fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3136fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3137fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 3138fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 3139fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 31405a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 3141fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3142dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 3143dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3144dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3145dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable"); 3146dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 31479880efacdd3a5e855b405d89433a01170422a889Jim Ingham return (bool) lldb::ClangExpressionVariableSP(); 3148dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 3149dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3150fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 3151fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3152fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 3153fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 3154fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3155fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangAST(user_type.GetASTContext()); 3156fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangType(user_type.GetOpaqueQualType()); 3157fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3158fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 3159fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3160fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 3161fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3162fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 3163fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 3164fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 3165819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 3166427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 316767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const RegisterInfo *reg_info, 316867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 31691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 31701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 31711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3172f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(m_ast_context, 31731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 31741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 31751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 31761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 31771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 3178122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen if (log) 317967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 31801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 31811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 31821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3183427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 3184f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan m_ast_context); 31851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 31861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 31871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3188dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 318947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 319047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3191427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 31921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 3193427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 3194427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 3195427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 3196427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 3197427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 3198427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 3199427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 320052d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan entity->m_flags |= ClangExpressionVariable::EVBareRegister; 32011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 320252d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (log) 32031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 3204a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 32059394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString()); 32061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 32071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 32081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 3209a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 3210da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 3211da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Function* fun, 321267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol* symbol, 321367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 32148f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 3215aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 3216aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 3217e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 32188f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 321958baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan NamedDecl *fun_decl = NULL; 32200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 322158baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan const Address *fun_address = NULL; 32228f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 32230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 32240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 32259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *fun_ast_context = NULL; 32268f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 32270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 32280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 32290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 32300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 32310fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 32320fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 32330fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 323467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no type"); 32350fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 32360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 32370fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 323804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton fun_opaque_type = fun_type->GetClangFullType(); 32390fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 32400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 32410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 32420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 324367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no Clang type"); 32440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 32450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 32460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 32470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 32480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 3249b01000fd063629facd45044f137446fb748ee179Greg Clayton fun_ast_context = fun_type->GetClangASTContext().getASTContext(); 3250f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan void *copied_type = GuardedCopyType(m_ast_context, fun_ast_context, fun_opaque_type); 3251a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (copied_type) 3252a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3253a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_decl = context.AddFunDecl(copied_type); 3254a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 3255a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton else 3256a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3257a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton // We failed to copy the type we found 3258a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (log) 3259a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 3260a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf (" Failed to import the function type '%s' {0x%8.8llx} into the expression parser AST contenxt", 3261a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetName().GetCString(), 3262a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton fun_type->GetID()); 3263a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 326416089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan 326516089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan return; 3266a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 32670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 32680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 32690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 32700c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton fun_address = &symbol->GetAddress(); 32710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 32720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 32730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 32748f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 3275810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 327667bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" AddOneFunction called with no function and no symbol"); 32778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 32788f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 32798f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3280dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 3281567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 3282567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target); 32838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 32848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 32858f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 3286dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 328747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 328847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 3289427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 32908de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 3291427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 3292427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 3293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 3294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 3295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 3296427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 3297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 3298427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 32998c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3300810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 33018de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 3302a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(fun_decl); 3303a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 33042975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan StreamString ss; 33052975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 33062975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription); 33072975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 33082975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s", 330967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 331067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (fun ? "specific" : "generic"), 33112975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan decl_name.c_str(), 33122975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan ss.GetData(), 3313a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ast_dumper.GetCString()); 33148de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 331524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 331693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 331793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 331893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 33193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 332067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id, 33213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 332293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 3323f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan ASTContext *parser_ast_context = m_ast_context; 33249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *user_ast_context = ut.GetASTContext(); 33253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3326ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 3327dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3328dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 3329dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 3330dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 3331dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3332dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 3333dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type"); 3334dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 3335dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 3336dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 33379394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 33383356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton if (add_method && ClangASTContext::IsAggregateType(copied_type) && ClangASTContext::GetCompleteType (parser_ast_context, copied_type)) 33393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 33403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 33413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 33423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 33433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3344716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan clang_type_t method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 3345716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 3346716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan args, 3347716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 1, 3348716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan false, 3349716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 3350716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 33511d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 33521d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 33531d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 335430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 335528ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan const bool is_attr_used = true; 33562581dbf7292c6272bb771fe396ab30921385d669Sean Callanan const bool is_artificial = false; 335730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 33581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 33591d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 33608de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 33611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 33621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 33631d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 33641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 336530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 3366716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan is_explicit, 33672581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_attr_used, 33682581dbf7292c6272bb771fe396ab30921385d669Sean Callanan is_artificial); 33693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 337093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 337193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 337293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 3373