ClangExpressionDeclMap.cpp revision 3aa7da5cb3327792415de44405e0896c6bdc305b
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangExpressionDeclMap.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h" 17a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 20810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h" 216184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 24a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 266916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 35f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 36810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 3717c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 39f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4078b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 41a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.h" 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 433bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap () : 488de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 498de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 50aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 51aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars () 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 57aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 58aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 61aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 638c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 65aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_exe_ctx = &exe_ctx; 6645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 67aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.frame) 68aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything); 6978b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham else if (exe_ctx.thread) 7078b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 7178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham 72aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.process) 73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_persistent_vars = &exe_ctx.process->GetPersistentVariables(); 74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 75c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 76aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid ClangExpressionDeclMap::DidParse() 77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 78aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 79aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 80aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan for (uint64_t entity_index = 0, num_entities = m_found_entities.Size(); 81aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 82aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 83aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 84aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(entity_index)); 85aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (entity.m_parser_vars.get() && 86aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity.m_parser_vars->m_lldb_value) 87aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan delete entity.m_parser_vars->m_lldb_value; 88aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 89aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity.DisableParserVars(); 90aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 91aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 92aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan for (uint64_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->Size(); 93aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 94aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 95aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 96aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangExpressionVariable &pvar(m_parser_vars->m_persistent_vars->VariableAtIndex(pvar_index)); 97aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar.DisableParserVars(); 98aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 99aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 100aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1017a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1068de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1078de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 10882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_persistent_vars->GetNextResultName(m_struct_vars->m_result_name); 114aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 11682b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 11782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 1188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 1198de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 1208de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1218de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 1228de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 1238de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser parser_type 1248de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 125a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 129a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 130a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 13182b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetASTContext(), 13282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetOpaqueQualType()), 133a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan context); 134a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name, user_type)) 1368c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1378c12720c108cd5e7ed792596749218d8400f647eSean Callanan 138aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangExpressionVariable *var = m_parser_vars->m_persistent_vars->GetVariable(name); 1398c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1408c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (!var) 1418c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1428c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1438c12720c108cd5e7ed792596749218d8400f647eSean Callanan var->EnableParserVars(); 1448c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1458c12720c108cd5e7ed792596749218d8400f647eSean Callanan var->m_parser_vars->m_named_decl = decl; 1468c12720c108cd5e7ed792596749218d8400f647eSean Callanan var->m_parser_vars->m_parser_type = parser_type; 1478c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1488c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 149a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 150a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 151a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 1528de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 1538de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 1548de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 1558de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 1568de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 1578de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 1588de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 1598de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 161aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 162aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 163aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 164e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 16545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 166aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 1678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1688c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 1698c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 1708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1718c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable *var = m_found_entities.GetVariable(decl); 1728c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1738c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (!var) 174aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan var = m_parser_vars->m_persistent_vars->GetVariable(decl); 1758c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1768c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (!var) 1778c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1788c12720c108cd5e7ed792596749218d8400f647eSean Callanan 17945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 18045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan log->Printf("Adding value for decl %p [%s - %s] to the structure", 18145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 1828de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 1838de27c761a22187ef63fb60000894be163e7285fGreg Clayton var->m_name.GetCString()); 18445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 1858c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 1868c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 1878c12720c108cd5e7ed792596749218d8400f647eSean Callanan var->m_parser_vars->m_llvm_value = value; 1888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1898c12720c108cd5e7ed792596749218d8400f647eSean Callanan var->EnableJITVars(); 1908c12720c108cd5e7ed792596749218d8400f647eSean Callanan var->m_jit_vars->m_alignment = alignment; 1918c12720c108cd5e7ed792596749218d8400f647eSean Callanan var->m_jit_vars->m_size = size; 1928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1938c12720c108cd5e7ed792596749218d8400f647eSean Callanan m_struct_members.AddVariable(*var); 1948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 1998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 2008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 201aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 202aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 203aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 2048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 2058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 2078bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 208aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 209aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 2108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2118c12720c108cd5e7ed792596749218d8400f647eSean Callanan for (uint64_t member_index = 0, num_members = m_struct_members.Size(); 2128c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 2138c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 2148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 2158c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable &member(m_struct_members.VariableAtIndex(member_index)); 2168c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2178c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (!member.m_jit_vars.get()) 2188c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 2198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2208c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 221aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = member.m_jit_vars->m_alignment; 2228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2238c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (cursor % member.m_jit_vars->m_alignment) 2248c12720c108cd5e7ed792596749218d8400f647eSean Callanan cursor += (member.m_jit_vars->m_alignment - (cursor % member.m_jit_vars->m_alignment)); 2258c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2268c12720c108cd5e7ed792596749218d8400f647eSean Callanan member.m_jit_vars->m_offset = cursor; 2278c12720c108cd5e7ed792596749218d8400f647eSean Callanan cursor += member.m_jit_vars->m_size; 2288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 2298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 230aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 2318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 232aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 2338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 2348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 2358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2368de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 2378de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 2388de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 2398de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 2408de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 2418de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 2428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 243aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 244aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 245aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 2468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 2478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2488c12720c108cd5e7ed792596749218d8400f647eSean Callanan num_elements = m_struct_members.Size(); 249aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 250aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 2518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 2538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 2548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 2568de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 2578de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 2588de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *&decl, 2598de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 2608de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 2618de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 2628de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 2638de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 2648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 265aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 266aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 267aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 2688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 2698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2708c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (index >= m_struct_members.Size()) 2718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 2728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2738c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable &member(m_struct_members.VariableAtIndex(index)); 2748c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2758c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (!member.m_parser_vars.get() || 2768c12720c108cd5e7ed792596749218d8400f647eSean Callanan !member.m_jit_vars.get()) 2778c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 2788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2798c12720c108cd5e7ed792596749218d8400f647eSean Callanan decl = member.m_parser_vars->m_named_decl; 2808c12720c108cd5e7ed792596749218d8400f647eSean Callanan value = member.m_parser_vars->m_llvm_value; 2818c12720c108cd5e7ed792596749218d8400f647eSean Callanan offset = member.m_jit_vars->m_offset; 2828de27c761a22187ef63fb60000894be163e7285fGreg Clayton name = member.m_name; 2838c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 2858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 2868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 28702fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 2888de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 2898de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 2908de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 2918de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value**& value, 2928de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 2938de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 294ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 2958c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable *entity = m_found_entities.GetVariable(decl); 2968c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2978c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (!entity) 2988c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 299ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 3008c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 3018c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 302ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 3038c12720c108cd5e7ed792596749218d8400f647eSean Callanan value = &entity->m_parser_vars->m_llvm_value; 3048c12720c108cd5e7ed792596749218d8400f647eSean Callanan ptr = entity->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 3058c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3068c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 307ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 308ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 309f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 3108de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 3118de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3128de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 3138de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 3148de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 315f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 316aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 317aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 318f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 31978b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (m_parser_vars->m_exe_ctx->target == NULL) 32078b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 32178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 322f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 323f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 324e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 325f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 326aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_sym_ctx.FindFunctionsByName(name, false, sc_list); 327f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 328e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 329f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 330f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 331f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 332e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 333f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 334f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan const Address *fun_address; 335f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 336f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 337f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 338f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 339f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 340f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 341f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 342f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 343aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target); 344f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 345f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 346f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 347f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 348810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 349f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 350f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 3518de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 3528de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 353aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 3548de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 3558de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 3568de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 358aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 359aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 360aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process = exe_ctx.process; 361aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 362f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool result = DoMaterialize(false, exe_ctx, NULL, err); 363f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 364f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 365aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 366f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 369f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 370f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 3718de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 3728de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3738de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 3743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 375aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 3768de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 3778de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 3783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 379aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 380aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 381aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process) 3823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 3833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because the context is incomplete"); 3843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 3853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 3863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 387aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 3883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 3893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because its type is unknown"); 3903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 3913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 3923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame, object_name, &m_struct_vars->m_object_pointer_type); 3943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 3953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 3963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 3973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString()); 3983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 3993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 4003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 401aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 4023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr_var, 403aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 4043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 4053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 4063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 4073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 4083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 4093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 4103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 4113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (location_value->GetValueType() == Value::eValueTypeLoadAddress) 4123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 4133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 414aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize(); 415aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder(); 4163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 417aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 418aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 4193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 4203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 4213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 4223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 4233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 4243c9c5eb466869ede185e879d14a47335fb43194dSean Callanan DataBufferHeap data; 4253c9c5eb466869ede185e879d14a47335fb43194dSean Callanan data.SetByteSize(address_byte_size); 4263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan Error read_error; 4273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 428aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size) 4293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 4303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 4313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 4323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 4333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 4343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size); 4353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 4363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan uint32_t offset = 0; 4373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 4383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr = extractor.GetPointer(&offset); 4393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 4403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return true; 4413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 4423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan else 4433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 4443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 4453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 4463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 4473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 4483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 4493c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 4508de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 4518de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 452aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 4538de27c761a22187ef63fb60000894be163e7285fGreg Clayton ClangExpressionVariable *&result, 4548de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 4558de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 456f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 45782b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan return DoMaterialize(true, exe_ctx, &result, err); 458aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 459aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 460aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 461aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 462aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 463aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 464aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 465aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 466aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 467aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 468aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 469aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 470aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 471aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 472aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 473aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 474aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 475aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 476aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 477aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 478aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 479f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 480f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 48132824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 4828de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 4838de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 484aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 4858de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 4868de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 4878de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 48832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 489aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 490aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 491aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 492aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 49332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 49432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 49532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 49632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 49732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 498aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.process) 49932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 50032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 50132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 50232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 50332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 504aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.target) 50532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 50632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 50732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 50832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 50932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 5103371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 5113371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 5123371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 5133371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 5143371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 5153371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 516aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 51732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 51832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 519aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize()) 52032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 52132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 52232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 52332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 52432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 525aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize()); 52632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 5278c12720c108cd5e7ed792596749218d8400f647eSean Callanan for (uint64_t member_index = 0, num_members = m_struct_members.Size(); 5288c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 5298c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 53032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 5318c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable &member (m_struct_members.VariableAtIndex(member_index)); 53232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 5338de27c761a22187ef63fb60000894be163e7285fGreg Clayton s.Printf("[%s]\n", member.m_name.GetCString()); 5348c12720c108cd5e7ed792596749218d8400f647eSean Callanan 5358c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (!member.m_jit_vars.get()) 5368c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 5378c12720c108cd5e7ed792596749218d8400f647eSean Callanan 538aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan extractor.Dump(&s, // stream 539aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan member.m_jit_vars->m_offset, // offset 540aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::eFormatBytesWithASCII, // format 541aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1, // byte size of individual entries 542aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan member.m_jit_vars->m_size, // number of entries 543aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 16, // entries per line 544aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location + member.m_jit_vars->m_offset, // address to print 545aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 0, // bit size (bitfields only; 0 means ignore) 546aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 0); // bit alignment (bitfields only; 0 means ignore) 54732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 54832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 54932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 55032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 55132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 55232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 55332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 554f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 5558de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 5568de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 5578de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 558aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 5598de27c761a22187ef63fb60000894be163e7285fGreg Clayton ClangExpressionVariable **result, 5608de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 5618de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 562810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 563aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 564aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 565e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 56682b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 567aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 568810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 569810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 570810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 571810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 572810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 573aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.frame) 57445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 57545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 57645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan return LLDB_INVALID_ADDRESS; 57745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 57845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 579aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangPersistentVariables &persistent_vars = exe_ctx.process->GetPersistentVariables(); 580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 582e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 583e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 584e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 585e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 586aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = NULL; 587e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 588e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 589e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 590e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 591aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything)); 592810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 593f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 594f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 595aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 596f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 597aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location); 598aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 599f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 600810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 6017a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 6027a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 6037a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 604aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 605aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 606aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan err); 607f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 608f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 609f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 610f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 611aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 612f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 613810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 614aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 615810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 616aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 617aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location += (m_struct_vars->m_struct_alignment - (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment)); 618810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 6198c12720c108cd5e7ed792596749218d8400f647eSean Callanan for (uint64_t member_index = 0, num_members = m_struct_members.Size(); 6208c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 6218c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 622810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 6238c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable &member (m_struct_members.VariableAtIndex(member_index)); 6248c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6254d0b110715d321d366dec1dc690300f713b63236Sean Callanan ClangExpressionVariable *entity = NULL; 6264d0b110715d321d366dec1dc690300f713b63236Sean Callanan 627aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan /* 6284d0b110715d321d366dec1dc690300f713b63236Sean Callanan if (member.m_parser_vars.get()) 6294d0b110715d321d366dec1dc690300f713b63236Sean Callanan entity = m_found_entities.GetVariable(member.m_parser_vars->m_named_decl); 630aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan */ 631810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 632aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity = m_found_entities.GetVariable(member.m_name); 633aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 634aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangExpressionVariable *persistent_variable = persistent_vars.GetVariable(member.m_name); 6358c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6368c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (entity) 637336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 6381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (entity->m_register_info) 6391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 6401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 6411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 642aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 6431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 6441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 6451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 6461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!DoMaterializeOneRegister(dematerialize, exe_ctx, *reg_ctx, *entity->m_register_info, m_material_vars->m_materialized_location + member.m_jit_vars->m_offset, err)) 6481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 6491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 6501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 6511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 6521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!member.m_jit_vars.get()) 6531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 6541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 655aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!DoMaterializeOneVariable(dematerialize, exe_ctx, sym_ctx, member.m_name, member.m_user_type, m_material_vars->m_materialized_location + member.m_jit_vars->m_offset, err)) 6561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 6571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 6588c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 6598c12720c108cd5e7ed792596749218d8400f647eSean Callanan else if (persistent_variable) 6608c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 661aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (member.m_name == m_struct_vars->m_result_name) 66245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 66345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (!dematerialize) 66445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan continue; 6658c12720c108cd5e7ed792596749218d8400f647eSean Callanan 6668c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (log) 6678c12720c108cd5e7ed792596749218d8400f647eSean Callanan log->PutCString("Found result member in the struct"); 66845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 6698c12720c108cd5e7ed792596749218d8400f647eSean Callanan *result = &member; 670f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 671f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 67245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 6738de27c761a22187ef63fb60000894be163e7285fGreg Clayton log->Printf("Searched for persistent variable %s and found %s", member.m_name.GetCString(), persistent_variable->m_name.GetCString()); 67445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 675aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!DoMaterializeOnePersistentVariable(dematerialize, exe_ctx, persistent_variable->m_name, m_material_vars->m_materialized_location + member.m_jit_vars->m_offset, err)) 6768c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 677336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 6788c12720c108cd5e7ed792596749218d8400f647eSean Callanan else 6798c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 6808de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member.m_name.GetCString()); 681336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 6828c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 683810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 684810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 685f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 686f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 687f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 688a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 6898de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 6908de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6918de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 6928de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 6938de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 6948de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 6958de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 6968de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 697aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 698aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangPersistentVariables &persistent_vars = exe_ctx.process->GetPersistentVariables(); 699aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 700aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangExpressionVariable *pvar(persistent_vars.GetVariable(name)); 701a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 702a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (!pvar) 703a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 7048de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Undefined persistent variable %s", name.GetCString()); 705a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 706a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 707a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 708a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan size_t pvar_size = pvar->Size(); 709a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 71066ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton if (!pvar->m_data_sp.get()) 711a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 712a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 71366ed2fbeaf588fe4105a1305f7e956dcf9fbe299Greg Clayton uint8_t *pvar_data = pvar->m_data_sp->GetBytes(); 714a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 715a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 716a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 717a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 718a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (exe_ctx.process->ReadMemory (addr, pvar_data, pvar_size, error) != pvar_size) 719a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 720a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 721a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 722a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 723a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 724a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 725a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 726a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (exe_ctx.process->WriteMemory (addr, pvar_data, pvar_size, error) != pvar_size) 727a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 728a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 729a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 730a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 731a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 732a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 733a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 734a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 735a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 736f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 7378de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 7388de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 7398de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 7408de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 7418de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 7428de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 7438de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser type, 7448de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 7458de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 7468de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 747f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 748e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 749f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 75017c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!exe_ctx.frame || !exe_ctx.process) 751cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 752cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 7533bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type); 754f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 755f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!var) 756f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 7578de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString()); 758f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 759f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 760f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 761841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 7628de27c761a22187ef63fb60000894be163e7285fGreg Clayton log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType()); 763f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 764f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 765f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan var, 766aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 767f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 768f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 769f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 7708de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 771f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 772f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 77317c6a05cb96f7110332342326a90692d9505982eSean Callanan 77417c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 775f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 77617c6a05cb96f7110332342326a90692d9505982eSean Callanan size_t addr_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 77717c6a05cb96f7110332342326a90692d9505982eSean Callanan size_t addr_byte_size = addr_bit_size % 8 ? ((addr_bit_size + 8) / 8) : (addr_bit_size / 8); 77817c6a05cb96f7110332342326a90692d9505982eSean Callanan 77917c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 78017c6a05cb96f7110332342326a90692d9505982eSean Callanan 78117c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 782f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 78317c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 784f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 78517c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 78617c6a05cb96f7110332342326a90692d9505982eSean Callanan 78717c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 78817c6a05cb96f7110332342326a90692d9505982eSean Callanan 7898de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str()); 79017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 791f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 79217c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 79317c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 794f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 79517c6a05cb96f7110332342326a90692d9505982eSean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 79617c6a05cb96f7110332342326a90692d9505982eSean Callanan 79717c6a05cb96f7110332342326a90692d9505982eSean Callanan DataBufferHeap data; 79817c6a05cb96f7110332342326a90692d9505982eSean Callanan data.SetByteSize(addr_byte_size); 79917c6a05cb96f7110332342326a90692d9505982eSean Callanan 80017c6a05cb96f7110332342326a90692d9505982eSean Callanan lldb::addr_t src_addr; 80117c6a05cb96f7110332342326a90692d9505982eSean Callanan lldb::addr_t dest_addr; 80217c6a05cb96f7110332342326a90692d9505982eSean Callanan 80317c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 80417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 80517c6a05cb96f7110332342326a90692d9505982eSean Callanan src_addr = addr; 80617c6a05cb96f7110332342326a90692d9505982eSean Callanan dest_addr = value_addr; 80717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 80817c6a05cb96f7110332342326a90692d9505982eSean Callanan else 80917c6a05cb96f7110332342326a90692d9505982eSean Callanan { 81017c6a05cb96f7110332342326a90692d9505982eSean Callanan src_addr = value_addr; 81117c6a05cb96f7110332342326a90692d9505982eSean Callanan dest_addr = addr; 81217c6a05cb96f7110332342326a90692d9505982eSean Callanan } 81317c6a05cb96f7110332342326a90692d9505982eSean Callanan 81417c6a05cb96f7110332342326a90692d9505982eSean Callanan Error error; 81517c6a05cb96f7110332342326a90692d9505982eSean Callanan if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size) 81617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 8178de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString()); 81817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 81917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 82017c6a05cb96f7110332342326a90692d9505982eSean Callanan 82117c6a05cb96f7110332342326a90692d9505982eSean Callanan if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), addr_byte_size, error) != addr_byte_size) 82217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 8238de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString()); 82417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 82517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 82617c6a05cb96f7110332342326a90692d9505982eSean Callanan 82717c6a05cb96f7110332342326a90692d9505982eSean Callanan if (log) 82817c6a05cb96f7110332342326a90692d9505982eSean Callanan log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr); 829f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 83017c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 83117c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 832f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 8336916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 83417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 83517c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 83617c6a05cb96f7110332342326a90692d9505982eSean Callanan 83717c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 83817c6a05cb96f7110332342326a90692d9505982eSean Callanan 8398de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str()); 84017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 84117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 84217c6a05cb96f7110332342326a90692d9505982eSean Callanan 84317c6a05cb96f7110332342326a90692d9505982eSean Callanan lldb::RegisterInfo *register_info = location_value->GetRegisterInfo(); 84417c6a05cb96f7110332342326a90692d9505982eSean Callanan 84517c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_info) 84617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 8478de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString()); 84817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 84917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 85017c6a05cb96f7110332342326a90692d9505982eSean Callanan 85117c6a05cb96f7110332342326a90692d9505982eSean Callanan RegisterContext *register_context = exe_ctx.GetRegisterContext(); 85217c6a05cb96f7110332342326a90692d9505982eSean Callanan 85317c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_context) 85417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 8558de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name); 85617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 85717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 85817c6a05cb96f7110332342326a90692d9505982eSean Callanan 85917c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB]; 86017c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_byte_size = register_info->byte_size; 86117c6a05cb96f7110332342326a90692d9505982eSean Callanan 86217c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 86317c6a05cb96f7110332342326a90692d9505982eSean Callanan { 86417c6a05cb96f7110332342326a90692d9505982eSean Callanan // Moving from addr into a register 86517c6a05cb96f7110332342326a90692d9505982eSean Callanan // 86617c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 1: addr_byte_size and register_byte_size are the same 86717c6a05cb96f7110332342326a90692d9505982eSean Callanan // 86817c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Address contents 86917c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Register contents 87017c6a05cb96f7110332342326a90692d9505982eSean Callanan // 87117c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 2: addr_byte_size is bigger than register_byte_size 87217c6a05cb96f7110332342326a90692d9505982eSean Callanan // 87317c6a05cb96f7110332342326a90692d9505982eSean Callanan // Error! (The register should always be big enough to hold the data) 87417c6a05cb96f7110332342326a90692d9505982eSean Callanan // 87517c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 3: register_byte_size is bigger than addr_byte_size 87617c6a05cb96f7110332342326a90692d9505982eSean Callanan // 87717c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABB| Address contents 87817c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABB0000| Register contents [on little-endian hardware] 87917c6a05cb96f7110332342326a90692d9505982eSean Callanan // |0000AABB| Register contents [on big-endian hardware] 88017c6a05cb96f7110332342326a90692d9505982eSean Callanan 88117c6a05cb96f7110332342326a90692d9505982eSean Callanan if (addr_byte_size > register_byte_size) 88217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 8838de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name); 88417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 88517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 88617c6a05cb96f7110332342326a90692d9505982eSean Callanan 88717c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_offset; 88817c6a05cb96f7110332342326a90692d9505982eSean Callanan 88917c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (exe_ctx.process->GetByteOrder()) 89017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 89117c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 8928de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString()); 89317c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 89417c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderLittle: 89517c6a05cb96f7110332342326a90692d9505982eSean Callanan register_offset = 0; 89617c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 89717c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderBig: 89817c6a05cb96f7110332342326a90692d9505982eSean Callanan register_offset = register_byte_size - addr_byte_size; 89917c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 90017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 90117c6a05cb96f7110332342326a90692d9505982eSean Callanan 90217c6a05cb96f7110332342326a90692d9505982eSean Callanan DataBufferHeap register_data (register_byte_size, 0); 90317c6a05cb96f7110332342326a90692d9505982eSean Callanan 90417c6a05cb96f7110332342326a90692d9505982eSean Callanan Error error; 90517c6a05cb96f7110332342326a90692d9505982eSean Callanan if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes() + register_offset, addr_byte_size, error) != addr_byte_size) 90617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 9078de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString()); 90817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 90917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 91017c6a05cb96f7110332342326a90692d9505982eSean Callanan 91117c6a05cb96f7110332342326a90692d9505982eSean Callanan DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize()); 91217c6a05cb96f7110332342326a90692d9505982eSean Callanan 91317c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0)) 91417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 9158de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name); 91617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 91717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 91817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 91917c6a05cb96f7110332342326a90692d9505982eSean Callanan else 92017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 92117c6a05cb96f7110332342326a90692d9505982eSean Callanan // Moving from a register into addr 92217c6a05cb96f7110332342326a90692d9505982eSean Callanan // 92317c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 1: addr_byte_size and register_byte_size are the same 92417c6a05cb96f7110332342326a90692d9505982eSean Callanan // 92517c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Register contents 92617c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Address contents 92717c6a05cb96f7110332342326a90692d9505982eSean Callanan // 92817c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 2: addr_byte_size is bigger than register_byte_size 92917c6a05cb96f7110332342326a90692d9505982eSean Callanan // 93017c6a05cb96f7110332342326a90692d9505982eSean Callanan // Error! (The register should always be big enough to hold the data) 93117c6a05cb96f7110332342326a90692d9505982eSean Callanan // 93217c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 3: register_byte_size is bigger than addr_byte_size 93317c6a05cb96f7110332342326a90692d9505982eSean Callanan // 93417c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Register contents 93517c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABB| Address contents on little-endian hardware 93617c6a05cb96f7110332342326a90692d9505982eSean Callanan // |CCDD| Address contents on big-endian hardware 93717c6a05cb96f7110332342326a90692d9505982eSean Callanan 93817c6a05cb96f7110332342326a90692d9505982eSean Callanan if (addr_byte_size > register_byte_size) 93917c6a05cb96f7110332342326a90692d9505982eSean Callanan { 9408de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name); 94117c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 94217c6a05cb96f7110332342326a90692d9505982eSean Callanan } 94317c6a05cb96f7110332342326a90692d9505982eSean Callanan 94417c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_offset; 94517c6a05cb96f7110332342326a90692d9505982eSean Callanan 94617c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (exe_ctx.process->GetByteOrder()) 94717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 94817c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 9498de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString()); 95017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 95117c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderLittle: 95217c6a05cb96f7110332342326a90692d9505982eSean Callanan register_offset = 0; 95317c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 95417c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderBig: 95517c6a05cb96f7110332342326a90692d9505982eSean Callanan register_offset = register_byte_size - addr_byte_size; 95617c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 95717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 95817c6a05cb96f7110332342326a90692d9505982eSean Callanan 95917c6a05cb96f7110332342326a90692d9505982eSean Callanan DataExtractor register_extractor; 96017c6a05cb96f7110332342326a90692d9505982eSean Callanan 96117c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_context->ReadRegisterBytes(register_number, register_extractor)) 96217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 9638de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name); 96417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 96517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 96617c6a05cb96f7110332342326a90692d9505982eSean Callanan 96717c6a05cb96f7110332342326a90692d9505982eSean Callanan const void *register_data = register_extractor.GetData(®ister_offset, addr_byte_size); 96817c6a05cb96f7110332342326a90692d9505982eSean Callanan 96917c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_data) 97017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 9718de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name); 97217c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 97317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 97417c6a05cb96f7110332342326a90692d9505982eSean Callanan 97517c6a05cb96f7110332342326a90692d9505982eSean Callanan Error error; 97617c6a05cb96f7110332342326a90692d9505982eSean Callanan if (exe_ctx.process->WriteMemory (addr, register_data, addr_byte_size, error) != addr_byte_size) 97717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 97817c6a05cb96f7110332342326a90692d9505982eSean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString()); 97917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 98017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 98117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 982f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 983f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 984f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 985f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 986810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 987810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 9881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 9891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 9901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 9911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 9921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ExecutionContext &exe_ctx, 9931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 9941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const lldb::RegisterInfo ®_info, 9951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 9961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 9971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 9981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 9991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB]; 10001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 10011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error error; 10031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 10051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 10061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan DataBufferHeap register_data (register_byte_size, 0); 10071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error error; 10091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, error) != register_byte_size) 10101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 10111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, error.AsCString()); 10121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 10131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 10141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize()); 10161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0)) 10181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 10191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name); 10201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 10211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 10221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 10231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 10241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 10251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan DataExtractor register_extractor; 10261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor)) 10281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 10291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name); 10301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 10311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 10321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_offset = 0; 10341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const void *register_data = register_extractor.GetData(®ister_offset, register_byte_size); 10361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!register_data) 10381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 10391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name); 10401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 10411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 10421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error error; 10441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size) 10451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 10461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString()); 10471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 10481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 10491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 10501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 10511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 10521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 10531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1054cc0746247880e9c87711031ce8a535544f4499d7Sean CallananVariable * 10558de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 10568de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 10578de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 10588de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 10598de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *type 10608de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1061aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1062e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1063cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1064cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan VariableList *var_list = frame.GetVariableList(true); 1065cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1066bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!var_list) 1067bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return NULL; 1068bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 10693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton lldb::VariableSP var_sp (var_list->FindVariable(name)); 10703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 10713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const bool append = true; 10723bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const uint32_t max_matches = 1; 10733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!var_sp) 1074cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan { 10753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Look for globals elsewhere in the module for the frame 1076aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp); 10773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (module_sp) 10783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 10793bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableList module_globals; 10803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals)) 10813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton var_sp = module_globals.GetVariableAtIndex (0); 10823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 1083cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan } 10843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 10853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!var_sp) 1086cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan { 10873bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Look for globals elsewhere in the program (all images) 1088aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp); 10893bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (target_sp) 10903bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 10913bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableList program_globals; 10923bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals)) 10933bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton var_sp = program_globals.GetVariableAtIndex (0); 10943bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 1095cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan } 10963bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 10973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 10983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 10993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 11003bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 11013bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangType())) 11023bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return NULL; 11033bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 11043bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 11053bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 11063bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 11073bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 11083bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return NULL; 11093bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 11103bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 11113bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 11123bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return var_sp.get(); 1113cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 1114336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1117e5748d889fb7fb97b3ff07444894d7714776b609Greg ClaytonClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name) 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1122e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 11233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1124810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 11258de27c761a22187ef63fb60000894be163e7285fGreg Clayton log->Printf("Hunting for a definition for '%s'", name.GetCString()); 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Back out in all cases where we're not fully initialized 1128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->frame == NULL) 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 1130ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 1131aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_ignore_lookups) 1132ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 1133ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 1134ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 1135ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 1136ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 11373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1138e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11403bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 11413bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 11423bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 11433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 11443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 11458de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 11468de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 11473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr[0] != '$') 11480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 1149aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name); 11508de27c761a22187ef63fb60000894be163e7285fGreg Clayton 11518de27c761a22187ef63fb60000894be163e7285fGreg Clayton // If we found a variable in scope, no need to pull up function names 11528de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (var != NULL) 115392aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan { 11548de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneVariable(context, var); 115592aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan } 11568de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 115792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan { 1158aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_sym_ctx.FindFunctionsByName (name, false, sc_list); 11598de27c761a22187ef63fb60000894be163e7285fGreg Clayton 11608de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool found_specific = false; 11618de27c761a22187ef63fb60000894be163e7285fGreg Clayton Symbol *generic_symbol = NULL; 11628de27c761a22187ef63fb60000894be163e7285fGreg Clayton Symbol *non_extern_symbol = NULL; 11638de27c761a22187ef63fb60000894be163e7285fGreg Clayton 1164e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton for (uint32_t index = 0, num_indices = sc_list.GetSize(); 11658de27c761a22187ef63fb60000894be163e7285fGreg Clayton index < num_indices; 11668de27c761a22187ef63fb60000894be163e7285fGreg Clayton ++index) 11678de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 11688de27c761a22187ef63fb60000894be163e7285fGreg Clayton SymbolContext sym_ctx; 1169e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(index, sym_ctx); 11708de27c761a22187ef63fb60000894be163e7285fGreg Clayton 11718de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (sym_ctx.function) 11728de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 11738de27c761a22187ef63fb60000894be163e7285fGreg Clayton // TODO only do this if it's a C function; C++ functions may be 11748de27c761a22187ef63fb60000894be163e7285fGreg Clayton // overloaded 11758de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (!found_specific) 11768de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneFunction(context, sym_ctx.function, NULL); 11778de27c761a22187ef63fb60000894be163e7285fGreg Clayton found_specific = true; 11788de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 11798de27c761a22187ef63fb60000894be163e7285fGreg Clayton else if (sym_ctx.symbol) 11808de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 11818de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (sym_ctx.symbol->IsExternal()) 11828de27c761a22187ef63fb60000894be163e7285fGreg Clayton generic_symbol = sym_ctx.symbol; 11838de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 11848de27c761a22187ef63fb60000894be163e7285fGreg Clayton non_extern_symbol = sym_ctx.symbol; 11858de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 11868de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 11878de27c761a22187ef63fb60000894be163e7285fGreg Clayton 11888de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (!found_specific) 11898de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 11908de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (generic_symbol) 11918de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneFunction(context, NULL, generic_symbol); 11928de27c761a22187ef63fb60000894be163e7285fGreg Clayton else if (non_extern_symbol) 11938de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneFunction(context, NULL, non_extern_symbol); 11948de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 11956916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 1196aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name)); 11976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (namespace_decl) 11986916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton { 11999ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl); 12009ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton if (clang_namespace_decl) 12019ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton { 12029ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton // TODO: is this how we get the decl lookups to be called for 12039ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton // this namespace?? 12049ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton clang_namespace_decl->setHasExternalLexicalStorage(); 12059ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton } 12066916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton } 120792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan } 12080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 12098de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 12103cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 121157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 121257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 121357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 121457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 121557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 1216aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false); 121757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 121857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!vars) 121957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 122057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 122157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 122257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 122357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_var) 122457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 122557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 122657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton Type *this_type = this_var->GetType(); 122757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 122857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_type) 122957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 123057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 12312403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton if (log) 12322403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 12332403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString ("Type for \"this\" is: "); 12342403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton StreamString strm; 12352403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton this_type->Dump(&strm, true); 12362403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString (strm.GetData()); 12372403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 12382403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 123957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton TypeFromUser this_user_type(this_type->GetClangType(), 124057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 124157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 1242aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type = this_user_type; 124357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 124457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton void *pointer_target_type; 124557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 124657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(), 124757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton &pointer_target_type)) 124857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 124957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 125057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton TypeFromUser class_user_type(pointer_target_type, 125157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 125257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 12533aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 12543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 12553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 12563aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 12573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 12583aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str()); 12593aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 12603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 126157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton AddOneType(context, class_user_type, true); 126257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 126357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 126457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 126557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 12663aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 12673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 12683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 12693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 12703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false); 12723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!vars) 12743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 12753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 12773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_var) 12793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 12803aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Type *self_type = self_var->GetType(); 12823aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12833aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_type) 12843aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 12853aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12863aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser self_user_type(self_type->GetClangType(), 12873aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 12883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 12903aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12913aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan void *pointer_target_type; 12923aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(), 12943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan &pointer_target_type)) 12953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 12963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 12973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser class_user_type(pointer_target_type, 12983aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 12993aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 13003aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 13013aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 13023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 13033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 13043aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 13053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str()); 13063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 13073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 13083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan AddOneType(context, class_user_type, false); 13093aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 13103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 13113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 13123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 1313aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangExpressionVariable *pvar(m_parser_vars->m_persistent_vars->GetVariable(name)); 13143cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan 13158de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (pvar) 13161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 13178de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneVariable(context, pvar); 13181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 13191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 13221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1323aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->GetRegisterContext()) 13241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1325aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan const lldb::RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); 13261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 13281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan AddOneRegister(context, reg_info); 13291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13308de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 1331a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1332aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name)); 13336df0840c87be29724055716db951aa6d494ddabcSean Callanan 1334ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (type_sp) 1335ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 1336ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 13376df0840c87be29724055716db951aa6d494ddabcSean Callanan { 1338ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf ("Matching type found for \"%s\": ", name.GetCString()); 1339ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan StreamString strm; 1340ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan type_sp->Dump(&strm, true); 1341ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->PutCString (strm.GetData()); 1342ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 13432403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 1344ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan TypeFromUser user_type(type_sp->GetClangType(), 13452403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton type_sp->GetClangAST()); 13466df0840c87be29724055716db951aa6d494ddabcSean Callanan 1347ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan AddOneType(context, user_type, false); 13486df0840c87be29724055716db951aa6d494ddabcSean Callanan } 134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1350336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1351336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 13528de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 13538de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 13548de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 13558de27c761a22187ef63fb60000894be163e7285fGreg Clayton Variable *var, 13568de27c761a22187ef63fb60000894be163e7285fGreg Clayton clang::ASTContext *parser_ast_context, 13578de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 13588de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 13598de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 136024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1361e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 13626184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 136324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 136424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 136524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 136624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1367810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1368810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 1369336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 137024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 137124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1372462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton void *var_opaque_type = var_type->GetClangType(); 137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 137424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 137524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1376810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1377810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 1378336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 137924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 138124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeList *type_list = var_type->GetTypeList(); 138224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 138324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!type_list) 138424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1385810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1386810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because the type has no associated type list"); 1387336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 138924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext(); 139124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 139224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!exe_ast_ctx) 139324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1394810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1395810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 1396336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1399336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 1400336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 140124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 140224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1403178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 1404178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 1405178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 1406178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 1407178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 1408178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 1409eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target); 1410178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 141224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14138e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1415810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1416810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 1417336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1420810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext(); 1421810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1422336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type_to_use; 1423336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1424f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 1425f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1426ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan type_to_use = GuardedCopyType(parser_ast_context, var_ast_context, var_opaque_type); 1427f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 14284b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 14294b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 14304b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 14314b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 14324b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 14334b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 14344b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 14354b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 1436f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 1437f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 1438f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1439336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 1440336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 14436916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 1449336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 1451336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 1456336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 1457336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1460aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target); 146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->GetScalar() = load_addr; 146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->SetValueType(Value::eValueTypeLoadAddress); 146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1466f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 1467f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *user_type = TypeFromUser(var_opaque_type, var_ast_context); 1468336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1469336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 1470336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 1471336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1472336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 1473336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 14743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan Variable* var) 1475336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 1476aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1477aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1478e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1479336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1480f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 1481f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 1482336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1483aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx, 14848de27c761a22187ef63fb60000894be163e7285fGreg Clayton var, 14858de27c761a22187ef63fb60000894be163e7285fGreg Clayton context.GetASTContext(), 14868de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 14878de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 1488336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 14894b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 14904b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 14914b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 14923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); 149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14948c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable())); 14958de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 14968de27c761a22187ef63fb60000894be163e7285fGreg Clayton entity.m_name.SetCString (decl_name.c_str()); 14978de27c761a22187ef63fb60000894be163e7285fGreg Clayton entity.m_user_type = ut; 149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14998c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.EnableParserVars(); 15008c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.m_parser_vars->m_parser_type = pt; 15018c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.m_parser_vars->m_named_decl = var_decl; 15028c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.m_parser_vars->m_llvm_value = NULL; 15038c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.m_parser_vars->m_lldb_value = var_location; 150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1505810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 15068de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1507a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 1508a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 1509a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 1510a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 1511a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 1512a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); 15138de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 15148f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 15158f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 15168f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 1517a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 1518a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan ClangExpressionVariable *pvar) 1519a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 1520e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 152145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 1522a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan TypeFromUser user_type = pvar->m_user_type; 1523a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1524ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan TypeFromParser parser_type(GuardedCopyType(context.GetASTContext(), 1525ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan user_type.GetASTContext(), 1526ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan user_type.GetOpaqueQualType()), 1527a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan context.GetASTContext()); 1528a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 15298c12720c108cd5e7ed792596749218d8400f647eSean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 15308c12720c108cd5e7ed792596749218d8400f647eSean Callanan 15318c12720c108cd5e7ed792596749218d8400f647eSean Callanan pvar->EnableParserVars(); 15328c12720c108cd5e7ed792596749218d8400f647eSean Callanan pvar->m_parser_vars->m_parser_type = parser_type; 15338c12720c108cd5e7ed792596749218d8400f647eSean Callanan pvar->m_parser_vars->m_named_decl = var_decl; 15348c12720c108cd5e7ed792596749218d8400f647eSean Callanan pvar->m_parser_vars->m_llvm_value = NULL; 15358c12720c108cd5e7ed792596749218d8400f647eSean Callanan pvar->m_parser_vars->m_lldb_value = NULL; 153645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 153745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 1538a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 1539a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 1540a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 1541a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 1542a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 1543a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 1544a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Added pvar %s, returned %s", pvar->m_name.GetCString(), var_decl_print_string.c_str()); 1545a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 1546a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1547a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 15481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 15491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::AddOneRegister(NameSearchContext &context, 15501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const RegisterInfo *reg_info) 15511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 15521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 15531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(), 15551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 15561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 15571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 15591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 15601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 15611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 15621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan TypeFromParser parser_type(ast_type, 15651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan context.GetASTContext()); 15661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 15681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable())); 15701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 15711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan entity.m_name.SetCString (decl_name.c_str()); 15721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan entity.m_register_info = reg_info; 15731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan entity.EnableParserVars(); 15751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan entity.m_parser_vars->m_parser_type = parser_type; 15761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan entity.m_parser_vars->m_named_decl = var_decl; 15771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan entity.m_parser_vars->m_llvm_value = NULL; 15781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan entity.m_parser_vars->m_lldb_value = NULL; 15791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (log) 15811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 15821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string var_decl_print_string; 15831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 15841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl->print(var_decl_print_stream); 15851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl_print_stream.flush(); 15861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str()); 15881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 15901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15916916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::NamespaceDecl * 15926916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl) 15936916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{ 15946916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 15956916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 15966916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 15976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(), 15986916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton namespace_decl.GetASTContext(), 15996916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton namespace_decl.GetNamespaceDecl()); 16006916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 16016916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return dyn_cast<clang::NamespaceDecl>(copied_decl); 16026916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 16036916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 1604a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 16058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 16060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Function* fun, 16070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Symbol* symbol) 16088f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 1609aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1610aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1611e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 16128f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 16130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan NamedDecl *fun_decl; 16140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 16150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan const Address *fun_address; 16168f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 16170fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 16180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 16190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan clang::ASTContext *fun_ast_context = NULL; 16208f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 16210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 16220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 16230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 16240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 16250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 16260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 16270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 16280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no type"); 16290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 16300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 16310fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 1632462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton fun_opaque_type = fun_type->GetClangType(); 16330fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 16340fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 16350fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 16360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 16370fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no Clang type"); 16380fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 16390fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 16400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 16410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 16420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 16430fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan TypeList *type_list = fun_type->GetTypeList(); 16440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_ast_context = type_list->GetClangASTContext().getASTContext(); 1645ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 16460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 16470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddFunDecl(copied_type); 16480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 16490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 16500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 16510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 16520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 16530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 16540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 16550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 16568f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 1657810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 16580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("AddOneFunction called with no function and no symbol"); 16598f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 16608f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 16618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 1662aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target); 16638f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 16648f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 16658f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 16668c12720c108cd5e7ed792596749218d8400f647eSean Callanan ClangExpressionVariable &entity(m_found_entities.VariableAtIndex(m_found_entities.CreateVariable())); 16678de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 16688de27c761a22187ef63fb60000894be163e7285fGreg Clayton entity.m_name.SetCString(decl_name.c_str()); 16698c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.m_user_type = TypeFromUser(fun_opaque_type, fun_ast_context);; 16708f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 16718c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.EnableParserVars(); 16728c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.m_parser_vars->m_named_decl = fun_decl; 16738c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.m_parser_vars->m_llvm_value = NULL; 16748c12720c108cd5e7ed792596749218d8400f647eSean Callanan entity.m_parser_vars->m_lldb_value = fun_location.release(); 16758c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1676810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 16778de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1678a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string fun_decl_print_string; 1679a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string); 1680a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl->print(fun_decl_print_stream); 1681a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl_print_stream.flush(); 1682a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 1683a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str()); 16848de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 168693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 168793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 168893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 16893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 16903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 169193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 16923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan clang::ASTContext *parser_ast_context = context.GetASTContext(); 16933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan clang::ASTContext *user_ast_context = ut.GetASTContext(); 16943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1695ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 16963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 16973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromParser parser_type(copied_type, parser_ast_context); 169893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 16993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 17003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 17013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 17023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 17033c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 17043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 17053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 17063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 17073c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args, 17083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1, 17093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan false, 17103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 171130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 17121d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 17131d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 17141d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 171530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 171630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 17171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 17181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 17198de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 17201d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 17211d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 17221d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 17231d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 172430449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 172530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit); 17263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 172793a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 172893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 172993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 1730ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 1731ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid * 1732ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context, 1733ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan ASTContext *source_context, 1734ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *clang_type) 1735ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{ 1736aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1737aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1738aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = true; 1739ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 1740ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *ret = ClangASTContext::CopyType (dest_context, 1741ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan source_context, 1742ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan clang_type); 1743ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 1744aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = false; 1745ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 1746ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return ret; 1747ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan} 1748