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" 303b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Expression/Materializer.h" 31cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 336916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 43f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 44d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan#include "lldb/Target/ObjCLanguageRuntime.h" 45810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 4617c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 48f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4978b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 513bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5573b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) : 5673b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTSource (exe_ctx.GetTargetSP()), 578de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 588de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 59dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_keep_result_in_memory (keep_result_in_memory), 60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 61dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_struct_vars () 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 67aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // Note: The model is now that the parser's AST context and all associated 696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // data does not vanish until the expression has been executed. This means 706d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan // that valuable lookup data (like namespaces) doesn't vanish, but 716d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan 726d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan DidParse(); 73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 75aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 76166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool 773b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx, 783b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan Materializer *materializer) 796741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan{ 806741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan ClangASTMetrics::ClearLocalCounters(); 816741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan 82aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 83dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan m_parser_vars->m_exe_ctx = exe_ctx; 84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 86567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (exe_ctx.GetFramePtr()) 87567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything); 8876580088fc836397fa6e7336535d1b216c93fe7eSean Callanan else if (exe_ctx.GetThreadPtr() && exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)) 89567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (exe_ctx.GetProcessPtr()) 91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 92a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton m_parser_vars->m_sym_ctx.Clear(true); 93567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 94987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton else if (target) 96987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton { 97a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton m_parser_vars->m_sym_ctx.Clear(true); 98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP(); 99987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton } 10097ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan 101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target) 102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton m_parser_vars->m_persistent_vars = &target->GetPersistentVariables(); 104166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 105567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target->GetScratchClangASTContext()) 106567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 107567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 108166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan 10947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info = GetTargetInfo(); 1103b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan m_parser_vars->m_materializer = materializer; 11147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 112166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan return true; 113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 114c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 1153b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananvoid 116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 118952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1196741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan 1206741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan if (log) 1216741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan ClangASTMetrics::DumpCounters(log); 1226741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan 123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 129427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 1306f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham if (var_sp) 13131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp->DisableParserVars(GetParserID()); 132aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 134427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 137aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 138427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 139427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 14031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan pvar_sp->DisableParserVars(GetParserID()); 141aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 142aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 143aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1447a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo 15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo() 15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 15247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan assert (m_parser_vars.get()); 15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 15447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TargetInfo ret; 15547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 156dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 157dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 158dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Process *process = exe_ctx.GetProcessPtr(); 159dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (process) 16047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 161dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.byte_order = process->GetByteOrder(); 162dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.address_byte_size = process->GetAddressByteSize(); 163dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan } 164dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan else 165dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan { 166dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 167dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (target) 168567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton { 169dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.byte_order = target->GetArchitecture().GetByteOrder(); 170dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ret.address_byte_size = target->GetArchitecture().GetAddressByteSize(); 171567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton } 17247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 173dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan 17447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return ret; 17547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 17647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 1788de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 1798de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 1818de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 1826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 1836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 1846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 1858de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 186a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 188aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1890f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan if (m_parser_vars->m_materializer && is_result) 1900f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan { 1910f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan Error err; 1920f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 1930f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 1940f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 1950f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan if (target == NULL) 1960f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan return false; 1970f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 1980f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 1990f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2000f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan TypeFromUser user_type(m_ast_importer->DeportType(context, 2010f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan parser_type.GetASTContext(), 2020f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan parser_type.GetOpaqueQualType()), 2030f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan context); 2040f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2050f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(user_type, is_lvalue, m_keep_result_in_memory, err); 2060f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 207a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan ClangExpressionVariableSP var_sp = m_found_entities.CreateVariable(exe_ctx.GetBestExecutionContextScope(), 208a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan name, 209a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan user_type, 210a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan m_parser_vars->m_target_info.byte_order, 211a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan m_parser_vars->m_target_info.address_byte_size); 2120f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2130f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan if (!var_sp) 2140f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan return false; 2150f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2160f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan var_sp->EnableParserVars(GetParserID()); 2170f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2180f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID()); 2190f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2200f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan parser_vars->m_named_decl = decl; 2210f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan parser_vars->m_parser_type = parser_type; 2220f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2230f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan var_sp->EnableJITVars(GetParserID()); 2240f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2250f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID()); 2260f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2270f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan jit_vars->m_offset = offset; 2280f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 2290f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan return true; 2300f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan } 2310f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 232952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 233dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 234dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 235567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 236567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return false; 237567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 238567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *context(target->GetScratchClangASTContext()->getASTContext()); 239a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2400539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan TypeFromUser user_type(m_ast_importer->DeportType(context, 2410539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetASTContext(), 2420539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan parser_type.GetOpaqueQualType()), 24397678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 2445a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan 2455a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (!user_type.GetOpaqueQualType()) 2465a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan { 2475a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan if (log) 2485a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Persistent variable's type wasn't copied successfully"); 2495a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan return false; 2505a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan } 25147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 25247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (!m_parser_vars->m_target_info.IsValid()) 25347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return false; 254a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 255a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan ClangExpressionVariableSP var_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (), 256a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan name, 257a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan user_type, 258a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan m_parser_vars->m_target_info.byte_order, 259a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan m_parser_vars->m_target_info.address_byte_size); 2608c12720c108cd5e7ed792596749218d8400f647eSean Callanan 261427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 2628c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 2638c12720c108cd5e7ed792596749218d8400f647eSean Callanan 264bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan var_sp->m_frozen_sp->SetHasCompleteType(); 265bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan 2666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 2676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 2686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 2696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 2706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 2726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 2746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 2756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 2766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 2786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 2806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 281f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan if (m_keep_result_in_memory) 282f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan { 283f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 284f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan } 285f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan 2866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 2876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 2886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 28931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp->EnableParserVars(GetParserID()); 29031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 29131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID()); 2928c12720c108cd5e7ed792596749218d8400f647eSean Callanan 29331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = decl; 29431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 2958c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2968c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 297a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 298a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 299a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 3008de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 3018de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 3038de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 3048de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 3058de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 3068de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 3078de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 3088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 309aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 310aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 311aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 3129d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan bool is_persistent_variable = false; 3139d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan 314952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 31545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 316aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 3178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 31831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (m_struct_members.GetVariable(decl, GetParserID())) 3198c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 3208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 32131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID())); 3228c12720c108cd5e7ed792596749218d8400f647eSean Callanan 323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 3249d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan { 32531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID()); 3269d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan is_persistent_variable = true; 3279d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan } 3288c12720c108cd5e7ed792596749218d8400f647eSean Callanan 329427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 3308c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 3318c12720c108cd5e7ed792596749218d8400f647eSean Callanan 33245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 3335a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure", 33445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 3358de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 336427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 33745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 3388c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 3398c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 3408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 34131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID()); 34231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 34331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = value; 34431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 3450f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan if (ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID())) 3460f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan { 3470f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan // We already laid this out; do not touch 3480f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 3490f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan if (log) 3500f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan log->Printf("Already placed at 0x%llx", (unsigned long long)jit_vars->m_offset); 3510f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan } 3520f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan 35331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan var_sp->EnableJITVars(GetParserID()); 35431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 35531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID()); 35631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 35731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan jit_vars->m_alignment = alignment; 35831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan jit_vars->m_size = size; 3598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 360427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 3618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3629d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan if (m_parser_vars->m_materializer) 3639d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan { 364ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan uint32_t offset = 0; 365ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan 3669d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan Error err; 3679d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan 3689d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan if (is_persistent_variable) 3699d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan { 370ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan offset = m_parser_vars->m_materializer->AddPersistentVariable(var_sp, err); 3719d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan } 3729d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan else 3739d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan { 3749d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym) 375ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan offset = m_parser_vars->m_materializer->AddSymbol(*sym, err); 3769d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan else if (const RegisterInfo *reg_info = var_sp->GetRegisterInfo()) 377ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err); 3789d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan else if (parser_vars->m_lldb_var) 379ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan offset = m_parser_vars->m_materializer->AddVariable(parser_vars->m_lldb_var, err); 3809d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan } 381ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan 382ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan if (!err.Success()) 383ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan return false; 384ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan 385ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan if (log) 386ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan log->Printf("Placed at 0x%llx", (unsigned long long)offset); 387ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan 388ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan jit_vars->m_offset = offset; // TODO DoStructLayout() should not change this. 3899d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan } 3909d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan 3918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 3928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 3938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 3958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 3968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 397aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 398aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 399aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 4008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 4018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 402a6686e36cd56843e594139324884585fb47b918bSean Callanan if (!m_parser_vars->m_materializer) 403a6686e36cd56843e594139324884585fb47b918bSean Callanan return false; 4048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 405a6686e36cd56843e594139324884585fb47b918bSean Callanan m_struct_vars->m_struct_alignment = m_parser_vars->m_materializer->GetStructAlignment(); 406a6686e36cd56843e594139324884585fb47b918bSean Callanan m_struct_vars->m_struct_size = m_parser_vars->m_materializer->GetStructByteSize(); 407aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 4088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 4098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 4108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4118de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 4128de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4138de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 4148de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 4158de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 4168de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 4178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 418aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 419aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 420aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 4218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 4228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 423427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 424aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 425aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 4268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 4288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 4298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 4318de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 4328de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *&decl, 4348de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 4358de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 4368de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 4378de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 4388de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 4398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 440aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 441aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 442aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 4438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 4448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 445427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 4468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 4478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 448427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 4498c12720c108cd5e7ed792596749218d8400f647eSean Callanan 45031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!member_sp) 45131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan return false; 45231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 45331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = member_sp->GetParserVars(GetParserID()); 45431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID()); 45531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 45631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan if (!parser_vars || 45731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan !jit_vars || 45853a5a9986e2a201717ea723f67ae32571be95b32Sean Callanan !member_sp->GetValueObject()) 4598c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 46131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan decl = parser_vars->m_named_decl; 46231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan value = parser_vars->m_llvm_value; 46331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan offset = jit_vars->m_offset; 464427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 4658c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 4678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 4688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 46902fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 4708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 4718de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const NamedDecl *decl, 4738de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 4748de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 475ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 47631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl, GetParserID())); 4778c12720c108cd5e7ed792596749218d8400f647eSean Callanan 478427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 4798c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 480ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 483ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 48431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity_sp->GetParserVars(GetParserID()); 48531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 48652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ptr = parser_vars->m_lldb_value.GetScalar().ULongLong(); 4878c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4888c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 489ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 490ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 491ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void 492ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext 493ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan( 494ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan const ConstString &name, 495ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContext &sym_ctx, 496ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan SymbolContextList &sc_list 497ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan) 498ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{ 4994f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec SymbolContextList temp_sc_list; 500ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan if (sym_ctx.module_sp) 5014f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list); 502ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 5034f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec if (!sc_list.GetSize() && sym_ctx.target_sp) 5044f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list); 5054f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 5064f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec unsigned temp_sc_list_size = temp_sc_list.GetSize(); 5074f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec for (unsigned i = 0; i < temp_sc_list_size; i++) 5084f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec { 5094f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec SymbolContext sym_ctx; 5104f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec temp_sc_list.GetContextAtIndex(i, sym_ctx); 5114f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec if (sym_ctx.symbol) 5124f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec { 5134f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec switch (sym_ctx.symbol->GetType()) 5144f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec { 5154f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec case eSymbolTypeCode: 5164f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec case eSymbolTypeResolver: 5174f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec sc_list.Append(sym_ctx); 5184f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec break; 5194f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 5204f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec default: 5214f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec break; 5224f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec } 5234f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec } 5244f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec } 525ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan} 526ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan 527f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 5288de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 5298de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5308de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 531da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 5328de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 533f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 534aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 535aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 536952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 537dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx; 538dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = exe_ctx.GetTargetPtr(); 539f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 540567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 54178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 54278b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 543f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 544f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 545e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 546f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 547ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list); 5484f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 549e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 550aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 551aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 552aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 553aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 5540eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan if (!strncmp(name.GetCString(), "_ZN", 3) && 5550eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan strncmp(name.GetCString(), "_ZNK", 4)) 556aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 5570eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan std::string fixed_scratch("_ZNK"); 5580eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan fixed_scratch.append(name.GetCString() + 3); 5590eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan ConstString fixed_name(fixed_scratch.c_str()); 560aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 561aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 5620eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString()); 5630eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan 5640eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list); 565aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 566aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 567aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 568aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 569f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 5704f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 571f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 572e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 5734f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 574da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 5754f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec bool is_indirect_function = false; 5764f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 577f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 578da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 5794f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec else if (sym_ctx.symbol) { 5800c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton func_so_addr = &sym_ctx.symbol->GetAddress(); 5814f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec is_indirect_function = sym_ctx.symbol->IsIndirect(); 5824f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec } else 583f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 5844f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 585ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 586ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 5874f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 5884f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec func_addr = func_so_addr->GetCallableLoadAddress (target, is_indirect_function); 589da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 590f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 591f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 592f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 593cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 594d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, Process *process, const ConstString &name, lldb::SymbolType symbol_type) 595c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 596c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 597c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 59821ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list); 599c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 600cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 601cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 602cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 60321ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++) 604cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 605cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 606cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 607c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 6080c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddress(); 609ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 610ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 61195cad867ca439a7ad2e7566c1524646ad0a062bcSean Callanan continue; 612ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 613cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 614cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 615cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 616cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 617cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 618cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 619cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 620cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 6214f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 6224f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec case eSymbolTypeResolver: 6234f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec symbol_load_addr = sym_address->GetCallableLoadAddress (&target, true); 6244f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec break; 6254f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 626cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 627cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 628cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 629cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 630cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 631cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 632cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 633cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 634cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 635cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 636cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 637cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 638cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 639cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 640cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 641cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 642cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 643cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 644cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 645cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 646cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 647cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 6483f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCClass: 6493f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCMetaClass: 6503f69eacbb218a37390822c89d3675bd740590382Greg Clayton case eSymbolTypeObjCIVar: 651cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 652cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 653cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 654cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 655cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 656c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 657d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan if (symbol_load_addr == LLDB_INVALID_ADDRESS && process) 658d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan { 659d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime(); 660d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan 661d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan if (runtime) 662d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan { 663d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan symbol_load_addr = runtime->LookupRuntimeSymbol(name); 664d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan } 665d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan } 666d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan 667cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 668c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 669c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 670cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 67121ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type) 672819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 673819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 674819749647b1605f75753f625050cb240292c08b0Sean Callanan 675dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (!m_parser_vars->m_exe_ctx.GetTargetPtr()) 676819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 677819749647b1605f75753f625050cb240292c08b0Sean Callanan 678d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), m_parser_vars->m_exe_ctx.GetProcessPtr(), name, symbol_type); 679819749647b1605f75753f625050cb240292c08b0Sean Callanan} 680819749647b1605f75753f625050cb240292c08b0Sean Callanan 68101e6a58b057676d5dc434876dbb2d54871bb962eGreg Claytonconst Symbol * 68201e6a58b057676d5dc434876dbb2d54871bb962eGreg ClaytonClangExpressionDeclMap::FindGlobalDataSymbol (Target &target, 68301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const ConstString &name) 684819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 685819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 686819749647b1605f75753f625050cb240292c08b0Sean Callanan 68701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); 688819749647b1605f75753f625050cb240292c08b0Sean Callanan 68901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const uint32_t matches = sc_list.GetSize(); 69001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton for (uint32_t i=0; i<matches; ++i) 691819749647b1605f75753f625050cb240292c08b0Sean Callanan { 692819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 69301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 69401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton if (sym_ctx.symbol) 69501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton { 69601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Symbol *symbol = sym_ctx.symbol; 69701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Address *sym_address = &symbol->GetAddress(); 69801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton 69901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton if (sym_address && sym_address->IsValid()) 70001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton { 70101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton switch (symbol->GetType()) 70201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton { 70301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeData: 70401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeRuntime: 70501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeAbsolute: 70601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeObjCClass: 70701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeObjCMetaClass: 70801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeObjCIVar: 70901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton if (symbol->GetDemangledNameIsSynthesized()) 71001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton { 71101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton // If the demangled name was synthesized, then don't use it 71201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton // for expressions. Only let the symbol match if the mangled 71301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton // named matches for these symbols. 71401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton if (symbol->GetMangled().GetMangledName() != name) 71501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton break; 71601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton } 71701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton return symbol; 71801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton 71901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeCode: // We already lookup functions elsewhere 72001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeVariable: 72101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeLocal: 72201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeParam: 72301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeTrampoline: 72401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeInvalid: 72501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeException: 72601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeSourceFile: 72701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeHeaderFile: 72801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeObjectFile: 72901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeCommonBlock: 73001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeBlock: 73101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeVariableType: 73201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeLineEntry: 73301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeLineHeader: 73401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeScopeBegin: 73501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeScopeEnd: 73601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeAdditional: 73701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeCompiler: 73801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeInstrumentation: 73901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton case eSymbolTypeUndefined: 7404f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec case eSymbolTypeResolver: 74101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton break; 74201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton } 74301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton } 74401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton } 745819749647b1605f75753f625050cb240292c08b0Sean Callanan } 746819749647b1605f75753f625050cb240292c08b0Sean Callanan 747819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 748819749647b1605f75753f625050cb240292c08b0Sean Callanan} 749819749647b1605f75753f625050cb240292c08b0Sean Callanan 75047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP 75147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable 75247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan( 75347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan Target &target, 75494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ModuleSP &module, 75594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan const ConstString &name, 75694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan ClangNamespaceDecl *namespace_decl, 75747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan TypeFromUser *type 75847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan) 75947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{ 76047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableList vars; 76147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 76294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan if (module && namespace_decl) 76394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan module->FindGlobalVariables (name, namespace_decl, true, -1, vars); 76494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan else 76594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan target.GetImages().FindGlobalVariables(name, true, -1, vars); 76647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 76747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (vars.GetSize()) 76847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 76947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (type) 77047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 77147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan for (size_t i = 0; i < vars.GetSize(); ++i) 77247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 77347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan VariableSP var_sp = vars.GetVariableAtIndex(i); 77447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 77552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (ClangASTContext::AreTypesSame(*type, var_sp->GetType()->GetClangFullType())) 77652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return var_sp; 77747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 77847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 77947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan else 78047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 78147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return vars.GetVariableAtIndex(0); 78247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 78347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return VariableSP(); 78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan} 78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 79016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 791f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context) 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 793f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 794f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 7956741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan ClangASTMetrics::RegisterVisibleQuery(); 7966741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan 797f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 798f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan 799952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8019394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (GetImportInProgress()) 802ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 80367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 804ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 805ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 806ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 807e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 80867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan static unsigned int invocation_id = 0; 80967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id = invocation_id++; 81067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan 81116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 81216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 81316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (!context.m_decl_context) 8149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString()); 81516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context)) 8169394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str()); 81716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan else 8189394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName()); 81916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 8209394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 82116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context)) 82216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 82373b520f4f60dca58e58e446c9504d45384ee677bSean Callanan ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context); 824a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 82567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan if (log && log->GetVerbose()) 8265a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan log->Printf(" CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)", 82767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 82867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan namespace_map.get(), 82967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan (int)namespace_map->size()); 830a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 831a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan if (!namespace_map) 832a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan return; 833a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan 83416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end(); 83516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i != e; 83616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ++i) 83716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 83816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 8399394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching namespace %s in module %s", 84067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 84116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->second.GetNamespaceDecl()->getNameAsString().c_str(), 84216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan i->first->GetFileSpec().GetFilename().GetCString()); 84316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 844c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan FindExternalVisibleDecls(context, 845c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->first, 846c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan i->second, 84767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 84816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 84916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 850e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan else if (isa<TranslationUnitDecl>(context.m_decl_context)) 85116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan { 85216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan ClangNamespaceDecl namespace_decl; 85316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 85416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan if (log) 8559394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Searching the root namespace", current_id); 85616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 85716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan FindExternalVisibleDecls(context, 85816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan lldb::ModuleSP(), 85916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan namespace_decl, 86067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id); 86116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan } 862a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan 8639394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan if (!context.m_found.variable) 8649394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan ClangASTSource::FindExternalVisibleDecls(context); 86516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan} 86616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 86716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid 86816b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context, 86938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan lldb::ModuleSP module_sp, 87003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ClangNamespaceDecl &namespace_decl, 87167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 87216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{ 873f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan assert (m_ast_context); 87416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan 875952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 8769394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 877e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8799394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan const ConstString name(context.m_decl_name.getAsString().c_str()); 8809394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 8813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 8823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 8833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 8843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 8859394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 8868f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString id_name("id"); 8878f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan static ConstString Class_name("Class"); 8888f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 8898f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan if (name == id_name || name == Class_name) 8908f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan return; 8918f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan 8928de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 8938de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 894dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 895dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr(); 89603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (name_unique_cstr[0] == '$' && !namespace_decl) 8973cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 89857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 90157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 90257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 90375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 90475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (frame == NULL) 90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 90775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 90857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 90975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!sym_ctx.function) 91057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 91157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 912b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton // Get the block that defines the function 913b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton Block *function_block = sym_ctx.GetFunctionBlock(); 914b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 915b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton if (!function_block) 916b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton return; 917b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 918b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton clang::DeclContext *decl_context = function_block->GetClangDeclContext(); 91957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 92075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan if (!decl_context) 92157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 92257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 92375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context); 92457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 925c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (method_decl) 9263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 927c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham clang::CXXRecordDecl *class_decl = method_decl->getParent(); 928c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 929c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_qual_type(class_decl->getTypeForDecl(), 0); 930c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 931c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(), 932c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &class_decl->getASTContext()); 933c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 934c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (log) 935c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 936c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ASTDumper ast_dumper(class_qual_type); 937c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham log->Printf(" CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString()); 938c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 939c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 940dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan TypeFromParser class_type = CopyClassType(class_user_type, current_id); 941dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 942dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan if (!class_type.IsValid()) 943dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan return; 944dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 945d9c7d40d73a47581ed3ca06eb7282dc7a353b46eSean Callanan TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(QualType::getFromOpaquePtr(class_type.GetOpaqueQualType())); 946dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 947dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan if (!type_source_info) 948dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan return; 949dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 950dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan TypedefDecl *typedef_decl = TypedefDecl::Create(*m_ast_context, 951dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan m_ast_context->getTranslationUnitDecl(), 952dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan SourceLocation(), 953dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan SourceLocation(), 954dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan context.m_decl_name.getAsIdentifierInfo(), 955dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan type_source_info); 956dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 957dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 958dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan if (!typedef_decl) 959dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan return; 960dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 961dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan context.AddNamedDecl(typedef_decl); 962c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 963c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (method_decl->isInstance()) 964c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 965c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // self is a pointer to the object 966c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 967c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type); 968c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 969c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(), 970c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &method_decl->getASTContext()); 971c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 972c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = self_user_type; 973c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 974c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 975c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham else 976bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan { 977c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // This branch will get hit if we are executing code in the context of a function that 978c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a 979c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // method of the class. In that case, just look up the "this" variable in the the current 980c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // scope and use its type. 981c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer 982c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // for C++ so it hasn't actually been tested. 983bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 984c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham VariableList *vars = frame->GetVariableList(false); 985bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 986c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 987bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 988c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (this_var && 989c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham this_var->IsInScope(frame) && 990c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham this_var->LocationIsValidForFrame (frame)) 991c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 992c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham Type *this_type = this_var->GetType(); 993c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 994c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (!this_type) 995c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 996c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 99752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType pointee_type = this_type->GetClangForwardType().GetPointeeType(); 998c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 99952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (pointee_type.IsValid()) 1000c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 1001c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (log) 1002c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 1003c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ASTDumper ast_dumper(this_type->GetClangFullType()); 1004c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 1005c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 1006c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 100752f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromUser class_user_type(pointee_type); 1008dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan AddOneType(context, class_user_type, current_id); 1009c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1010c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 101152f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromUser this_user_type(this_type->GetClangFullType()); 1012c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = this_user_type; 1013c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 1014c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 1015c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 1016bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan } 1017bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan 101857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 101957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 102057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 10213aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 10223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 10233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 10243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 10253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 1026567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!frame) 102747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan return; 1028e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 1029e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction); 103047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1031e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!sym_ctx.function) 1032e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan return; 103303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 1034b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton // Get the block that defines the function 1035b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton Block *function_block = sym_ctx.GetFunctionBlock(); 1036e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 1037b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton if (!function_block) 1038b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton return; 1039b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton 1040b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton clang::DeclContext *decl_context = function_block->GetClangDeclContext(); 1041e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 1042e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan if (!decl_context) 10433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 104403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 1045e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context); 1046e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan 1047c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (method_decl) 1048e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan { 1049c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ObjCInterfaceDecl* self_interface = method_decl->getClassInterface(); 105075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 1051c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (!self_interface) 105275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan return; 105375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 1054c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham const clang::Type *interface_type = self_interface->getTypeForDecl(); 105573e6eecb1038137738d129b116d2bb22ce5f7368Sean Callanan 105673e6eecb1038137738d129b116d2bb22ce5f7368Sean Callanan if (!interface_type) 105773e6eecb1038137738d129b116d2bb22ce5f7368Sean Callanan return; // This is unlikely, but we have seen crashes where this occurred 1058c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1059c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(), 1060c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &method_decl->getASTContext()); 106175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 1062c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (log) 1063c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 1064c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ASTDumper ast_dumper(interface_type); 1065c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 1066c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 1067c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1068dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan AddOneType(context, class_user_type, current_id); 1069c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1070c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (method_decl->isInstanceMethod()) 1071c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 1072c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // self is a pointer to the object 1073c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1074c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0)); 1075c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1076c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(), 1077c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &method_decl->getASTContext()); 1078c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1079c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = self_user_type; 1080c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 1081c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham else 1082c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 1083c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // self is a Class pointer 1084c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham QualType class_type = method_decl->getASTContext().getObjCClassType(); 1085c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1086c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham TypeFromUser self_user_type(class_type.getAsOpaquePtr(), 1087c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham &method_decl->getASTContext()); 1088c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1089c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = self_user_type; 1090c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 1091c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1092c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 109375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 109475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan else 109575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan { 1096c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // This branch will get hit if we are executing code in the context of a function that 1097c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a 1098c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // method of the class. In that case, just look up the "self" variable in the the current 1099c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham // scope and use its type. 1100c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1101c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham VariableList *vars = frame->GetVariableList(false); 110275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 1103c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 110475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 1105c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (self_var && 1106c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham self_var->IsInScope(frame) && 1107c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham self_var->LocationIsValidForFrame (frame)) 1108c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 1109c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham Type *self_type = self_var->GetType(); 1110c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1111c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (!self_type) 1112c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 1113c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 111452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType self_clang_type = self_type->GetClangFullType(); 1115c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 111652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (self_clang_type.IsObjCClassType()) 1117288ddfedeb1946d68e467f342f600e9325060e51Sean Callanan { 1118288ddfedeb1946d68e467f342f600e9325060e51Sean Callanan return; 1119288ddfedeb1946d68e467f342f600e9325060e51Sean Callanan } 112052f792329be5db8e38961350589e97e8f2823acdGreg Clayton else if (self_clang_type.IsObjCObjectPointerType()) 1121c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 112252f792329be5db8e38961350589e97e8f2823acdGreg Clayton self_clang_type = self_clang_type.GetPointeeType(); 112352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 112452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!self_clang_type) 11255d2dab4f7dc12ca210390c6e691a05f3a69ec4b1Sean Callanan return; 11265d2dab4f7dc12ca210390c6e691a05f3a69ec4b1Sean Callanan 1127c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham if (log) 1128c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham { 1129c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham ASTDumper ast_dumper(self_type->GetClangFullType()); 1130c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham log->Printf(" FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString()); 1131c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 1132c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 113352f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromUser class_user_type (self_clang_type); 1134288ddfedeb1946d68e467f342f600e9325060e51Sean Callanan 1135dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan AddOneType(context, class_user_type, current_id); 1136c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 113752f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromUser self_user_type(self_type->GetClangFullType()); 1138c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham 1139c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham m_struct_vars->m_object_pointer_type = self_user_type; 1140c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham return; 1141c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 1142c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham } 114375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan } 114475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan 11453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 11463aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 1147c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan 1148c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan // any other $__lldb names should be weeded out now 1149c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1)) 1150c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan return; 115103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 11522431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan do 11532431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan { 1154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (!target) 11552431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 11562431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 1157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext(); 11582431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11592431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_clang_ast_context) 11602431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 11612431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11622431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext(); 11632431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11642431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!scratch_ast_context) 11652431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 11662431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11672431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name); 116803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 11692431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!ptype_type_decl) 11702431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 11712431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 1172e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl); 11732431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11742431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_decl) 11752431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 11762431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11772431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl); 11782431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (!parser_ptype_type_decl) 11802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan break; 11812431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan if (log) 11839394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString()); 11842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 11852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan context.AddNamedDecl(parser_ptype_type_decl); 11862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan } while (0); 11872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan 1188427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 118903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 1190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 11911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 119267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneVariable(context, pvar_sp, current_id); 11931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 11941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 11951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 11961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 11971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1198dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan if (m_parser_vars->m_exe_ctx.GetRegisterContext()) 11991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1200dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name)); 12019394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan 12021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 1203e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan { 1204e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan if (log) 12059394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found register %s", current_id, reg_info->name); 1206e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan 120767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneRegister(context, reg_info, current_id); 1208e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan } 12091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 12108de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 121103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 121203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 121303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ValueObjectSP valobj; 121403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan VariableSP var; 121503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Error err; 121603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 121703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (frame && !namespace_decl) 121803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 121903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr, 122003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan eNoDynamicValues, 1221edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan StackFrame::eExpressionPathOptionCheckPtrVsMember || 1222edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan StackFrame::eExpressionPathOptionsAllowDirectIVarAccess || 1223edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan StackFrame::eExpressionPathOptionsNoFragileObjcIvar || 1224edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan StackFrame::eExpressionPathOptionsNoSyntheticChildren || 1225edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan StackFrame::eExpressionPathOptionsNoSyntheticArrayRange, 122603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan var, 122703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan err); 122803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 122903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // If we found a variable in scope, no need to pull up function names 1230b386d82334b65fb984348f2027b1cb7714de993fSean Callanan if (err.Success() && var) 123103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 123289e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 123316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 12343a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan return; 123503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 123603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 12371c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan 12381c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan if (target) 123903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 124094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan var = FindGlobalVariable (*target, 124138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp, 124294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan name, 124394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan &namespace_decl, 124403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan NULL); 124503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 124603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (var) 124703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 1248f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan valobj = ValueObjectVariable::Create(target, var); 124989e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan AddOneVariable(context, var, valobj, current_id); 125016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 12511c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan return; 125203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 125303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 125403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 125516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.variable) 125603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 1257302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan const bool include_inlines = false; 125803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan const bool append = false; 1259a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 126038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan if (namespace_decl && module_sp) 1261a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 126251cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan const bool include_symbols = false; 126351cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan 126438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan module_sp->FindFunctions(name, 126538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan &namespace_decl, 126638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan eFunctionNameTypeBase, 126738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan include_symbols, 1268302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 126938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan append, 127038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan sc_list); 1271a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 12726f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham else if (target && !namespace_decl) 1273a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan { 127451cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan const bool include_symbols = true; 127551cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan 12762975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // TODO Fix FindFunctions so that it doesn't return 12772975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // instance methods for eFunctionNameTypeBase. 12782975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 1279a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan target->GetImages().FindFunctions(name, 1280296b06d325413723f5aac5988eed977b278a7807Greg Clayton eFunctionNameTypeFull, 1281a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan include_symbols, 1282302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan include_inlines, 1283a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan append, 1284a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan sc_list); 1285a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan } 1286a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan 128703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sc_list.GetSize()) 128803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 128903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *generic_symbol = NULL; 129003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan Symbol *non_extern_symbol = NULL; 129103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 129203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 129303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan index < num_indices; 129403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan ++index) 129503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 129603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan SymbolContext sym_ctx; 129703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 129803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 129903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.function) 130003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 13012975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext(); 13022975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 130398e61d33e675ac085518e1cd758a8a324886035aSean Callanan if (!decl_ctx) 130498e61d33e675ac085518e1cd758a8a324886035aSean Callanan continue; 130598e61d33e675ac085518e1cd758a8a324886035aSean Callanan 13062975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan // Filter out class/instance methods. 13072975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx)) 13082975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan continue; 13092975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan if (dyn_cast<clang::CXXMethodDecl>(decl_ctx)) 13102975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan continue; 13112975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 131279e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan AddOneFunction(context, sym_ctx.function, NULL, current_id); 131316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function_with_type_info = true; 131416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 131503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 131603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (sym_ctx.symbol) 131703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 131803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (sym_ctx.symbol->IsExternal()) 131903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan generic_symbol = sym_ctx.symbol; 132003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else 132103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan non_extern_symbol = sym_ctx.symbol; 132203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 132303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 132403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 132516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan if (!context.m_found.function_with_type_info) 132603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 132703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (generic_symbol) 132803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 132967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, generic_symbol, current_id); 133016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 133103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 133203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan else if (non_extern_symbol) 133303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 133467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneFunction (context, NULL, non_extern_symbol, current_id); 133516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.function = true; 133603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 133703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 133803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 133903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 13400c2921f5b9dab2ca1832bb746ab3aa3f66fdd0b5Jim Ingham if (target && !context.m_found.variable && !namespace_decl) 134103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 134216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan // We couldn't find a non-symbol variable for this. Now we'll hunt for a generic 134303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 134403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 134501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Symbol *data_symbol = FindGlobalDataSymbol(*target, name); 134603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan 134703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan if (data_symbol) 134803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan { 134967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan AddOneGenericVariable(context, *data_symbol, current_id); 135016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan context.m_found.variable = true; 135103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 135203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 135303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan } 1354b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan } 135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1356e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 135769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callananstatic clang_type_t 135869716a233f3240978bdbd7a8b682b31e7e07e498Sean CallananMaybePromoteToBlockPointerType 135969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan( 136069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan ASTContext *ast_context, 136169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan clang_type_t candidate_type 136269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan) 136369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan{ 136469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!candidate_type) 136569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 136669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 136769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type); 136869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 136969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type); 137069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 137169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!candidate_pointer_type) 137269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 137369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 137469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType pointee_qual_type = candidate_pointer_type->getPointeeType(); 137569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 137669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type); 137769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 137869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_type) 137969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 138069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 138169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan RecordDecl *pointee_record_decl = pointee_record_type->getDecl(); 138269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 138369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_decl->isRecord()) 138469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 138569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 138669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_"))) 138769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return candidate_type; 138869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 138969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy); 139069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type); 139169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 139269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan return block_pointer_type.getAsOpaquePtr(); 139369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan} 139469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan 139552f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 139652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangExpressionDeclMap::GetVariableValue (VariableSP &var, 139752f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb_private::Value &var_location, 139852f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromUser *user_type, 139952f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromParser *parser_type) 140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1401952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 14026184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1407810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1408810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 140952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141252f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType var_clang_type = var_type->GetClangFullType(); 141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 141452f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!var_clang_type) 141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1416810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1417810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 141852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 142152f792329be5db8e38961350589e97e8f2823acdGreg Clayton // commented out because of <rdar://problem/11024417> 14229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 142352f792329be5db8e38961350589e97e8f2823acdGreg Clayton 1424b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1426810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1427810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 142852f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 143052f792329be5db8e38961350589e97e8f2823acdGreg Clayton //var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type); 143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1432336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 1433336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1434178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 1435178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 1436dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1437567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1438178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 1439178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 1440178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 1441178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 1442567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target); 1443178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1446c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan if (var->GetLocationIsConstantValueData()) 1447c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan { 1448c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan DataExtractor const_value_extractor; 1449c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan 1450c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan if (var_location_expr.GetExpressionData(const_value_extractor)) 1451c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan { 145252f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_location = Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize()); 145352f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_location.SetValueType(Value::eValueTypeHostAddress); 1454c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan } 1455c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan else 1456c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan { 1457c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan if (log) 1458c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan log->Printf("Error evaluating constant variable: %s", err.AsCString()); 145952f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 1460c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan } 1461c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan } 1462668010966e95642360fd12094b28755e5dda5343Greg Clayton 146352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType type_to_use = GuardedCopyType(var_clang_type); 1464336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 146552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!type_to_use) 1466f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 146752f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (log) 146852f792329be5db8e38961350589e97e8f2823acdGreg Clayton log->Printf("Couldn't copy a variable's type into the parser's AST context"); 14694b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 147052f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 1471f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 147352f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (parser_type) 147452f792329be5db8e38961350589e97e8f2823acdGreg Clayton *parser_type = TypeFromParser(type_to_use); 147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 147652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (var_location.GetContextType() == Value::eContextTypeInvalid) 147752f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_location.SetClangType(type_to_use); 147852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 147952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (var_location.GetValueType() == Value::eValueTypeFileAddress) 148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 1483336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 14853160832f026e60e832da55f90993a40ad132e360Michael Sartain return false; 14867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 148752f792329be5db8e38961350589e97e8f2823acdGreg Clayton Address so_addr(var_location.GetScalar().ULongLong(), var_sc.module_sp->GetSectionList()); 148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1489567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t load_addr = so_addr.GetLoadAddress(target); 149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 149147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 149247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan { 149352f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_location.GetScalar() = load_addr; 149452f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_location.SetValueType(Value::eValueTypeLoadAddress); 149547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan } 149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1498f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 149952f792329be5db8e38961350589e97e8f2823acdGreg Clayton *user_type = TypeFromUser(var_clang_type); 1500336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 150152f792329be5db8e38961350589e97e8f2823acdGreg Clayton return true; 1502336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 1503336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1504336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 150589e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id) 1506336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 1507aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1508aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1509952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 151047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan 1511f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 1512f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 151352f792329be5db8e38961350589e97e8f2823acdGreg Clayton Value var_location; 1514336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 151552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!GetVariableValue (var, var_location, &ut, &pt)) 151652f792329be5db8e38961350589e97e8f2823acdGreg Clayton return; 1517336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1518e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType()); 1519e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan 152030a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan if (parser_opaque_type.isNull()) 152130a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan return; 152230a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan 1523e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan if (const clang::Type *parser_type = parser_opaque_type.getTypePtr()) 1524e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan { 1525e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan if (const TagType *tag_type = dyn_cast<TagType>(parser_type)) 1526e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan CompleteType(tag_type->getDecl()); 1527e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan } 1528e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan 15296f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 153052f792329be5db8e38961350589e97e8f2823acdGreg Clayton bool is_reference = pt.IsReferenceType(); 15316f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 153252f792329be5db8e38961350589e97e8f2823acdGreg Clayton NamedDecl *var_decl = NULL; 15336f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 153452f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_decl = context.AddVarDecl(pt); 15356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan else 153652f792329be5db8e38961350589e97e8f2823acdGreg Clayton var_decl = context.AddVarDecl(pt.GetLValueReferenceType()); 15376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 15388de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 1539427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 154089e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj)); 154189e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan 1542427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 154331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan entity->EnableParserVars(GetParserID()); 154431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 154531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = pt; 154631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = var_decl; 154731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = NULL; 154831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_value = var_location; 154931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_var = var; 155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan if (is_reference) 15526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan entity->m_flags |= ClangExpressionVariable::EVTypeIsReference; 15536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan 1554810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 15558de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1556aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan ASTDumper orig_dumper(ut.GetOpaqueQualType()); 1557a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 1558aa56141b061ca23a447d48c27bf1f35017405376Sean 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()); 15598de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 15608f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 15618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 15628f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 1563a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 156467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan ClangExpressionVariableSP &pvar_sp, 156567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 1566a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 1567952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 156845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 1569427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 1570a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 157152f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromParser parser_type (GuardedCopyType(user_type)); 1572a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1573dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!parser_type.GetOpaqueQualType()) 1574dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 1575dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 1576dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf(" CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString()); 1577dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan return; 1578dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 1579dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 158052f792329be5db8e38961350589e97e8f2823acdGreg Clayton NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType()); 15818c12720c108cd5e7ed792596749218d8400f647eSean Callanan 158231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan pvar_sp->EnableParserVars(GetParserID()); 158331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID()); 158431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 158552f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_named_decl = var_decl; 158652f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_llvm_value = NULL; 158752f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.Clear(); 158845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 158945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 1590a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 1591a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 15929394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString()); 1593a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 1594a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1595a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 15961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 1597819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 159801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Symbol &symbol, 159967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 1600819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 1601819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 1602819749647b1605f75753f625050cb240292c08b0Sean Callanan 1603952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1604819749647b1605f75753f625050cb240292c08b0Sean Callanan 1605dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1606567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1607567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton if (target == NULL) 1608567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton return; 1609567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1610567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 1611819749647b1605f75753f625050cb240292c08b0Sean Callanan 161252f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType()); 161352f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType()); 161452f792329be5db8e38961350589e97e8f2823acdGreg Clayton NamedDecl *var_decl = context.AddVarDecl(parser_type); 1615819749647b1605f75753f625050cb240292c08b0Sean Callanan 1616819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 1617819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 1618dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 1619819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 1620819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 162147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 162247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 1623819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 1624819749647b1605f75753f625050cb240292c08b0Sean Callanan 162552f792329be5db8e38961350589e97e8f2823acdGreg Clayton entity->EnableParserVars(GetParserID()); 162652f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 162752f792329be5db8e38961350589e97e8f2823acdGreg Clayton 162801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton const Address &symbol_address = symbol.GetAddress(); 1629567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target); 1630819749647b1605f75753f625050cb240292c08b0Sean Callanan 163152f792329be5db8e38961350589e97e8f2823acdGreg Clayton //parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 163252f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.SetClangType(user_type); 163352f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.GetScalar() = symbol_load_addr; 163452f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress); 1635819749647b1605f75753f625050cb240292c08b0Sean Callanan 163631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 163731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_named_decl = var_decl; 163831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = NULL; 163931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_lldb_sym = &symbol; 1640819749647b1605f75753f625050cb240292c08b0Sean Callanan 1641819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1642819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1643a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 1644819749647b1605f75753f625050cb240292c08b0Sean Callanan 16459394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString()); 1646819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1647819749647b1605f75753f625050cb240292c08b0Sean Callanan} 1648819749647b1605f75753f625050cb240292c08b0Sean Callanan 1649fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 1650fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 1651fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 1652952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1653dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1654567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 1655567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext(); 1656fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1657fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 1658fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 1659fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 1660fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1661fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 1662fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 166331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 166431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan 1665fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 1666fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 166731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan const NamedDecl *named_decl = parser_vars->m_named_decl; 1668fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 1669fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1670fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 1671fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1672fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 1673fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 1674fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 1675fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1676fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1677fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 1678fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1679a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl)); 1680a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString()); 1681fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1682fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1683fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 1684fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 1685fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 16865a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 1687fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1688dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (!copied_type) 1689dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 1690dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 1691dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable"); 1692dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 16939880efacdd3a5e855b405d89433a01170422a889Jim Ingham return (bool) lldb::ClangExpressionVariableSP(); 1694dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 1695dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 1696fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 1697fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 169852f792329be5db8e38961350589e97e8f2823acdGreg Clayton// parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 169952f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.SetClangType(user_type); 170031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_parser_type = parser_type; 1701fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 170252f792329be5db8e38961350589e97e8f2823acdGreg Clayton entity->SetClangType(user_type); 1703fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1704fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 1705fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1706fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1707fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1708fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 1709fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 1710fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1711819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 1712427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 171367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan const RegisterInfo *reg_info, 171467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 17151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 1716952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 17171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 171852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (m_ast_context, 171952f792329be5db8e38961350589e97e8f2823acdGreg Clayton reg_info->encoding, 172052f792329be5db8e38961350589e97e8f2823acdGreg Clayton reg_info->byte_size * 8); 17211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 172252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!clang_type) 17231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1724122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen if (log) 172567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->Printf(" Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 17261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 17271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 17281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 172952f792329be5db8e38961350589e97e8f2823acdGreg Clayton TypeFromParser parser_clang_type (clang_type); 17301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 173152f792329be5db8e38961350589e97e8f2823acdGreg Clayton NamedDecl *var_decl = context.AddVarDecl(parser_clang_type); 17321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1733dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), 173447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.byte_order, 173547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan m_parser_vars->m_target_info.address_byte_size)); 1736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 17373b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan 17381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 1739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 1740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 174131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan entity->EnableParserVars(GetParserID()); 174231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 174352f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_parser_type = parser_clang_type; 174452f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_named_decl = var_decl; 174552f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_llvm_value = NULL; 174652f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.Clear(); 174752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan entity->m_flags |= ClangExpressionVariable::EVBareRegister; 17481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 174952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan if (log) 17501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1751a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ASTDumper ast_dumper(var_decl); 17529394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan log->Printf(" CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString()); 17531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 17541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 17551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1756a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 1757da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 175852f792329be5db8e38961350589e97e8f2823acdGreg Clayton Function* function, 175967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan Symbol* symbol, 176067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan unsigned int current_id) 17618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 1762aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1763aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1764952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 17658f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 176652f792329be5db8e38961350589e97e8f2823acdGreg Clayton NamedDecl *function_decl = NULL; 176758baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan const Address *fun_address = NULL; 176852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType function_clang_type; 17694f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 17704f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec bool is_indirect_function = false; 17714f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 177252f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (function) 17730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 177452f792329be5db8e38961350589e97e8f2823acdGreg Clayton Type *function_type = function->GetType(); 17750fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 177652f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!function_type) 17770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 17780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 177967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no type"); 17800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 17810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 17820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 178352f792329be5db8e38961350589e97e8f2823acdGreg Clayton function_clang_type = function_type->GetClangFullType(); 17840fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 178552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!function_clang_type) 17860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 17870fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 178867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" Skipped a function because it has no Clang type"); 17890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 17900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 17910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 179252f792329be5db8e38961350589e97e8f2823acdGreg Clayton fun_address = &function->GetAddressRange().GetBaseAddress(); 17930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 179452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType copied_function_type = GuardedCopyType(function_clang_type); 179552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (copied_function_type) 1796a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 179752f792329be5db8e38961350589e97e8f2823acdGreg Clayton function_decl = context.AddFunDecl(copied_function_type); 179879e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan 179952f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!function_decl) 180079e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan { 180179e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan if (log) 180279e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan { 180379e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan log->Printf (" Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}", 180452f792329be5db8e38961350589e97e8f2823acdGreg Clayton function_type->GetName().GetCString(), 180552f792329be5db8e38961350589e97e8f2823acdGreg Clayton function_type->GetID()); 180679e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan } 180779e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan 180879e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan return; 180979e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan } 1810a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 1811a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton else 1812a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 1813a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton // We failed to copy the type we found 1814a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton if (log) 1815a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton { 18165f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea log->Printf (" Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt", 181752f792329be5db8e38961350589e97e8f2823acdGreg Clayton function_type->GetName().GetCString(), 181852f792329be5db8e38961350589e97e8f2823acdGreg Clayton function_type->GetID()); 1819a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 182016089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan 182116089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan return; 1822a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton } 18230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 18240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 18250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 18260c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton fun_address = &symbol->GetAddress(); 182752f792329be5db8e38961350589e97e8f2823acdGreg Clayton function_decl = context.AddGenericFunDecl(); 18284f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec is_indirect_function = symbol->IsIndirect(); 18290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 18300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 18318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 1832810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 183367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan log->PutCString(" AddOneFunction called with no function and no symbol"); 18348f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 18358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 18368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 1837dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr(); 1838567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton 18394f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target, is_indirect_function); 1840583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan 184152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (), 184252f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_parser_vars->m_target_info.byte_order, 184352f792329be5db8e38961350589e97e8f2823acdGreg Clayton m_parser_vars->m_target_info.address_byte_size)); 184452f792329be5db8e38961350589e97e8f2823acdGreg Clayton assert (entity.get()); 184552f792329be5db8e38961350589e97e8f2823acdGreg Clayton 184652f792329be5db8e38961350589e97e8f2823acdGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 184752f792329be5db8e38961350589e97e8f2823acdGreg Clayton entity->SetName(ConstString(decl_name.c_str())); 184852f792329be5db8e38961350589e97e8f2823acdGreg Clayton entity->SetClangType (function_clang_type); 184952f792329be5db8e38961350589e97e8f2823acdGreg Clayton entity->EnableParserVars(GetParserID()); 185052f792329be5db8e38961350589e97e8f2823acdGreg Clayton 185152f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID()); 185252f792329be5db8e38961350589e97e8f2823acdGreg Clayton 1853583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan if (load_addr != LLDB_INVALID_ADDRESS) 1854583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan { 185552f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress); 185652f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.GetScalar() = load_addr; 1857583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan } 1858583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan else 1859583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan { 1860583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan // We have to try finding a file address. 1861583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan 1862583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan lldb::addr_t file_addr = fun_address->GetFileAddress(); 1863583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan 186452f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress); 186552f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_lldb_value.GetScalar() = file_addr; 1866583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan } 18678f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 186852f792329be5db8e38961350589e97e8f2823acdGreg Clayton 186952f792329be5db8e38961350589e97e8f2823acdGreg Clayton parser_vars->m_named_decl = function_decl; 187031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan parser_vars->m_llvm_value = NULL; 187152f792329be5db8e38961350589e97e8f2823acdGreg Clayton 1872810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 18738de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 187452f792329be5db8e38961350589e97e8f2823acdGreg Clayton ASTDumper ast_dumper(function_decl); 1875a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 18762975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan StreamString ss; 18772975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 18782975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription); 18792975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan 18802975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan log->Printf(" CEDM::FEVD[%u] Found %s function %s (description %s), returned %s", 188167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan current_id, 188252f792329be5db8e38961350589e97e8f2823acdGreg Clayton (function ? "specific" : "generic"), 18832975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan decl_name.c_str(), 18842975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan ss.GetData(), 1885a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton ast_dumper.GetCString()); 18868de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 188893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 1889dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean CallananTypeFromParser 1890dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean CallananClangExpressionDeclMap::CopyClassType(TypeFromUser &ut, 1891dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan unsigned int current_id) 189293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 189352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType copied_clang_type = GuardedCopyType(ut); 1894dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 189552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!copied_clang_type) 1896dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan { 1897952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1898dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 1899dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan if (log) 1900dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan log->Printf("ClangExpressionDeclMap::CopyClassType - Couldn't import the type"); 1901dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan 1902dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan return TypeFromParser(); 1903dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan } 1904dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 190552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (copied_clang_type.IsAggregateType() && copied_clang_type.GetCompleteType ()) 19063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 190752f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType void_clang_type = ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid); 190852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType void_ptr_clang_type = void_clang_type.GetPointerType(); 19093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 191052f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType method_type = ClangASTContext::CreateFunctionType (m_ast_context, 191152f792329be5db8e38961350589e97e8f2823acdGreg Clayton void_clang_type, 191252f792329be5db8e38961350589e97e8f2823acdGreg Clayton &void_ptr_clang_type, 1913716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 1, 1914716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan false, 191552f792329be5db8e38961350589e97e8f2823acdGreg Clayton copied_clang_type.GetTypeQualifiers()); 1916716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan 19171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 19181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 19191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 192030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 192128ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan const bool is_attr_used = true; 19222581dbf7292c6272bb771fe396ab30921385d669Sean Callanan const bool is_artificial = false; 192330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 192452f792329be5db8e38961350589e97e8f2823acdGreg Clayton copied_clang_type.AddMethodToCXXRecordType ("$__lldb_expr", 192552f792329be5db8e38961350589e97e8f2823acdGreg Clayton method_type, 192652f792329be5db8e38961350589e97e8f2823acdGreg Clayton lldb::eAccessPublic, 192752f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_virtual, 192852f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_static, 192952f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_inline, 193052f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_explicit, 193152f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_attr_used, 193252f792329be5db8e38961350589e97e8f2823acdGreg Clayton is_artificial); 19333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 193493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 193552f792329be5db8e38961350589e97e8f2823acdGreg Clayton return TypeFromParser(copied_clang_type); 1936dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan} 1937dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 1938dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callananvoid 1939dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 1940dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan TypeFromUser &ut, 1941dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan unsigned int current_id) 1942dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan{ 194352f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType copied_clang_type = GuardedCopyType(ut); 1944dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 194552f792329be5db8e38961350589e97e8f2823acdGreg Clayton if (!copied_clang_type) 1946dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan { 1947952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1948dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 1949dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan if (log) 1950dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type"); 1951dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 1952dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan return; 1953dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan } 1954dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan 195552f792329be5db8e38961350589e97e8f2823acdGreg Clayton context.AddTypeDecl(copied_clang_type); 195693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 1957