ClangExpressionDeclMap.cpp revision 061b79dbf1fefaf157d414747e98a463a0f32eda
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangExpressionDeclMap.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1647a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h" 17a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 20810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h" 216184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 23061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 2405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h" 256e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 27a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h" 28cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 306916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 39f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 40810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 4117c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 43f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 45a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.h" 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 473bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) : 528de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 538de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 54dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_keep_result_in_memory (keep_result_in_memory), 55aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 56dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson m_struct_vars () 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 64aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 65aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 66aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 67427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 68427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 698c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_exe_ctx = &exe_ctx; 7245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.frame) 74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything); 7578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham else if (exe_ctx.thread) 7678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 77ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham else if (exe_ctx.process) 78ef80aabe53b7fdf61309ba6d3d6865c94c681345Jim Ingham m_parser_vars->m_sym_ctx = SymbolContext(exe_ctx.target->GetSP(), ModuleSP()); 79427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (exe_ctx.target) 80427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_persistent_vars = &exe_ctx.target->GetPersistentVariables(); 81aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 82c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 83427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 84427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 85aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 86aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 87aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 88427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 89aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 90aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 91aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 92427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 93427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (var_sp && 94427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars.get() && 95427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_lldb_value) 96427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton delete var_sp->m_parser_vars->m_lldb_value; 97aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 98427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->DisableParserVars(); 99aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 100aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 102aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 103aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 104aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 105427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 106427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 107427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->DisableParserVars(); 108aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 109aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 110aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1117a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1168de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1178de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 11882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 120aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 121aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 123427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton Target *target = m_parser_vars->GetTarget(); 124427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (target); 125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName(); 126427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 12882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 12982b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 13005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP 13105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name, 13205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan lldb_private::TypeFromParser type, 13305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan const llvm::APInt& value) 13405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{ 13505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan assert (m_parser_vars.get()); 136fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 137fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 13805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 13905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 14005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetASTContext(), 14105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetOpaqueQualType()), 14205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 143696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 144fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 145fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 1460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_ctx->process->GetByteOrder(), 148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_ctx->process->GetAddressByteSize())) 1490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 1500e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 1510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 1520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 1530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 1540e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 15505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 1560e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 1570e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 1580e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 15905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 16005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 16105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 162fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ByteOrder byte_order = exe_ctx->process->GetByteOrder(); 16305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 16405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 1650e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 16605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 16705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 16805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 16905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 17005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 17105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan for (off_t byte_idx = 0; 17205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 17305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 17405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 17505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 17605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 17705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 17805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 17905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan switch (byte_order) 18005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 1810e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 1820e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 1830e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 1840e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 1850e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 1860e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 1870e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 1880e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 1890e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 1900e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 1910e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 1920e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 1930e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 19405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 19505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 1966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 198696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 199696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2000e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 2010e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 20205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 20305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 204696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::ClangExpressionVariableSP 205696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::BuildCastVariable (const ConstString &name, 206696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan clang::VarDecl *decl, 207696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb_private::TypeFromParser type) 208696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan{ 209696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan assert (m_parser_vars.get()); 210696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 211696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 212696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 213696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 214696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 215696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 216696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 217696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 218696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 219696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 220696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 221696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_sp) 222696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return ClangExpressionVariableSP(); 223696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 224696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 225696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan type.GetASTContext(), 226696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan type.GetOpaqueQualType()), 227696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan context); 228696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 229696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan TypeFromUser var_type = var_sp->GetTypeFromUser(); 230696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 231696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP var = FindVariableInScope (*exe_ctx->frame, var_sp->GetName(), &var_type); 232696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 233696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var) 234696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); // but we should handle this; it may be a persistent variable 235696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 236696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_valobj = exe_ctx->frame->GetValueObjectForFrameVariable(var, lldb::eNoDynamicValues); 237696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 238696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_valobj) 239696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 240696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 241696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ValueObjectSP var_casted_valobj = var_valobj->CastPointerType(name.GetCString(), user_type); 242696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 243696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!var_casted_valobj) 244696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 245696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 246696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (log) 247696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan { 248696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan StreamString my_stream_string; 249696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 250696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangASTType::DumpTypeDescription (var_type.GetASTContext(), 251696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan var_type.GetOpaqueQualType(), 252696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan &my_stream_string); 253696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 254696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 255696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan log->Printf("Building cast variable to type: %s", my_stream_string.GetString().c_str()); 256696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan } 257696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 258696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan ClangExpressionVariableSP pvar_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (var_casted_valobj); 259696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 260696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (!pvar_sp) 261696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 262696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 263696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan if (pvar_sp != m_parser_vars->m_persistent_vars->GetVariable(name)) 264696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::ClangExpressionVariableSP(); 265696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 266696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 267696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 268696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 269696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 270696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return pvar_sp; 271696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan} 272696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan 2738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 2748de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 2758de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 2768de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 2778de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 2786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 2796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 2806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 2818de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 282a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 283aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 284aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 286fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ExecutionContext *exe_ctx = m_parser_vars->m_exe_ctx; 2876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 288fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 289a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 290a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 29182b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetASTContext(), 29282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetOpaqueQualType()), 29397678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 294a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 295fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx->GetBestExecutionContextScope (), 296fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham name, 297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 298fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_ctx->process->GetByteOrder(), 299fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham exe_ctx->process->GetAddressByteSize())) 3008c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 3018c12720c108cd5e7ed792596749218d8400f647eSean Callanan 302427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 3038c12720c108cd5e7ed792596749218d8400f647eSean Callanan 304427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 3058c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 3068c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 3086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 3096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 3106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 3116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 3126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 3136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 3146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 3156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 3166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 3176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 3186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 3196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 3206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 3216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 3226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 3236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 3246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 325427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableParserVars(); 3268c12720c108cd5e7ed792596749218d8400f647eSean Callanan 327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_named_decl = decl; 328427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_parser_type = parser_type; 3298c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3308c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 331a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 332a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 333a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 3348de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 3358de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3368de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 3378de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 3388de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 3398de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 3408de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 3418de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 3428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 343aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 344aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 345aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 346e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 34745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 348aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 3498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3508c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 3518c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 3528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 353427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 3548c12720c108cd5e7ed792596749218d8400f647eSean Callanan 355427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 356427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 3578c12720c108cd5e7ed792596749218d8400f647eSean Callanan 358427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 3598c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 3608c12720c108cd5e7ed792596749218d8400f647eSean Callanan 36145690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 36245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan log->Printf("Adding value for decl %p [%s - %s] to the structure", 36345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 3648de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 365427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 36645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 3678c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 3688c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 369427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_llvm_value = value; 3708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 371427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableJITVars(); 372427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_alignment = alignment; 373427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_size = size; 3748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 375427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 3768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 3788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 3798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 3818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 3828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 383aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 384aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 385aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 3868bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 3878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 3898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 390aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 391aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 3928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 393427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 3948c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 3958c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 3968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 397427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 398427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 399427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 400427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 401427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 4028c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4048c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 405427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment; 4068bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 407427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (cursor % member_sp->m_jit_vars->m_alignment) 408427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment)); 4098c12720c108cd5e7ed792596749218d8400f647eSean Callanan 410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset = cursor; 411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += member_sp->m_jit_vars->m_size; 4128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 4138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 414aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 4158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 416aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 4178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 4188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 4198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4208de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 4218de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4228de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 4238de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 4248de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 4258de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 4268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 427aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 428aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 429aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 4308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 4318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 432427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 433aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 434aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 4358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 4378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 4388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 4398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 4408de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 4418de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4428de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *&decl, 4438de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 4448de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 4458de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 4468de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 4478de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 4488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 449aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 451aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 4528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 4538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 454427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 4558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 4568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 457427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 4588c12720c108cd5e7ed792596749218d8400f647eSean Callanan 459427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp || 460427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_parser_vars.get() || 461427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_jit_vars.get()) 4628c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 4638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 464427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton decl = member_sp->m_parser_vars->m_named_decl; 465427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = member_sp->m_parser_vars->m_llvm_value; 466427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton offset = member_sp->m_jit_vars->m_offset; 467427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 4688c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 4708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 4718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 47202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 4738de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 4748de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4758de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 4768de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value**& value, 4778de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 4788de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 479ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 480427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl)); 4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan 482427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 4838c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 484ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 4858c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 4868c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 487ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 488427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = &entity_sp->m_parser_vars->m_llvm_value; 489427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 4908c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4918c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 492ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 493ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 494f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 4958de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 4968de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4978de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4988de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 4998de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 500f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 501aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 502aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 503f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 50478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (m_parser_vars->m_exe_ctx->target == NULL) 50578b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 50678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 507f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 508f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 509e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 51028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool include_symbols = true; 51128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool append = false; 51228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton m_parser_vars->m_sym_ctx.FindFunctionsByName(name, include_symbols, append, sc_list); 513f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 514e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 515f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 516f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 517f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 518e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 519f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 520f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan const Address *fun_address; 521f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 522f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 523f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 524f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 525f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 526f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 527f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 528f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 529aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target); 530f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 531f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 532f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 533f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 534c7674af9458fbad6f07fa73609c354abf93af2dcSean Callananbool 535c7674af9458fbad6f07fa73609c354abf93af2dcSean CallananClangExpressionDeclMap::GetSymbolAddress 536c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan( 537819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 538c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan const ConstString &name, 539c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan uint64_t &ptr 540c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan) 541c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 542c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 543c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 544819749647b1605f75753f625050cb240292c08b0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); 545c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 546c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan if (!sc_list.GetSize()) 547c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan return false; 548c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 549c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContext sym_ctx; 550c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 551c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 552c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 553c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 554819749647b1605f75753f625050cb240292c08b0Sean Callanan ptr = sym_address->GetLoadAddress(&target); 555c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 556c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan return true; 557c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 558c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 559819749647b1605f75753f625050cb240292c08b0Sean Callananbool 560819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::GetSymbolAddress 561819749647b1605f75753f625050cb240292c08b0Sean Callanan( 562819749647b1605f75753f625050cb240292c08b0Sean Callanan const ConstString &name, 563819749647b1605f75753f625050cb240292c08b0Sean Callanan uint64_t &ptr 564819749647b1605f75753f625050cb240292c08b0Sean Callanan) 565819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 566819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 567819749647b1605f75753f625050cb240292c08b0Sean Callanan 568819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!m_parser_vars->m_exe_ctx || 569819749647b1605f75753f625050cb240292c08b0Sean Callanan !m_parser_vars->m_exe_ctx->target) 570819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 571819749647b1605f75753f625050cb240292c08b0Sean Callanan 572819749647b1605f75753f625050cb240292c08b0Sean Callanan return GetSymbolAddress(*m_parser_vars->m_exe_ctx->target, 573819749647b1605f75753f625050cb240292c08b0Sean Callanan name, 574819749647b1605f75753f625050cb240292c08b0Sean Callanan ptr); 575819749647b1605f75753f625050cb240292c08b0Sean Callanan} 576819749647b1605f75753f625050cb240292c08b0Sean Callanan 577810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 578f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 579f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 5808de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 5818de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 582aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 5838de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 5848de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 5858de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 586f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 587aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 588aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 589aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process = exe_ctx.process; 590aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 5916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool result = DoMaterialize(false /* dematerialize */, exe_ctx, NULL, err); 592f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 593f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 594aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 595f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 596f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 597f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 598f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 599f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 6008de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 6018de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6028de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 6033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 604aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 605047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 606047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 6078de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 609aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 610aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 611aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process) 6123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 6133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because the context is incomplete"); 6143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 6153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 6163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 617aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 6183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 6193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because its type is unknown"); 6203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 6213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 6223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 623696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP object_ptr_var = FindVariableInScope (*exe_ctx.frame, 624696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 625696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type)); 6263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 6273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 6283c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 6293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString()); 6303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 6313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 6323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 633aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 6343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr_var, 635aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 6363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 6373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 6383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 6393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 6403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 6413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 6423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 64350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 6443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 64550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 64650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 64750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 64850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 6493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 65050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 65150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize(); 65250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder(); 65350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 65450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 65550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 65650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 65750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 65850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 65950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 66050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 66150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan DataBufferHeap data; 66250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan data.SetByteSize(address_byte_size); 66350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 66450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 66550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size) 66650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 66750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 66850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 66950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 67050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 67150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size); 67250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 67350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan uint32_t offset = 0; 67450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 67550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan object_ptr = extractor.GetPointer(&offset); 67650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 67750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 6783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 67950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 6803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 68150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 68250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 68350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 68450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 68550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 68650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 68750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 68850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 68950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 690061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 69150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 692061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 69350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 69450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 69550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 69650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 69750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 698061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 69950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 700061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 70150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 702061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 70350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 70450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 70550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 706061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 70750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 708061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 70950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 71050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 7113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 7123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 7133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 7143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 7153c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 7168de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 7178de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 718aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 719427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 7208de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 7218de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 722f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 723427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return DoMaterialize(true, exe_ctx, &result_sp, err); 724aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 725aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 726aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 727aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 728aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 729aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 730aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 731aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 732aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 733aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 734aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 735aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 736aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 737aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 738aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 739aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 740aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 741aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 742aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 743aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 744aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 745f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 746f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 74732824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 7488de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 7498de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 750aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 7518de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 7528de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 7538de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 75432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 755aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 756aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 757aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 758aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 75932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 76032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 76132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 76232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 76332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 764aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.process) 76532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 76632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 76732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 76832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 76932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 770aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.target) 77132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 77232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 77332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 77432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 77532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 7763371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 7773371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 7783371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 7793371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 7803371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 7813371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 782aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 78332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 78432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 785aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize()) 78632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 78732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 78832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 78932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 79032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 791aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize()); 79232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 793427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 794427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 795427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 79632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 797427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 79832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 799427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 800427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 801427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 802427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 8038c12720c108cd5e7ed792596749218d8400f647eSean Callanan 804427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 8058c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 8068c12720c108cd5e7ed792596749218d8400f647eSean Callanan 807427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 808427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 809427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 810427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 811427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 812427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 813427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 814427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 815427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 81632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 81732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 81832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 81932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 82032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 82132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 82232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 823f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 8248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 8258de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 8268de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 827aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 828427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 8298de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 8308de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 831810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 832427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 833427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 834427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 835aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 836aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 837e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 83882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 839aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 840810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 841810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 842810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 843810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 844810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 845aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.frame) 84645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 84745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 84845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan return LLDB_INVALID_ADDRESS; 84945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 85045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 851427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables(); 852aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 853aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 854e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 855e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 856e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 857e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 858aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = NULL; 859e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 860e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 861e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 862e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 863aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything)); 864810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 865f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 866f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 867aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 868f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 869aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location); 870aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 871f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 872810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 8737a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 8747a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 8757a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 876aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 877aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 878aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan err); 879f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 880f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 881f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 882f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 883aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 884f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 885810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 886aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 887810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 888aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 889aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 890810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 891427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 8928c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 8938c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 894810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 895427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 8964d0b110715d321d366dec1dc690300f713b63236Sean Callanan 897a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 898336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 899a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 900427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 9011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 9021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 9031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 904aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 9051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 9061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 9071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 9081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 909427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 910427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 911427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 912427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 913427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 914427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 9151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 9161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 9171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 9181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 919427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 9201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 9211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 922427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 923427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 9246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 9256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 926427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 927427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 9281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 9291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 9308c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 931a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 9328c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 933a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 934a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 935a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 93645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 9376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 938a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 939a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 940a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 941a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 9426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 943a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 944a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 9456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 946a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 947a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 948a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 9496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx, 950a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 951a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 952a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 953a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 954f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 955a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 956a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 957a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 9588c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 959a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 9608c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 961810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 962810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 963f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 964f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 965f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 9666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callananstatic bool WriteAddressInto 9676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan( 9686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ExecutionContext &exe_ctx, 9696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t target, 9706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t address, 9716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error &err 9726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan) 9736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan{ 9746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize(); 9756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan StreamString str (0 | Stream::eBinary, 9776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pointer_byte_size, 9786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx.process->GetByteOrder()); 9796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan switch (pointer_byte_size) 9816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan default: 9836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan assert(!"Unhandled byte size"); 9846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan case 4: 9856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan uint32_t address32 = address & 0xffffffffll; 987cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton str.PutRawBytes(&address32, sizeof(address32), endian::InlHostByteOrder(), eByteOrderInvalid); 9886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan break; 9906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan case 8: 9916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan uint64_t address64 = address; 993cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton str.PutRawBytes(&address64, sizeof(address64), endian::InlHostByteOrder(), eByteOrderInvalid); 9946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan break; 9966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return (exe_ctx.process->WriteMemory (target, str.GetData(), pointer_byte_size, err) == pointer_byte_size); 9996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan} 10006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callananstatic lldb::addr_t ReadAddressFrom 10026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan( 10036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ExecutionContext &exe_ctx, 10046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t source, 10056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error &err 10066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan) 10076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan{ 10086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize(); 10096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan DataBufferHeap *buf = new DataBufferHeap(pointer_byte_size, 0); 10116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan DataBufferSP buf_sp(buf); 10126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->ReadMemory (source, buf->GetBytes(), pointer_byte_size, err) != pointer_byte_size) 10146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return LLDB_INVALID_ADDRESS; 10156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan DataExtractor extractor (buf_sp, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize()); 10176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan uint32_t offset = 0; 10196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return (lldb::addr_t)extractor.GetPointer(&offset); 10216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan} 10226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1023a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 10248de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 10258de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 10268de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 10278de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 1028427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 10298de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 10308de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 10318de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1032aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 10336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 10346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1035427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1036a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1037427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1038a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1039a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1040a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1041427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1042a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1043427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 1045a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 1046a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1047a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1048a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 10496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 10506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1051a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1052a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 10536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 10546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 10556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 10576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 10586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 10606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 10626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = ReadAddressFrom(exe_ctx, addr, read_error); 10636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 10656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 10676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 10686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 10716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 10726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 10746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 10756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 107647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (), 107747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 107847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 107947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 108047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 108147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 108247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 10836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 10866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 10886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 10896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1091b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 10926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 10946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 10956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 109797678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 109897678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 10996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 11016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 11036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 11046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 11066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 11086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Read"); 11096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 11116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 11126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 11146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 11186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 11216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 11226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 11246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 11266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 11286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error deallocate_error = exe_ctx.process->DeallocateMemory(mem); 11306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 11326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 11346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1140a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 11416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1142a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1143a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1144a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1145a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1146a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 11476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 11486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 11496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 11516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 11536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 11556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = exe_ctx.process->AllocateMemory(pvar_byte_size, 11576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 11586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan allocate_error); 11596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 11616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 11636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 11676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 11686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 11706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 117147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 117247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 117347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 117447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 117547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 117647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 117747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 11786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 11806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 11826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 11836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 11856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 11876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 11896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 11946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 11956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 11976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 11996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 12016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!WriteAddressInto(exe_ctx, addr, mem, write_error)) 12026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 12036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 12046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 12056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 12066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 12086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 12096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1210696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1211a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 12126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1213a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1214a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1215a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1216a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1217a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1218a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1219a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1220f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 12218de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 12238de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 12248de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 12258de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 12266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 12278de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 12288de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 12298de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1230f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1231e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1232f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 123317c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!exe_ctx.frame || !exe_ctx.process) 1234cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 1235cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 12366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 12376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 12396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 12406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1241696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP var = FindVariableInScope (*exe_ctx.frame, name, &type); 1242819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol *sym = FindGlobalDataSymbol(*exe_ctx.target, name); 1243f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1244819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 1245819749647b1605f75753f625050cb240292c08b0Sean Callanan 1246819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1247819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1248819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(GetVariableValue(exe_ctx, 1249819749647b1605f75753f625050cb240292c08b0Sean Callanan var, 1250819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1251819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1252819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym) 1253819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1254819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(new Value); 1255819749647b1605f75753f625050cb240292c08b0Sean Callanan 1256819749647b1605f75753f625050cb240292c08b0Sean Callanan uint64_t location_load_addr; 1257819749647b1605f75753f625050cb240292c08b0Sean Callanan 1258819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!GetSymbolAddress(*exe_ctx.target, name, location_load_addr)) 1259819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1260819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1261819749647b1605f75753f625050cb240292c08b0Sean Callanan err.SetErrorStringWithFormat("Couldn't find value for global symbol %s", name.GetCString()); 1262819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1263819749647b1605f75753f625050cb240292c08b0Sean Callanan 1264819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1265819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1266819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1267819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1268f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 12698de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString()); 1270f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1271f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1272f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1273841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 12748de27c761a22187ef63fb60000894be163e7285fGreg Clayton log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType()); 1275f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1276f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1277f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1278f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 12798de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1280f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1281f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 128217c6a05cb96f7110332342326a90692d9505982eSean Callanan 128317c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1284f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 12856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 12866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 128717c6a05cb96f7110332342326a90692d9505982eSean Callanan 128817c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 128917c6a05cb96f7110332342326a90692d9505982eSean Callanan 129017c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1291f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 129217c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1293f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 129417c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 129517c6a05cb96f7110332342326a90692d9505982eSean Callanan 129617c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 129717c6a05cb96f7110332342326a90692d9505982eSean Callanan 12988de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str()); 129917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1300f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 130117c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 130217c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1303f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 13046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 130517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 13076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 13086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error error; 13096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 13106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!WriteAddressInto(exe_ctx, 13116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan addr, 13126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan value_addr, 13136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan error)) 13146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 13156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString()); 13166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 13176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 131817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1319f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 132017c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 132117c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1322f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 13236916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 132417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 132517c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 132617c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 132717c6a05cb96f7110332342326a90692d9505982eSean Callanan 13288de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str()); 132917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 133017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 133117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1332061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb::addr_t reg_addr = LLDB_INVALID_ADDRESS; // The address of a spare memory area aused to hold the variable. 13336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1334061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 133517c6a05cb96f7110332342326a90692d9505982eSean Callanan 1336061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 133717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13388de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString()); 133917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 134017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 134117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1342061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1343061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1344061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 1345061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1346061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 134717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1348061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), reg_info->name); 134917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 135017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 135117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1352061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 135317c6a05cb96f7110332342326a90692d9505982eSean Callanan 135417c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 135517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 13576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 13586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 13596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 13606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 13616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 13626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 13636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1364b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 13656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 13666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 13676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 13686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 13696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_addr = expr_var->m_live_sp->GetValue().GetScalar().ULongLong(); 137117c6a05cb96f7110332342326a90692d9505982eSean Callanan 1372061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, reg_addr, value_byte_size, reg_value); 1373061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 137417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1376061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 137717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write %s to register %s", name.GetCString(), reg_info->name); 137917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 138017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 13816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 13826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 13836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1384061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error deallocate_error = exe_ctx.process->DeallocateMemory(reg_addr); 13856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 13866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 13876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 13886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't deallocate spare memory area for %s: %s", name.GetCString(), deallocate_error.AsCString()); 13896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 13906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 13916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 13926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 139317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 139417c6a05cb96f7110332342326a90692d9505982eSean Callanan else 139517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to place the register's contents into. This memory area will be pointed to by the slot in the 13976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 13986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 13996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 14006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1401061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_addr = exe_ctx.process->AllocateMemory (value_byte_size, 1402061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb::ePermissionsReadable | lldb::ePermissionsWritable, 1403061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton allocate_error); 14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1405061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (reg_addr == LLDB_INVALID_ADDRESS) 14066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", name.GetCString(), allocate_error.AsCString()); 14086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 14126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 141347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 141447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 141547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 141647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 1417061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_addr, 141847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 141947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 14206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1424061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!WriteAddressInto(exe_ctx, addr, reg_addr, write_error)) 14256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), write_error.AsCString()); 14276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 143017c6a05cb96f7110332342326a90692d9505982eSean Callanan // Moving from a register into addr 143117c6a05cb96f7110332342326a90692d9505982eSean Callanan // 143217c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 1: addr_byte_size and register_byte_size are the same 143317c6a05cb96f7110332342326a90692d9505982eSean Callanan // 143417c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Register contents 143517c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Address contents 143617c6a05cb96f7110332342326a90692d9505982eSean Callanan // 143717c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 2: addr_byte_size is bigger than register_byte_size 143817c6a05cb96f7110332342326a90692d9505982eSean Callanan // 143917c6a05cb96f7110332342326a90692d9505982eSean Callanan // Error! (The register should always be big enough to hold the data) 144017c6a05cb96f7110332342326a90692d9505982eSean Callanan // 144117c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 3: register_byte_size is bigger than addr_byte_size 144217c6a05cb96f7110332342326a90692d9505982eSean Callanan // 144317c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Register contents 144417c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABB| Address contents on little-endian hardware 144517c6a05cb96f7110332342326a90692d9505982eSean Callanan // |CCDD| Address contents on big-endian hardware 144617c6a05cb96f7110332342326a90692d9505982eSean Callanan 14476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 144817c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1449061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), reg_info->name); 145017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 145117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 145217c6a05cb96f7110332342326a90692d9505982eSean Callanan 145317c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_offset; 145417c6a05cb96f7110332342326a90692d9505982eSean Callanan 145517c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (exe_ctx.process->GetByteOrder()) 145617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 145717c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 14588de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString()); 145917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 146017c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderLittle: 146117c6a05cb96f7110332342326a90692d9505982eSean Callanan register_offset = 0; 146217c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 146317c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderBig: 14646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan register_offset = register_byte_size - value_byte_size; 146517c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 146617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1467061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1468061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1469061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1470061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 147117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1472061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), reg_info->name); 147317c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 147417c6a05cb96f7110332342326a90692d9505982eSean Callanan } 147517c6a05cb96f7110332342326a90692d9505982eSean Callanan 1476061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err = reg_ctx->WriteRegisterValueToMemory(reg_info, reg_addr, value_byte_size, reg_value); 1477061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 147817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 147917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1480f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1481f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1482f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1483f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1484810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 1485810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 14861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 14871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 14881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 14891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 14901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ExecutionContext &exe_ctx, 14911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 1492b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 14931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 14941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 14951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 14961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 14971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 1498061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 14991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 15001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1501061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 1502061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 15031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1504bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 15051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1508061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 15091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1510061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 15111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 15151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 15161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1517061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 15181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1519061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 15201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1523061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 1524061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 15251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1526061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString()); 15271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 15321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 15331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1534696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 15358de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 15368de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 15378de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 15388de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 15398de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *type 15408de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1541aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1542e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1543cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1544cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan VariableList *var_list = frame.GetVariableList(true); 1545cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1546bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!var_list) 1547696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 1548bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 15493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton lldb::VariableSP var_sp (var_list->FindVariable(name)); 15503bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 15513bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const bool append = true; 15523bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const uint32_t max_matches = 1; 15533bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!var_sp) 1554cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan { 15553bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Look for globals elsewhere in the module for the frame 1556aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp); 15573bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (module_sp) 15583bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 15593bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableList module_globals; 15603bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals)) 15613bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton var_sp = module_globals.GetVariableAtIndex (0); 15623bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 1563cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan } 15643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 15653bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!var_sp) 1566cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan { 15673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Look for globals elsewhere in the program (all images) 1568aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp); 15693bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (target_sp) 15703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 15713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableList program_globals; 15723bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals)) 15733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton var_sp = program_globals.GetVariableAtIndex (0); 15743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 1575cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan } 15763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 15773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 15783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 15793bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 15803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 158104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 1582696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 15833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 15843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 15853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 15863bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 15873bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 1588696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 15893bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 15903bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 15913bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 1592696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return var_sp; 1593cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 1594336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1595819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol * 1596819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol 1597819749647b1605f75753f625050cb240292c08b0Sean Callanan( 1598819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 1599819749647b1605f75753f625050cb240292c08b0Sean Callanan const ConstString &name 1600819749647b1605f75753f625050cb240292c08b0Sean Callanan) 1601819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 1602819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 1603819749647b1605f75753f625050cb240292c08b0Sean Callanan 1604819749647b1605f75753f625050cb240292c08b0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, 1605819749647b1605f75753f625050cb240292c08b0Sean Callanan eSymbolTypeData, 1606819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list); 1607819749647b1605f75753f625050cb240292c08b0Sean Callanan 1608819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 1609819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1610819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 1611819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 1612819749647b1605f75753f625050cb240292c08b0Sean Callanan 1613819749647b1605f75753f625050cb240292c08b0Sean Callanan return sym_ctx.symbol; 1614819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1615819749647b1605f75753f625050cb240292c08b0Sean Callanan 1616819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 1617819749647b1605f75753f625050cb240292c08b0Sean Callanan} 1618819749647b1605f75753f625050cb240292c08b0Sean Callanan 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1621e5748d889fb7fb97b3ff07444894d7714776b609Greg ClaytonClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name) 162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1623aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1624aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1625aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1626e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 16273c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1628810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 16298de27c761a22187ef63fb60000894be163e7285fGreg Clayton log->Printf("Hunting for a definition for '%s'", name.GetCString()); 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Back out in all cases where we're not fully initialized 1632aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->frame == NULL) 163324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 1634ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 1635aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_ignore_lookups) 1636ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 1637ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 1638ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 1639ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 1640ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 16413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1642e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 164324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 16453bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 16463bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 16473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 16483bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 16498de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 16508de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 16513bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr[0] != '$') 16520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 1653696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name); 16548de27c761a22187ef63fb60000894be163e7285fGreg Clayton 16558de27c761a22187ef63fb60000894be163e7285fGreg Clayton // If we found a variable in scope, no need to pull up function names 16568de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (var != NULL) 165792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan { 16588de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneVariable(context, var); 165992aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan } 16608de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 166192aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan { 166228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool include_symbols = true; 166328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool append = false; 166428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton m_parser_vars->m_sym_ctx.FindFunctionsByName (name, 166528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton include_symbols, 166628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton append, 166728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list); 16688de27c761a22187ef63fb60000894be163e7285fGreg Clayton 1669819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 16708de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1671819749647b1605f75753f625050cb240292c08b0Sean Callanan bool found_specific = false; 1672819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol *generic_symbol = NULL; 1673819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol *non_extern_symbol = NULL; 1674819749647b1605f75753f625050cb240292c08b0Sean Callanan 1675819749647b1605f75753f625050cb240292c08b0Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 1676819749647b1605f75753f625050cb240292c08b0Sean Callanan index < num_indices; 1677819749647b1605f75753f625050cb240292c08b0Sean Callanan ++index) 16788de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1679819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 1680819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 1681819749647b1605f75753f625050cb240292c08b0Sean Callanan 1682819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sym_ctx.function) 1683819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1684819749647b1605f75753f625050cb240292c08b0Sean Callanan // TODO only do this if it's a C function; C++ functions may be 1685819749647b1605f75753f625050cb240292c08b0Sean Callanan // overloaded 1686819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!found_specific) 1687819749647b1605f75753f625050cb240292c08b0Sean Callanan AddOneFunction(context, sym_ctx.function, NULL); 1688819749647b1605f75753f625050cb240292c08b0Sean Callanan found_specific = true; 1689819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1690819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym_ctx.symbol) 1691819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1692819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sym_ctx.symbol->IsExternal()) 1693819749647b1605f75753f625050cb240292c08b0Sean Callanan generic_symbol = sym_ctx.symbol; 1694819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1695819749647b1605f75753f625050cb240292c08b0Sean Callanan non_extern_symbol = sym_ctx.symbol; 1696819749647b1605f75753f625050cb240292c08b0Sean Callanan } 16978de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 1698819749647b1605f75753f625050cb240292c08b0Sean Callanan 1699819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!found_specific) 17008de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1701819749647b1605f75753f625050cb240292c08b0Sean Callanan if (generic_symbol) 1702819749647b1605f75753f625050cb240292c08b0Sean Callanan AddOneFunction (context, NULL, generic_symbol); 1703819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (non_extern_symbol) 1704819749647b1605f75753f625050cb240292c08b0Sean Callanan AddOneFunction (context, NULL, non_extern_symbol); 1705819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1706819749647b1605f75753f625050cb240292c08b0Sean Callanan 1707819749647b1605f75753f625050cb240292c08b0Sean Callanan ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name)); 1708819749647b1605f75753f625050cb240292c08b0Sean Callanan if (namespace_decl) 1709819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1710819749647b1605f75753f625050cb240292c08b0Sean Callanan clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl); 1711819749647b1605f75753f625050cb240292c08b0Sean Callanan if (clang_namespace_decl) 1712819749647b1605f75753f625050cb240292c08b0Sean Callanan clang_namespace_decl->setHasExternalLexicalStorage(); 17138de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 17148de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 1715819749647b1605f75753f625050cb240292c08b0Sean Callanan else 17166916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton { 1717819749647b1605f75753f625050cb240292c08b0Sean Callanan // We couldn't find a variable or function for this. Now we'll hunt for a generic 1718819749647b1605f75753f625050cb240292c08b0Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 1719819749647b1605f75753f625050cb240292c08b0Sean Callanan 1720819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol *data_symbol = FindGlobalDataSymbol(*m_parser_vars->m_exe_ctx->target, name); 1721819749647b1605f75753f625050cb240292c08b0Sean Callanan 1722819749647b1605f75753f625050cb240292c08b0Sean Callanan if (data_symbol) 1723819749647b1605f75753f625050cb240292c08b0Sean Callanan AddOneGenericVariable(context, *data_symbol); 17246916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton } 172592aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan } 17260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 17278de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 17283cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 172957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 173057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 173157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 173257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 173357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 1734aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false); 173557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 173657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!vars) 173757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 173857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 173957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 174057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 174157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_var) 174257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 174357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 174457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton Type *this_type = this_var->GetType(); 174557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 174657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_type) 174757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 174857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 17492403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton if (log) 17502403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 17512403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString ("Type for \"this\" is: "); 17522403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton StreamString strm; 17532403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton this_type->Dump(&strm, true); 17542403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString (strm.GetData()); 17552403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 17562403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 175704c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser this_user_type(this_type->GetClangFullType(), 175857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 175957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 1760aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type = this_user_type; 176157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 176257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton void *pointer_target_type; 176357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 176457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(), 176557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton &pointer_target_type)) 176657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 176757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 176857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton TypeFromUser class_user_type(pointer_target_type, 176957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 177057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 17713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 17723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 17733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 17743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 17753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 17763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str()); 17773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 17783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 177957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton AddOneType(context, class_user_type, true); 178057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 178157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 178257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 178357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 17843aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 17853aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 17863aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 17873aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 17883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 17893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false); 17903aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 17913aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!vars) 17923aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 17933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 17943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 17953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 17963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_var) 17973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 17983aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 17993aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Type *self_type = self_var->GetType(); 18003aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18013aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_type) 18023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 18033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 180404c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser self_user_type(self_type->GetClangFullType(), 18053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 18063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 18083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18093aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan void *pointer_target_type; 18103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(), 18123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan &pointer_target_type)) 18133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 18143aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser class_user_type(pointer_target_type, 18163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 18173aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18183aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 18193aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 18203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 18213aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 18223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 18233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str()); 18243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 18253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan AddOneType(context, class_user_type, false); 18273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18283aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 18293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 1830427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1831427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 18323cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan 1833427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 18341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1835427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton AddOneVariable(context, pvar_sp); 18361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 18371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 18381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 18391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 18401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1841aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->GetRegisterContext()) 18421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1843b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); 18441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 18451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 18461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan AddOneRegister(context, reg_info); 18471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 18488de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 1849a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1850aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name)); 18516df0840c87be29724055716db951aa6d494ddabcSean Callanan 1852ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (type_sp) 1853ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 1854ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 18556df0840c87be29724055716db951aa6d494ddabcSean Callanan { 1856ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf ("Matching type found for \"%s\": ", name.GetCString()); 1857ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan StreamString strm; 1858ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan type_sp->Dump(&strm, true); 1859ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->PutCString (strm.GetData()); 1860ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 18612403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 186204c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser user_type (type_sp->GetClangFullType(), 1863b01000fd063629facd45044f137446fb748ee179Greg Clayton type_sp->GetClangAST()); 18646df0840c87be29724055716db951aa6d494ddabcSean Callanan 1865ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan AddOneType(context, user_type, false); 18666df0840c87be29724055716db951aa6d494ddabcSean Callanan } 186724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1868336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1869336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 18708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 18718de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 18728de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 1873696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP var, 18748de27c761a22187ef63fb60000894be163e7285fGreg Clayton clang::ASTContext *parser_ast_context, 18758de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 18768de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 18778de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 187824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1879e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 18806184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 188324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 188424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1885810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1886810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 1887336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 189004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1894810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1895810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 1896336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1899b01000fd063629facd45044f137446fb748ee179Greg Clayton clang::ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1901b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1903810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1904810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 1905336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1908336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 1909336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1912178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 1913178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 1914178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 1915178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 1916178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 1917178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 1918eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target); 1919178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1922bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1924810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1925810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 1926336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1928b01000fd063629facd45044f137446fb748ee179Greg Clayton 1929336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type_to_use; 1930336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1931f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 1932f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1933b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 1934f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 19354b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 19364b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 19374b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 19384b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 19394b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 19404b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 19414b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 19424b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 1943f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 1944f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 1945f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1946336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 1947336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 19506916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 1956336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 1958336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 1963336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 1964336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1967aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target); 196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->GetScalar() = load_addr; 197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->SetValueType(Value::eValueTypeLoadAddress); 197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1973f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 1974b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 1975336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1976336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 1977336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 1978336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1979336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 1980696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var) 1981336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 1982aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1983aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1984e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1985336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1986f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 1987f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 1988336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1989aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx, 19908de27c761a22187ef63fb60000894be163e7285fGreg Clayton var, 19918de27c761a22187ef63fb60000894be163e7285fGreg Clayton context.GetASTContext(), 19928de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 19938de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 1994336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 19954b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 19964b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 19974b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 19986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 19998de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2000427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 2001fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2002fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham entity_name, 2003427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ut, 2004427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2005427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2006427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 2007427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2008427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 2009427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2010427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2011427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 2012696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan entity->m_parser_vars->m_lldb_var = var; 201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2014810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 20158de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2016a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 2017a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2018a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 2019a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 2020a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2021a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); 20226e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 20236e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan if (log->GetVerbose()) 20246e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan { 20256e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan StreamString var_decl_dump_string; 20266e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan ASTDumper::DumpDecl(var_decl_dump_string, var_decl); 20276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan log->Printf("%s\n", var_decl_dump_string.GetData()); 20286e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan } 20298de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 20308f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 20318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 20328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 2033a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 2034427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &pvar_sp) 2035a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 2036e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 203745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 2038427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 2039a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2040427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(), 2041427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 2042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 2043427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 2044a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 20456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 20468c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2047427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 2048427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 2049427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 2050427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 2051427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 205245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 205345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 2054a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 2055a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 2056a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2057a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 2058a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 2059a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2060427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str()); 2061a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 2062a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 2063a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 20641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 2065819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 2066819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol &symbol) 2067819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2068819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 2069819749647b1605f75753f625050cb240292c08b0Sean Callanan 2070819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2071819749647b1605f75753f625050cb240292c08b0Sean Callanan 2072819749647b1605f75753f625050cb240292c08b0Sean Callanan clang::ASTContext *scratch_ast_context = m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext(); 2073819749647b1605f75753f625050cb240292c08b0Sean Callanan 2074819749647b1605f75753f625050cb240292c08b0Sean Callanan TypeFromUser user_type (ClangASTContext::GetVoidPtrType(scratch_ast_context, false), 2075819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 2076819749647b1605f75753f625050cb240292c08b0Sean Callanan 2077819749647b1605f75753f625050cb240292c08b0Sean Callanan TypeFromParser parser_type (ClangASTContext::GetVoidPtrType(context.GetASTContext(), false), 2078819749647b1605f75753f625050cb240292c08b0Sean Callanan context.GetASTContext()); 2079819749647b1605f75753f625050cb240292c08b0Sean Callanan 2080819749647b1605f75753f625050cb240292c08b0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 2081819749647b1605f75753f625050cb240292c08b0Sean Callanan 2082819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2083819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 2084819749647b1605f75753f625050cb240292c08b0Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2085819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 2086819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 2087819749647b1605f75753f625050cb240292c08b0Sean Callanan m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2088819749647b1605f75753f625050cb240292c08b0Sean Callanan m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2089819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 2090819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->EnableParserVars(); 2091819749647b1605f75753f625050cb240292c08b0Sean Callanan 2092819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 2093819749647b1605f75753f625050cb240292c08b0Sean Callanan 2094819749647b1605f75753f625050cb240292c08b0Sean Callanan AddressRange &symbol_range = symbol.GetAddressRangeRef(); 2095819749647b1605f75753f625050cb240292c08b0Sean Callanan Address &symbol_address = symbol_range.GetBaseAddress(); 2096819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(m_parser_vars->m_exe_ctx->target); 2097819749647b1605f75753f625050cb240292c08b0Sean Callanan 2098819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2099819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 2100819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 2101819749647b1605f75753f625050cb240292c08b0Sean Callanan 2102819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2103819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_named_decl = var_decl; 2104819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_llvm_value = NULL; 2105819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_value = symbol_location.release(); 2106819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_sym = &symbol; 2107819749647b1605f75753f625050cb240292c08b0Sean Callanan 2108819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 2109819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2110819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string var_decl_print_string; 2111819749647b1605f75753f625050cb240292c08b0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2112819749647b1605f75753f625050cb240292c08b0Sean Callanan var_decl->print(var_decl_print_stream); 2113819749647b1605f75753f625050cb240292c08b0Sean Callanan var_decl_print_stream.flush(); 2114819749647b1605f75753f625050cb240292c08b0Sean Callanan 2115819749647b1605f75753f625050cb240292c08b0Sean Callanan log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); 2116819749647b1605f75753f625050cb240292c08b0Sean Callanan 2117819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log->GetVerbose()) 2118819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2119819749647b1605f75753f625050cb240292c08b0Sean Callanan StreamString var_decl_dump_string; 2120819749647b1605f75753f625050cb240292c08b0Sean Callanan ASTDumper::DumpDecl(var_decl_dump_string, var_decl); 2121819749647b1605f75753f625050cb240292c08b0Sean Callanan log->Printf("%s\n", var_decl_dump_string.GetData()); 2122819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2123819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2124819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2125819749647b1605f75753f625050cb240292c08b0Sean Callanan 2126819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 2127427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 2128427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const RegisterInfo *reg_info) 21291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 21301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 21311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(), 21331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 21341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 21351ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 21371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 21381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 21391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 21401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2142427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 2143427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 21441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 21461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2147fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 2148fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2149427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2150427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 21511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2152427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 2153427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 2154427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2155427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 2156427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2157427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2158427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 21591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (log) 21611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 21621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string var_decl_print_string; 21631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 21641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl->print(var_decl_print_stream); 21651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl_print_stream.flush(); 21661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str()); 21681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 21691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 21701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 21716916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::NamespaceDecl * 21726916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl) 21736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{ 21746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 21756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 21766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(), 21776916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton namespace_decl.GetASTContext(), 21786916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton namespace_decl.GetNamespaceDecl()); 21796916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 21806916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return dyn_cast<clang::NamespaceDecl>(copied_decl); 21816916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 21826916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 2183a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 21848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 21850fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Function* fun, 21860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Symbol* symbol) 21878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 2188aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2189aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2190e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 21918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 21920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan NamedDecl *fun_decl; 21930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 21940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan const Address *fun_address; 21958f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 21960fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 21970fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 21980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan clang::ASTContext *fun_ast_context = NULL; 21998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 22000fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 22010fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 22020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 22030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 22040fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 22050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 22060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 22070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no type"); 22080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 22090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 22100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 221104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton fun_opaque_type = fun_type->GetClangFullType(); 22120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 22130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 22140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 22150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 22160fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no Clang type"); 22170fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 22180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 22190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 22200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 22210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 2222b01000fd063629facd45044f137446fb748ee179Greg Clayton fun_ast_context = fun_type->GetClangASTContext().getASTContext(); 2223ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 22240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 22250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddFunDecl(copied_type); 22260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 22270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 22280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 22290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 22300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 22310fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 22320fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 22330fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 22348f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 2235810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 22360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("AddOneFunction called with no function and no symbol"); 22378f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 22388f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 22398f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 2240aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target); 22418f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 22428f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 22438f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 2244fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2245fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 22488de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 2250427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 2251427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 2252427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2253427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 2255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 22578c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2258810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 22598de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2260a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string fun_decl_print_string; 2261a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string); 2262a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl->print(fun_decl_print_stream); 2263a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl_print_stream.flush(); 2264a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2265a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str()); 22668de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 226893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 226993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 227093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 22713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 22723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 227393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 22743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan clang::ASTContext *parser_ast_context = context.GetASTContext(); 22753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan clang::ASTContext *user_ast_context = ut.GetASTContext(); 22763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 2277ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 22783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 22793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromParser parser_type(copied_type, parser_ast_context); 228093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 22813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 22823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 22833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 22843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 22853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 22863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 22873c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 22883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 22893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args, 22903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1, 22913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan false, 22923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 229330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 22941d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 22951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 22961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 229730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 229830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 22991d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 23001d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 23018de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 23021d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 23031d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 23041d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 23051d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 230630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 230730449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit); 23083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 230993a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 231093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 231193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 2312ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2313ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid * 2314ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context, 2315ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan ASTContext *source_context, 2316ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *clang_type) 2317ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{ 2318aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2319aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2320aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = true; 2321ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2322ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *ret = ClangASTContext::CopyType (dest_context, 2323ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan source_context, 2324ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan clang_type); 2325ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2326aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = false; 2327ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2328ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return ret; 2329ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan} 2330