ClangExpressionDeclMap.cpp revision 9b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0
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; 1379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 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 1712bc9eb3ba78efc64a273729b480bafc3bbaa433aJohnny Chen for (size_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, 2069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 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; 2149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 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( 2769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const 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 2889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 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( 3369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const 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( 4429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const 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( 4759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const 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, 498da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton uint64_t &func_addr 4998de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 500f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 501aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 502aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 503aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 504aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 505f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 50678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (m_parser_vars->m_exe_ctx->target == NULL) 50778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 50878b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 509f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 510f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 511e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 51228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool include_symbols = true; 51328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool append = false; 51428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton m_parser_vars->m_sym_ctx.FindFunctionsByName(name, include_symbols, append, sc_list); 515f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 516e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 517aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 518aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // We occasionally get debug information in which a const function is reported 519aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan // as non-const, so the mangled name is wrong. This is a hack to compensate. 520aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 521aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan Mangled mangled(name.GetCString(), true); 522aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 523aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan ConstString demangled_name = mangled.GetDemangledName(); 524aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 525aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (strlen(demangled_name.GetCString())) 526aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan { 527aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan std::string const_name_scratch(demangled_name.GetCString()); 528aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 529aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan const_name_scratch.append(" const"); 530aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 531aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan ConstString const_name(const_name_scratch.c_str()); 532aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 533aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan m_parser_vars->m_sym_ctx.FindFunctionsByName(const_name, include_symbols, append, sc_list); 534aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 535aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (log) 536aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan log->Printf("Found %d results with const name %s", sc_list.GetSize(), const_name.GetCString()); 537aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 538aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan } 539aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan 540aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan if (!sc_list.GetSize()) 541f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 542f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 543f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 544e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 545f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 546da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton const Address *func_so_addr = NULL; 547f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 548f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 549da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 550f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 551da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_so_addr = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 552f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 553f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 554f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 555ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!func_so_addr || !func_so_addr->IsValid()) 556ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return false; 557ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 558da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton func_addr = func_so_addr->GetCallableLoadAddress (m_parser_vars->m_exe_ctx->target); 559da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton 560f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 561f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 562f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 563cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 564cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (Target &target, const ConstString &name) 565c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{ 566c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan SymbolContextList sc_list; 567c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 568819749647b1605f75753f625050cb240292c08b0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list); 569c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 570cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const uint32_t num_matches = sc_list.GetSize(); 571cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; 572cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 573cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton for (uint32_t i=0; i<num_matches && symbol_load_addr == LLDB_INVALID_ADDRESS; i++) 574cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 575cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton SymbolContext sym_ctx; 576cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton sc_list.GetContextAtIndex(i, sym_ctx); 577c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 578cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton const Address *sym_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 579ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 580ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!sym_address || !sym_address->IsValid()) 581ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return LLDB_INVALID_ADDRESS; 582ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 583cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (sym_address) 584cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 585cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton switch (sym_ctx.symbol->GetType()) 586cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton { 587cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCode: 588cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeTrampoline: 589cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetCallableLoadAddress (&target); 590cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 591cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton 592cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeData: 593cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeRuntime: 594cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariable: 595cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLocal: 596cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeParam: 597cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInvalid: 598cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAbsolute: 599cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeExtern: 600cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeException: 601cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeSourceFile: 602cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeHeaderFile: 603cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeObjectFile: 604cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCommonBlock: 605cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeBlock: 606cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeVariableType: 607cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineEntry: 608cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeLineHeader: 609cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeBegin: 610cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeScopeEnd: 611cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeAdditional: 612cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeCompiler: 613cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeInstrumentation: 614cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton case eSymbolTypeUndefined: 615cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton symbol_load_addr = sym_address->GetLoadAddress (&target); 616cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton break; 617cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 618cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 619cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton } 620c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 621cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return symbol_load_addr; 622c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan} 623c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan 624cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t 625cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg ClaytonClangExpressionDeclMap::GetSymbolAddress (const ConstString &name) 626819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 627819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (m_parser_vars.get()); 628819749647b1605f75753f625050cb240292c08b0Sean Callanan 629819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!m_parser_vars->m_exe_ctx || 630819749647b1605f75753f625050cb240292c08b0Sean Callanan !m_parser_vars->m_exe_ctx->target) 631819749647b1605f75753f625050cb240292c08b0Sean Callanan return false; 632819749647b1605f75753f625050cb240292c08b0Sean Callanan 633cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton return GetSymbolAddress(*m_parser_vars->m_exe_ctx->target, name); 634819749647b1605f75753f625050cb240292c08b0Sean Callanan} 635819749647b1605f75753f625050cb240292c08b0Sean Callanan 636810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 637f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 638f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 6398de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 6408de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 641aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 6428de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 6438de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 6448de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 645f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 646aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 647aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 648aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process = exe_ctx.process; 649aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 6500ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan bool result = DoMaterialize(false /* dematerialize */, 6510ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan exe_ctx, 6520ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* top of stack frame */, 6530ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan LLDB_INVALID_ADDRESS /* bottom of stack frame */, 6540ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan NULL, /* result SP */ 6550ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan err); 656f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 657f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 658aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 659f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 660f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 661f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 662f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 663f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 6648de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 6658de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6668de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 6673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 668aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 669047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 670047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 6718de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 6723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 673aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 674aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 675aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process) 6763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 6773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because the context is incomplete"); 6783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 6793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 6803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 681aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 6823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 6833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because its type is unknown"); 6843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 6853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 6863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 687696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP object_ptr_var = FindVariableInScope (*exe_ctx.frame, 688696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan object_name, 689696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type)); 6903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 6913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 6923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 6933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString()); 6943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 6953c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 6963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 697aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 6983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr_var, 699aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 7003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 7013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 7023c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 7033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 7043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 7053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 7063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 70750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan switch (location_value->GetValueType()) 7083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 70950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan default: 71050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 71150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 71250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeLoadAddress: 7133c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 71450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 71550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize(); 71650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 71750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 71850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 71950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 72050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 72150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 72250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 72350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 72450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan Error read_error; 725c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton object_ptr = exe_ctx.process->ReadPointerFromMemory (value_addr, read_error); 726c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (read_error.Fail() || object_ptr == LLDB_INVALID_ADDRESS) 72750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 72850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 72950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 730c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton } 73150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 7323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 73350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan case Value::eValueTypeScalar: 7343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 73550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 73650339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 73750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan StreamString ss; 73850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan location_value->Dump(&ss); 73950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 74050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", object_name.GetCString(), ss.GetString().c_str()); 74150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 74250339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 74350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 744061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 74550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 746061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 74750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 74850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan err.SetErrorStringWithFormat("Couldn't get the register information for %s", object_name.GetCString()); 74950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 75050339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 75150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 752061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 75350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 754061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 75550339fe306efbd207cb506b5434a5d280407bba0Sean Callanan { 756061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", object_name.GetCString(), reg_info->name); 75750339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return false; 75850339fe306efbd207cb506b5434a5d280407bba0Sean Callanan } 75950339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 760061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_number = reg_info->kinds[lldb::eRegisterKindLLDB]; 76150339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 762061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton object_ptr = reg_ctx->ReadRegisterAsUnsigned(register_number, 0x0); 76350339fe306efbd207cb506b5434a5d280407bba0Sean Callanan 76450339fe306efbd207cb506b5434a5d280407bba0Sean Callanan return true; 7653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 7663c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 7673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 7683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 7693c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 7708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 7718de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 772aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 773427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 7740ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 7750ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 7768de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 7778de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 778f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 7790ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan return DoMaterialize(true, exe_ctx, stack_frame_top, stack_frame_bottom, &result_sp, err); 780aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 781aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 782aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 783aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 784aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 785aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 786aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 787aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 788aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 789aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 790aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 791aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 792aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 793aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 794aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 795aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 796aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 797aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 798aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 799aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 800aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 801f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 802f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 80332824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 8048de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 8058de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 806aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 8078de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 8088de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 8098de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 81032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 811aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 812aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 813aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 814aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 81532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 81632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 81732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 81832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 81932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 820aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.process) 82132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 82232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 82332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 82432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 82532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 826aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.target) 82732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 82832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 82932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 83032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 83132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 8323371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 8333371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 8343371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 8353371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 8363371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 8373371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 838c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::DataBufferSP data_sp(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 83932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 84032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 841c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, 842c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetBytes(), 843c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton data_sp->GetByteSize(), error) != data_sp->GetByteSize()) 84432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 84532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 84632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 84732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 84832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 849c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton DataExtractor extractor(data_sp, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize()); 85032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 851427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 852427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 853427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 85432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 855427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 85632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 857427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 858427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 859427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 860427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 8618c12720c108cd5e7ed792596749218d8400f647eSean Callanan 862427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 8638c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 8648c12720c108cd5e7ed792596749218d8400f647eSean Callanan 865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 871427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 873427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 87432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 87532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 87632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 87732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 87832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 87932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 88032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 881f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 8828de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 8838de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 8848de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 885aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 8860ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 8870ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 888427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 8898de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 8908de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 891810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 892427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 894427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 895aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 896aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 897e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 89882b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 899aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 900810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 901810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 902810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 903810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 904810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 905aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.frame) 90645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 90745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 90845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan return LLDB_INVALID_ADDRESS; 90945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 91045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 911427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables(); 912aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 913aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 914e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 915e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 916e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 917e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 9189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_material_vars->m_allocated_area = NULL; 919e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 920e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 921e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 922e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 923aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything)); 924810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 925f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 926f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 927aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 928f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 929aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location); 930aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 931f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 932810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 9337a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 9347a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 9357a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 936aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 937aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 938aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan err); 939f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 940f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 941f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 942f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 943aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 944f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 945810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 946aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 947810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 948aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 949aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 950810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 951427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 9528c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 9538c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 954810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 955427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 9564d0b110715d321d366dec1dc690300f713b63236Sean Callanan 957a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 958336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 959a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 960427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 9611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 9621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 9631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 964aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 9651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 9661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 9671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 9681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 969427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 970427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 971427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 972427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 973427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 974427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 9751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 9761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 9771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 9781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 979427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 9801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 9811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 982427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 983427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 9846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 9856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 986427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 987427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 9881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 9891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 9908c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 991a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 9928c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 993a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 994a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 995a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 99645690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 9976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 998a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 999a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1000a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 1001a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 10026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1003a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 1004a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 10056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1006a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 1007a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 1008a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 10096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx, 1010a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 10110ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 10120ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_top, 10130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom, 1014a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 1015a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 1016f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1017a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 1018a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 1019a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 10208c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 1021a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 10228c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 1023810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 1024810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1025f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1026f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 1027f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1028a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 10298de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 10308de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 10318de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 10328de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 1033427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 10348de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 10350ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_top, 10360ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t stack_frame_bottom, 10378de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 10388de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1039aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 10406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 10416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 1043a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 1044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 1045a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 1046a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1047a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1048427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 1049a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1050427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 1051427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 1052a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 1053a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 1054a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 1055a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 10566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 10576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1058a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 1059a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 10606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 10616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 10626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 10646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 10656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 10676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 1069c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton mem = exe_ctx.process->ReadPointerFromMemory (addr, read_error); 10706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 10726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 10746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 10756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 10786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 10796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 10816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 10826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 108347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope (), 108447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 108547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 108647da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 108747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 108847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 108947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 10906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 10936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 10956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 10966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1098b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (var_sp->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 10996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 11016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 110497678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 110597678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 11066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 11086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 11106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 11116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 11130ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 11146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 11156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 11166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 11186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11210ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan if (stack_frame_top != LLDB_INVALID_ADDRESS && 11220ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan stack_frame_bottom != LLDB_INVALID_ADDRESS && 11230ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem >= stack_frame_bottom && 11240ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan mem <= stack_frame_top) 11250ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 11260ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // If the variable is resident in the stack frame created by the expression, 11270ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // then it cannot be relied upon to stay around. We treat it as needing 11280ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // reallocation. 11290ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 11300ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 11310ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 11320ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVIsProgramReference; 11330ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 11340ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 11356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 11366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 11396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 11406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 11426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 11446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 11466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error deallocate_error = exe_ctx.process->DeallocateMemory(mem); 11486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 11506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 11526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 1158a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 11596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1160a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1161a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1162a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1163a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 1164a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 11656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 11666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 11676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 11696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 11716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 11736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = exe_ctx.process->AllocateMemory(pvar_byte_size, 11756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 11766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan allocate_error); 11776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 11796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 11816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 11856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 11866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 11886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 118947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 119047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetASTContext(), 119147da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetTypeFromUser().GetOpaqueQualType(), 119247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham var_sp->GetName(), 119347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham mem, 119447da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 119547da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham pvar_byte_size); 11966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 11986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 12006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 12016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 12036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 12056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 12066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 12076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 12086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 12096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 12106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 12126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 12136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 12146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 12156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1216c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (!exe_ctx.process->WriteScalarToMemory (addr, 1217c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton var_sp->m_live_sp->GetValue().GetScalar(), 1218c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton exe_ctx.process->GetAddressByteSize(), 1219c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 12206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 12216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 12226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 12236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 12246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 1226c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), var_sp->m_live_sp->GetValue().GetScalar().ULongLong()); 12276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 1228696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan else if (!(var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 1229a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 12306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1231a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1232a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1233a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1234a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1235a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1236a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1237a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1238f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 12398de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 12408de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 12418de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 12428de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 12438de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 12446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 12458de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 12468de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 12478de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1248f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1249e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1250f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 125117c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!exe_ctx.frame || !exe_ctx.process) 1252cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 1253cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 12546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 12556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 12576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 12586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1259696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP var = FindVariableInScope (*exe_ctx.frame, name, &type); 1260819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol *sym = FindGlobalDataSymbol(*exe_ctx.target, name); 1261f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1262819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<lldb_private::Value> location_value; 1263819749647b1605f75753f625050cb240292c08b0Sean Callanan 1264819749647b1605f75753f625050cb240292c08b0Sean Callanan if (var) 1265819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1266819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(GetVariableValue(exe_ctx, 1267819749647b1605f75753f625050cb240292c08b0Sean Callanan var, 1268819749647b1605f75753f625050cb240292c08b0Sean Callanan NULL)); 1269819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1270819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym) 1271ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan { 1272819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value.reset(new Value); 1273819749647b1605f75753f625050cb240292c08b0Sean Callanan 1274cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton addr_t location_load_addr = GetSymbolAddress(*exe_ctx.target, name); 1275819749647b1605f75753f625050cb240292c08b0Sean Callanan 1276cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton if (location_load_addr == LLDB_INVALID_ADDRESS) 1277819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1278819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 1279c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find value for global symbol %s", 1280c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1281819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1282819749647b1605f75753f625050cb240292c08b0Sean Callanan 1283819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->SetValueType(Value::eValueTypeLoadAddress); 1284819749647b1605f75753f625050cb240292c08b0Sean Callanan location_value->GetScalar() = location_load_addr; 1285819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1286819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1287f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1288c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't find %s with appropriate type", 1289c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 1290f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1291f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1292f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1293841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 1294fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 1295fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan StreamString my_stream_string; 1296fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1297fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangASTType::DumpTypeDescription (type.GetASTContext(), 1298fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan type.GetOpaqueQualType(), 1299fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan &my_stream_string); 1300fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 1301c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton log->Printf ("%s %s with type %s", 1302c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton dematerialize ? "Dematerializing" : "Materializing", 1303c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1304c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton my_stream_string.GetString().c_str()); 1305fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 1306f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1307f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1308f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 13098de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1310f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1311f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 131217c6a05cb96f7110332342326a90692d9505982eSean Callanan 131317c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1314f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 13156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 13166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 131717c6a05cb96f7110332342326a90692d9505982eSean Callanan 131817c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 131917c6a05cb96f7110332342326a90692d9505982eSean Callanan 132017c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1321f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 132217c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1323f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 132417c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 132517c6a05cb96f7110332342326a90692d9505982eSean Callanan 132617c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 132717c6a05cb96f7110332342326a90692d9505982eSean Callanan 1328c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s has a value of unhandled type: %s", 1329c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1330c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 133117c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1332f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 133317c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 133417c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1335f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 13366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 133717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1338c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error write_error; 13396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1340c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (!exe_ctx.process->WriteScalarToMemory (addr, 1341c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton location_value->GetScalar(), 1342c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton exe_ctx.process->GetAddressByteSize(), 1343c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 13446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1345c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 1346c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1347c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 13486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 13496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 135017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1351f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 135217c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 135317c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1354f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 13556916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 135617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 135717c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 135817c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 135917c6a05cb96f7110332342326a90692d9505982eSean Callanan 1360c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is a scalar of unhandled type: %s", 1361c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1362c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton ss.GetString().c_str()); 136317c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 136417c6a05cb96f7110332342326a90692d9505982eSean Callanan } 136517c6a05cb96f7110332342326a90692d9505982eSean Callanan 1366061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterInfo *reg_info = location_value->GetRegisterInfo(); 136717c6a05cb96f7110332342326a90692d9505982eSean Callanan 1368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_info) 136917c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1370c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't get the register information for %s", 1371c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString()); 137217c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 137317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 137417c6a05cb96f7110332342326a90692d9505982eSean Callanan 1375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1376061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1377061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 1378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1379061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx) 138017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1381c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read register context to read %s from %s", 1382c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1383c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 138417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 138517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 138617c6a05cb96f7110332342326a90692d9505982eSean Callanan 1387061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t register_byte_size = reg_info->byte_size; 138817c6a05cb96f7110332342326a90692d9505982eSean Callanan 138917c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 139017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 13926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 13936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 13946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 13956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 13966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 13976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 13986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1399b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton if (expr_var->m_live_sp->GetValue().GetValueAddressType() != eAddressTypeLoad) 14006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 14016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 14026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1405c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar ®_addr = expr_var->m_live_sp->GetValue().GetScalar(); 140617c6a05cb96f7110332342326a90692d9505982eSean Callanan 1407c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->ReadRegisterValueFromMemory (reg_info, 1408c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1409c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1410c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1411061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 141217c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1413061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1414061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->WriteRegister (reg_info, reg_value)) 141517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1416c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to register %s", 1417c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1418c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 141917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 142017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 14216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 14236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1424c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Error deallocate_error = exe_ctx.process->DeallocateMemory(reg_addr.ULongLong()); 14256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 14276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1428c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't deallocate spare memory area for %s: %s", 1429c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1430c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton deallocate_error.AsCString()); 14316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 143517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 143617c6a05cb96f7110332342326a90692d9505982eSean Callanan else 143717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 14386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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 14396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 14406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 14426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1443c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton Scalar reg_addr (exe_ctx.process->AllocateMemory (value_byte_size, 1444c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton lldb::ePermissionsReadable | lldb::ePermissionsWritable, 1445c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error)); 14466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1447c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (reg_addr.ULongLong() == LLDB_INVALID_ADDRESS) 14486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1449c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't allocate a memory area to store %s: %s", 1450c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1451c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton allocate_error.AsCString()); 14526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 14566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 145747da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham expr_var->m_live_sp = ValueObjectConstResult::Create (exe_ctx.GetBestExecutionContextScope(), 145847da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetASTContext(), 145947da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham type.GetOpaqueQualType(), 146047da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham name, 1461c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 146247da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham eAddressTypeLoad, 146347da810225d8674eb9158bcf5f1f5b847cbaeedfJim Ingham value_byte_size); 14646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 14666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 1468c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton 1469c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton if (!exe_ctx.process->WriteScalarToMemory (addr, 1470c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr, 1471c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton exe_ctx.process->GetAddressByteSize(), 1472c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error)) 14736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 1474c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", 1475c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1476c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton write_error.AsCString()); 14776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 14786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 14796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 14806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 148117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1482c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("%s is too big to store in %s", 1483c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1484c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 148517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 148617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1487061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1488061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 1489061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 1490061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx->ReadRegister (reg_info, reg_value)) 149117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 1492c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from %s", 1493c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton name.GetCString(), 1494c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_info->name); 149517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 149617c6a05cb96f7110332342326a90692d9505982eSean Callanan } 149717c6a05cb96f7110332342326a90692d9505982eSean Callanan 1498c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton err = reg_ctx->WriteRegisterValueToMemory (reg_info, 1499c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_addr.ULongLong(), 1500c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton value_byte_size, 1501c0fa53324d62a48257c092a3347d6e7236aa3152Greg Clayton reg_value); 1502061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (err.Fail()) 150317c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 150417c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1505f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1506f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1507f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1508f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1509810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 1510810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 15111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 15121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 15131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 15141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 15151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ExecutionContext &exe_ctx, 15161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 1517b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo ®_info, 15181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 15191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 15201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 15211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 15221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 1523061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue reg_value; 15241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 15251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1526061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error read_error (reg_ctx.ReadRegisterValueFromMemory(®_info, addr, register_byte_size, reg_value)); 1527061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (read_error.Fail()) 15281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1529bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, read_error.AsCString()); 15301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1533061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.WriteRegister (®_info, reg_value)) 15341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1535061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't write register %s (dematerialize)", reg_info.name); 15361ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 15401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 15411ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1542061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (!reg_ctx.ReadRegister(®_info, reg_value)) 15431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1544061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s (materialize)", reg_info.name); 15451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1548061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error write_error (reg_ctx.WriteRegisterValueToMemory(®_info, addr, register_byte_size, reg_value)); 1549061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (write_error.Fail()) 15501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1551061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString()); 15521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 15531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 15551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 15561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 15571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 15581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1559696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callananlldb::VariableSP 15608de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 15618de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 15628de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 15638de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 15648de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *type 15658de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1566aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1567e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1568cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1569cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan VariableList *var_list = frame.GetVariableList(true); 1570cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1571bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!var_list) 1572696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 1573bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 15743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton lldb::VariableSP var_sp (var_list->FindVariable(name)); 15753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 15763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const bool append = true; 15773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const uint32_t max_matches = 1; 15783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!var_sp) 1579cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan { 15803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Look for globals elsewhere in the module for the frame 1581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp); 15823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (module_sp) 15833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 15843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableList module_globals; 15853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals)) 15863bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton var_sp = module_globals.GetVariableAtIndex (0); 15873bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 1588cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan } 15893bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 15903bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!var_sp) 1591cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan { 15923bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Look for globals elsewhere in the program (all images) 1593aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp); 15943bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (target_sp) 15953bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 15963bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableList program_globals; 15973bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals)) 15983bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton var_sp = program_globals.GetVariableAtIndex (0); 15993bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 1600cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan } 1601ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan 1602ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan if (!var_sp || 1603ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->IsInScope(&frame) || 1604ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan !var_sp->LocationIsValidForFrame (&frame)) 1605ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan return lldb::VariableSP(); 16063bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 16073bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 16083bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 16093bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 16103bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 161104c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangFullType())) 1612696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 16133bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 16143bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 16153bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 16163bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 16173bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 1618696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return lldb::VariableSP(); 16193bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 16203bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 16213bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 1622696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan return var_sp; 1623cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 1624336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1625819749647b1605f75753f625050cb240292c08b0Sean CallananSymbol * 1626819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::FindGlobalDataSymbol 1627819749647b1605f75753f625050cb240292c08b0Sean Callanan( 1628819749647b1605f75753f625050cb240292c08b0Sean Callanan Target &target, 1629819749647b1605f75753f625050cb240292c08b0Sean Callanan const ConstString &name 1630819749647b1605f75753f625050cb240292c08b0Sean Callanan) 1631819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 1632819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContextList sc_list; 1633819749647b1605f75753f625050cb240292c08b0Sean Callanan 1634819749647b1605f75753f625050cb240292c08b0Sean Callanan target.GetImages().FindSymbolsWithNameAndType(name, 1635819749647b1605f75753f625050cb240292c08b0Sean Callanan eSymbolTypeData, 1636819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list); 1637819749647b1605f75753f625050cb240292c08b0Sean Callanan 1638819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 1639819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1640819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 1641819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(0, sym_ctx); 1642819749647b1605f75753f625050cb240292c08b0Sean Callanan 1643819749647b1605f75753f625050cb240292c08b0Sean Callanan return sym_ctx.symbol; 1644819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1645819749647b1605f75753f625050cb240292c08b0Sean Callanan 1646819749647b1605f75753f625050cb240292c08b0Sean Callanan return NULL; 1647819749647b1605f75753f625050cb240292c08b0Sean Callanan} 1648819749647b1605f75753f625050cb240292c08b0Sean Callanan 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1651e5748d889fb7fb97b3ff07444894d7714776b609Greg ClaytonClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name) 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1653aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1654aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1655aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1656e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 16573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1658810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 16598de27c761a22187ef63fb60000894be163e7285fGreg Clayton log->Printf("Hunting for a definition for '%s'", name.GetCString()); 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Back out in all cases where we're not fully initialized 1662aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->frame == NULL) 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 1664ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 1665aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_ignore_lookups) 1666ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 1667ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 1668ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 1669ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 1670ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 1671e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 1672e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton do 1673e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 1674e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (isa<TranslationUnitDecl>(context.m_decl_context)) 1675e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton break; 1676e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 16779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!isa<NamespaceDecl>(context.m_decl_context)) 16789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return; 1679e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 1680e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton const Decl *context_decl = dyn_cast<Decl>(context.m_decl_context); 1681e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 16829b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (log) 16839b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan log->Printf("Searching for '%s' in a '%s'", name.GetCString(), context_decl->getDeclKindName()); 16849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 16859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *original_decl = NULL; 16869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *original_ctx = NULL; 16879b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 16889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!m_parser_vars->GetASTImporter(context.GetASTContext())->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx)) 16899b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan break; 16909b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 16919b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl)) 1692e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 16939b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ExternalASTSource *external_source = original_ctx->getExternalSource(); 1694e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 16959b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!external_source) 1696e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton break; 16979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 16989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!original_tag_decl) 1699e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton break; 1700e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 17019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan external_source->CompleteType (original_tag_decl); 17029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan } 17039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 17049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl); 17059b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 17069b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!original_decl_context) 17079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan break; 1708e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 17099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan for (TagDecl::decl_iterator iter = original_decl_context->decls_begin(); 17109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan iter != original_decl_context->decls_end(); 17119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ++iter) 17129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan { 17139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan NamedDecl *named_decl = dyn_cast<NamedDecl>(*iter); 1714e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 17159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (named_decl && named_decl->getName().equals(name.GetCString())) 1716e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 17179b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(original_ctx, named_decl); 17189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan NamedDecl *copied_named_decl = dyn_cast<NamedDecl>(copied_decl); 17199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 17209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!copied_named_decl) 17219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan continue; 1722e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 17239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan context.AddNamedDecl (copied_named_decl); 1724e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 1725e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 17269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 17279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return; 1728e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 1729e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton while (0); 17303c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1731e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17333bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 17343bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 17353bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 17363bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 17373bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 17388de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 17398de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 17403bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr[0] != '$') 17410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 1742696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name); 17438de27c761a22187ef63fb60000894be163e7285fGreg Clayton 17448de27c761a22187ef63fb60000894be163e7285fGreg Clayton // If we found a variable in scope, no need to pull up function names 17458de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (var != NULL) 174692aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan { 17478de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneVariable(context, var); 174892aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan } 17498de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 175092aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan { 175128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool include_symbols = true; 175228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton const bool append = false; 175328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton m_parser_vars->m_sym_ctx.FindFunctionsByName (name, 175428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton include_symbols, 175528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton append, 175628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton sc_list); 17578de27c761a22187ef63fb60000894be163e7285fGreg Clayton 1758819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sc_list.GetSize()) 17598de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1760819749647b1605f75753f625050cb240292c08b0Sean Callanan bool found_specific = false; 1761819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol *generic_symbol = NULL; 1762819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol *non_extern_symbol = NULL; 1763819749647b1605f75753f625050cb240292c08b0Sean Callanan 1764819749647b1605f75753f625050cb240292c08b0Sean Callanan for (uint32_t index = 0, num_indices = sc_list.GetSize(); 1765819749647b1605f75753f625050cb240292c08b0Sean Callanan index < num_indices; 1766819749647b1605f75753f625050cb240292c08b0Sean Callanan ++index) 17678de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1768819749647b1605f75753f625050cb240292c08b0Sean Callanan SymbolContext sym_ctx; 1769819749647b1605f75753f625050cb240292c08b0Sean Callanan sc_list.GetContextAtIndex(index, sym_ctx); 1770819749647b1605f75753f625050cb240292c08b0Sean Callanan 1771819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sym_ctx.function) 1772819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1773819749647b1605f75753f625050cb240292c08b0Sean Callanan // TODO only do this if it's a C function; C++ functions may be 1774819749647b1605f75753f625050cb240292c08b0Sean Callanan // overloaded 1775819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!found_specific) 1776819749647b1605f75753f625050cb240292c08b0Sean Callanan AddOneFunction(context, sym_ctx.function, NULL); 1777819749647b1605f75753f625050cb240292c08b0Sean Callanan found_specific = true; 1778819749647b1605f75753f625050cb240292c08b0Sean Callanan } 1779819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (sym_ctx.symbol) 1780819749647b1605f75753f625050cb240292c08b0Sean Callanan { 1781819749647b1605f75753f625050cb240292c08b0Sean Callanan if (sym_ctx.symbol->IsExternal()) 1782819749647b1605f75753f625050cb240292c08b0Sean Callanan generic_symbol = sym_ctx.symbol; 1783819749647b1605f75753f625050cb240292c08b0Sean Callanan else 1784819749647b1605f75753f625050cb240292c08b0Sean Callanan non_extern_symbol = sym_ctx.symbol; 1785819749647b1605f75753f625050cb240292c08b0Sean Callanan } 17868de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 1787819749647b1605f75753f625050cb240292c08b0Sean Callanan 1788819749647b1605f75753f625050cb240292c08b0Sean Callanan if (!found_specific) 17898de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1790819749647b1605f75753f625050cb240292c08b0Sean Callanan if (generic_symbol) 1791819749647b1605f75753f625050cb240292c08b0Sean Callanan AddOneFunction (context, NULL, generic_symbol); 1792819749647b1605f75753f625050cb240292c08b0Sean Callanan else if (non_extern_symbol) 1793819749647b1605f75753f625050cb240292c08b0Sean Callanan AddOneFunction (context, NULL, non_extern_symbol); 1794819749647b1605f75753f625050cb240292c08b0Sean Callanan } 17958de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 1796819749647b1605f75753f625050cb240292c08b0Sean Callanan else 17976916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton { 1798819749647b1605f75753f625050cb240292c08b0Sean Callanan // We couldn't find a variable or function for this. Now we'll hunt for a generic 1799819749647b1605f75753f625050cb240292c08b0Sean Callanan // data symbol, and -- if it is found -- treat it as a variable. 1800819749647b1605f75753f625050cb240292c08b0Sean Callanan 1801819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol *data_symbol = FindGlobalDataSymbol(*m_parser_vars->m_exe_ctx->target, name); 1802819749647b1605f75753f625050cb240292c08b0Sean Callanan 1803819749647b1605f75753f625050cb240292c08b0Sean Callanan if (data_symbol) 1804819749647b1605f75753f625050cb240292c08b0Sean Callanan AddOneGenericVariable(context, *data_symbol); 18056916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton } 180692aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan } 1807e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 1808e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name)); 1809e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 1810e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (namespace_decl) 1811e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 1812e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (log) 1813e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 1814e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton std::string s; 1815e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton llvm::raw_string_ostream os(s); 1816e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton namespace_decl.GetNamespaceDecl()->print(os); 1817e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton os.flush(); 1818e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 1819e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton log->Printf("Added namespace decl:"); 1820e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton log->Printf("%s", s.c_str()); 1821e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 1822e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 18239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl); 1824e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (clang_namespace_decl) 1825e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton clang_namespace_decl->setHasExternalLexicalStorage(); 1826e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 18270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 18288de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 18293cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 183057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 183157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 183257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 183357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 183457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 1835aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false); 183657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 183757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!vars) 183857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 183957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 184057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 184157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 184275a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!this_var || 184375a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton !this_var->IsInScope(m_parser_vars->m_exe_ctx->frame) || 184475a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton !this_var->LocationIsValidForFrame (m_parser_vars->m_exe_ctx->frame)) 184557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 184657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 184757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton Type *this_type = this_var->GetType(); 184857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 184957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_type) 185057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 185157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 18522403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton if (log) 18532403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 18542403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString ("Type for \"this\" is: "); 18552403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton StreamString strm; 18562403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton this_type->Dump(&strm, true); 18572403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString (strm.GetData()); 18582403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 18592403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 186004c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser this_user_type(this_type->GetClangFullType(), 186157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 186257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 1863aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type = this_user_type; 186457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 186558baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 186657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 186757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(), 186857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton &pointer_target_type)) 186957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 187057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 187157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton TypeFromUser class_user_type(pointer_target_type, 187257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 187357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 18743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 18753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 18763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 18773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 18783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 18793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str()); 18803aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 18813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 188257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton AddOneType(context, class_user_type, true); 188357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 188457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 188557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 188657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 18873aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 18883aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 18893aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 18903aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 18913aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18923aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false); 18933aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18943aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!vars) 18953aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 18963aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 18973aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 18983aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 189975a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton if (!self_var || 190075a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton !self_var->IsInScope(m_parser_vars->m_exe_ctx->frame) || 190175a40125586d483b2d7722f1b5475cb0f7ef9bf8Greg Clayton !self_var->LocationIsValidForFrame (m_parser_vars->m_exe_ctx->frame)) 19023aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 19033aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 19043aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Type *self_type = self_var->GetType(); 19053aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 19063aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_type) 19073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 19083aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 190904c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser self_user_type(self_type->GetClangFullType(), 19103aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 19113aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 19123aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 19133aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 191458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *pointer_target_type = NULL; 19153aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 19163aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(), 191727a3ad18986370df3dc08e7f9941e5bf824603afJim Ingham &pointer_target_type) 191819c0d58b8d2c168b835477e6a681e971ac32ece5Greg Clayton || pointer_target_type == NULL) 19193aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 19203aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 19213aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser class_user_type(pointer_target_type, 19223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 19233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 19243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 19253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 19263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 19273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 19283aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 19293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str()); 19303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 19313aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 19323aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan AddOneType(context, class_user_type, false); 19333aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 19343aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 19353aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 1936427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1937427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 19383cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan 1939427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 19401ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton AddOneVariable(context, pvar_sp); 19421ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 19431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19441ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 19461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1947aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->GetRegisterContext()) 19481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1949b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); 19501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 19521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan AddOneRegister(context, reg_info); 19531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19548de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 1955a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1956aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name)); 19576df0840c87be29724055716db951aa6d494ddabcSean Callanan 1958ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (type_sp) 1959ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 1960ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 19616df0840c87be29724055716db951aa6d494ddabcSean Callanan { 1962ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf ("Matching type found for \"%s\": ", name.GetCString()); 1963ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan StreamString strm; 1964ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan type_sp->Dump(&strm, true); 1965ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->PutCString (strm.GetData()); 1966ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 19672403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 196804c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton TypeFromUser user_type (type_sp->GetClangFullType(), 1969b01000fd063629facd45044f137446fb748ee179Greg Clayton type_sp->GetClangAST()); 19706df0840c87be29724055716db951aa6d494ddabcSean Callanan 1971ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan AddOneType(context, user_type, false); 19726df0840c87be29724055716db951aa6d494ddabcSean Callanan } 197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1974e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 19759b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananclang::ExternalLoadResult 19769b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::FindExternalLexicalDecls (const DeclContext *decl_context, 19779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan bool (*predicate)(Decl::Kind), 19789b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan llvm::SmallVectorImpl<Decl*> &decls) 1979e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{ 19809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 19819b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 1982e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 19839b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 19849b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan const Decl *context_decl = dyn_cast<Decl>(decl_context); 19859b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 19869b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!context_decl) 19879b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 19889b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 19899b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast_context = &context_decl->getASTContext(); 19909b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 19919b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (log) 19929b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan log->Printf("Finding lexical decls in a '%s' with %s predicate", context_decl->getDeclKindName(), (predicate ? "non-null" : "null")); 19939b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 19949b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *original_decl = NULL; 19959b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *original_ctx = NULL; 19969b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 19979b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ClangASTImporter *ast_importer = m_parser_vars->GetASTImporter(ast_context); 19989b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 19999b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!ast_importer) 20009b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 20019b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!ast_importer->ResolveDeclOrigin(context_decl, &original_decl, &original_ctx)) 20039b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 20049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 2005e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton if (log) 2006e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 20079b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan std::string decl_print_string; 20089b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan llvm::raw_string_ostream decl_print_stream(decl_print_string); 20099b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan original_decl->print(decl_print_stream); 20109b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decl_print_stream.flush(); 20119b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan log->Printf("Original decl:\n%s", decl_print_string.c_str()); 20129b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan } 20139b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20149b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original_decl)) 20159b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan { 20169b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ExternalASTSource *external_source = original_ctx->getExternalSource(); 2017336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 20189b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!external_source) 20199b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 20209b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20219b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!original_tag_decl) 20229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 20239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan external_source->CompleteType (original_tag_decl); 2025e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2026e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 20279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan DeclContext *original_decl_context = dyn_cast<DeclContext>(original_decl); 2028e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 20299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!original_decl_context) 20309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_Failure; 2031e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 20329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan for (TagDecl::decl_iterator iter = original_decl_context->decls_begin(); 20339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan iter != original_decl_context->decls_end(); 20349b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ++iter) 2035e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 20369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *decl = *iter; 2037e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 20389b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (!predicate || predicate(decl->getKind())) 2039e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton { 20409b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan if (log) 20419b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan { 20429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan std::string decl_print_string; 20439b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan llvm::raw_string_ostream decl_print_stream(decl_print_string); 20449b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decl->print(decl_print_stream); 20459b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decl_print_stream.flush(); 20469b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan log->Printf(" Adding lexical decl %s", decl_print_string.c_str()); 20479b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan } 20489b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20499b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *copied_decl = ast_importer->CopyDecl(original_ctx, decl); 2050e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 20519b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan decls.push_back(copied_decl); 2052e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2053e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton } 2054e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 20559b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return ELR_AlreadyLoaded; 20569b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan} 20579b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20589b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid 20599b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteTagDecl (TagDecl *tag_decl) 20609b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{ 20619b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 20629b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20639b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_parser_vars->GetASTImporter(&tag_decl->getASTContext())->CompleteTagDecl (tag_decl); 20649b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan} 20659b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20669b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callananvoid 20679b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananClangExpressionDeclMap::CompleteObjCInterfaceDecl (clang::ObjCInterfaceDecl *interface_decl) 20689b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan{ 20699b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan assert (m_parser_vars.get()); 20709b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan 20719b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan m_parser_vars->GetASTImporter(&interface_decl->getASTContext())->CompleteObjCInterfaceDecl (interface_decl); 2072e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton} 2073e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2074336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 20758de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 20768de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 20778de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 2078696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan VariableSP var, 20799b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context, 20808de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 20818de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 20828de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2084e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 20856184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2090810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2091810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 2092336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 209424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209504c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton clang_type_t var_opaque_type = var_type->GetClangFullType(); 209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2099810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2100810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 2101336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21049b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *ast = var_type->GetClangASTContext().getASTContext(); 210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2106b01000fd063629facd45044f137446fb748ee179Greg Clayton if (!ast) 210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2108810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2109810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 2110336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2113336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 2114336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2117178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 2118178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 2119178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 2120178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 2121178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 2122178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 2123eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target); 2124178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2127bdcb6abaa287df2c5f312c51d993c1d0b0cb120cGreg Clayton if (!var_location_expr.Evaluate(&exe_ctx, ast, NULL, NULL, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 212824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2129810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 2130810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 2131336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 213224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 2133b01000fd063629facd45044f137446fb748ee179Greg Clayton 213458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan void *type_to_use = NULL; 2135336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2136f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 2137f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 2138b01000fd063629facd45044f137446fb748ee179Greg Clayton type_to_use = GuardedCopyType(parser_ast_context, ast, var_opaque_type); 2139f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 21404b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 21414b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 21424b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 21434b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 21444b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 21454b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 21464b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 21474b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 2148f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 2149f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 2150f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 2151336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 2152336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 215324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 21556916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 215624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 215824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 215924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 216024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 2161336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 216224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 2163336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 216424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 216624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 216724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 2168336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 2169336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 217024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 217124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2172aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target); 217324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 217424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->GetScalar() = load_addr; 217524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->SetValueType(Value::eValueTypeLoadAddress); 217624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 217724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2178f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 2179b01000fd063629facd45044f137446fb748ee179Greg Clayton *user_type = TypeFromUser(var_opaque_type, ast); 2180336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2181336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 2182336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 2183336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2184336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 2185696cf5f6f2a77b87a4b06cdf0f697749b494665fSean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var) 2186336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 2187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2188aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2189e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2190336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2191f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 2192f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 2193336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 2194aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx, 21958de27c761a22187ef63fb60000894be163e7285fGreg Clayton var, 21968de27c761a22187ef63fb60000894be163e7285fGreg Clayton context.GetASTContext(), 21978de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 21988de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 2199336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 22004b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 22014b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 22024b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 22036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 22048de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2205427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 2206fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2207fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham entity_name, 2208427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ut, 2209427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2210427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2211427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 2212427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2213427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 2214427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2215427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2216427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 2217696cf5f6f2a77b87a4b06cdf0f697749b494665fSean Callanan entity->m_parser_vars->m_lldb_var = var; 221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2219810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 22208de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2221a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 2222a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2223a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 2224a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 2225a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2226a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); 22276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan 22289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //if (log->GetVerbose()) 22299b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //{ 22309b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // StreamString var_decl_dump_string; 22319b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // ASTDumper::DumpDecl(var_decl_dump_string, var_decl); 22329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // log->Printf("%s\n", var_decl_dump_string.GetData()); 22339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //} 22348de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 22358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 22368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 22378f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 2238a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 2239427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &pvar_sp) 2240a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 2241e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 224245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 2243427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 2244a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 2245427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(), 2246427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 2247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 2248427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 2249a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 22506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 22518c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2252427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 2253427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 2254427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 2255427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 2256427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 225745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 225845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 2259a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 2260a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 2261a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2262a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 2263a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 2264a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2265427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str()); 2266a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 2267a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 2268a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 22691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 2270819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context, 2271819749647b1605f75753f625050cb240292c08b0Sean Callanan Symbol &symbol) 2272819749647b1605f75753f625050cb240292c08b0Sean Callanan{ 2273819749647b1605f75753f625050cb240292c08b0Sean Callanan assert(m_parser_vars.get()); 2274819749647b1605f75753f625050cb240292c08b0Sean Callanan 2275819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2276819749647b1605f75753f625050cb240292c08b0Sean Callanan 22779b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *scratch_ast_context = m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext(); 2278819749647b1605f75753f625050cb240292c08b0Sean Callanan 2279fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(scratch_ast_context, true)), 2280819749647b1605f75753f625050cb240292c08b0Sean Callanan scratch_ast_context); 2281819749647b1605f75753f625050cb240292c08b0Sean Callanan 2282fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type (ClangASTContext::CreateLValueReferenceType(scratch_ast_context, ClangASTContext::GetVoidPtrType(context.GetASTContext(), true)), 2283819749647b1605f75753f625050cb240292c08b0Sean Callanan context.GetASTContext()); 2284819749647b1605f75753f625050cb240292c08b0Sean Callanan 2285fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 2286819749647b1605f75753f625050cb240292c08b0Sean Callanan 2287819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2288819749647b1605f75753f625050cb240292c08b0Sean Callanan ConstString entity_name(decl_name.c_str()); 2289819749647b1605f75753f625050cb240292c08b0Sean Callanan ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2290819749647b1605f75753f625050cb240292c08b0Sean Callanan entity_name, 2291819749647b1605f75753f625050cb240292c08b0Sean Callanan user_type, 2292819749647b1605f75753f625050cb240292c08b0Sean Callanan m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2293819749647b1605f75753f625050cb240292c08b0Sean Callanan m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2294819749647b1605f75753f625050cb240292c08b0Sean Callanan assert (entity.get()); 2295819749647b1605f75753f625050cb240292c08b0Sean Callanan 2296819749647b1605f75753f625050cb240292c08b0Sean Callanan std::auto_ptr<Value> symbol_location(new Value); 2297819749647b1605f75753f625050cb240292c08b0Sean Callanan 2298819749647b1605f75753f625050cb240292c08b0Sean Callanan AddressRange &symbol_range = symbol.GetAddressRangeRef(); 2299819749647b1605f75753f625050cb240292c08b0Sean Callanan Address &symbol_address = symbol_range.GetBaseAddress(); 2300819749647b1605f75753f625050cb240292c08b0Sean Callanan lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(m_parser_vars->m_exe_ctx->target); 2301819749647b1605f75753f625050cb240292c08b0Sean Callanan 2302819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2303819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->GetScalar() = symbol_load_addr; 2304819749647b1605f75753f625050cb240292c08b0Sean Callanan symbol_location->SetValueType(Value::eValueTypeLoadAddress); 2305819749647b1605f75753f625050cb240292c08b0Sean Callanan 2306fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->EnableParserVars(); 2307819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2308819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_named_decl = var_decl; 2309819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_llvm_value = NULL; 2310819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_value = symbol_location.release(); 2311819749647b1605f75753f625050cb240292c08b0Sean Callanan entity->m_parser_vars->m_lldb_sym = &symbol; 2312fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan //entity->m_flags |= ClangExpressionVariable::EVUnknownType; 2313819749647b1605f75753f625050cb240292c08b0Sean Callanan 2314819749647b1605f75753f625050cb240292c08b0Sean Callanan if (log) 2315819749647b1605f75753f625050cb240292c08b0Sean Callanan { 2316819749647b1605f75753f625050cb240292c08b0Sean Callanan std::string var_decl_print_string; 2317819749647b1605f75753f625050cb240292c08b0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2318819749647b1605f75753f625050cb240292c08b0Sean Callanan var_decl->print(var_decl_print_stream); 2319819749647b1605f75753f625050cb240292c08b0Sean Callanan var_decl_print_stream.flush(); 2320819749647b1605f75753f625050cb240292c08b0Sean Callanan 2321819749647b1605f75753f625050cb240292c08b0Sean Callanan log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); 2322819749647b1605f75753f625050cb240292c08b0Sean Callanan 23239b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //if (log->GetVerbose()) 23249b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //{ 23259b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // StreamString var_decl_dump_string; 23269b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // ASTDumper::DumpDecl(var_decl_dump_string, var_decl); 23279b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan // log->Printf("%s\n", var_decl_dump_string.GetData()); 23289b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan //} 2329819749647b1605f75753f625050cb240292c08b0Sean Callanan } 2330819749647b1605f75753f625050cb240292c08b0Sean Callanan} 2331819749647b1605f75753f625050cb240292c08b0Sean Callanan 2332fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool 2333fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes() 2334fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{ 2335fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2336fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 23379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *scratch_ast_context = m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext(); 2338fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2339fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan for (size_t index = 0, num_entities = m_found_entities.GetSize(); 2340fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan index < num_entities; 2341fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ++index) 2342fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2343fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index); 2344fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2345fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (entity->m_flags & ClangExpressionVariable::EVUnknownType) 2346fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2347fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const NamedDecl *named_decl = entity->m_parser_vars->m_named_decl; 2348fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl); 2349fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2350fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (!var_decl) 2351fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2352fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2353fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Entity of unknown type does not have a VarDecl"); 2354fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return false; 2355fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2356fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2357fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan if (log) 2358fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan { 2359fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan std::string var_decl_print_string; 2360fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 2361fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan var_decl->print(var_decl_print_stream); 2362fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan var_decl_print_stream.flush(); 2363fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2364fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan log->Printf("Variable of unknown type now has Decl %s", var_decl_print_string.c_str()); 2365fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2366fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2367fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan QualType var_type = var_decl->getType(); 2368fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext()); 2369fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2370fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan lldb::clang_type_t copied_type = ClangASTContext::CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr()); 2371fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2372fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan TypeFromUser user_type(copied_type, scratch_ast_context); 2373fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2374fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_lldb_value->SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType()); 2375fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_parser_vars->m_parser_type = parser_type; 2376fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2377fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangAST(user_type.GetASTContext()); 2378fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->SetClangType(user_type.GetOpaqueQualType()); 2379fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2380fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType); 2381fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2382fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan } 2383fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2384fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan return true; 2385fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan} 2386fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan 2387819749647b1605f75753f625050cb240292c08b0Sean Callananvoid 2388427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 2389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const RegisterInfo *reg_info) 23901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 23911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 23921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 23931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(), 23941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 23951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 23961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 23971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 23981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 23991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 24001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 24011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 24021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2403427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 2404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 24051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 24061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 24071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 2408fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope(), 2409fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 24121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 2413427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 2414427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 2415427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2416427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 2417427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 2418427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2419427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 24201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 24211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (log) 24221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 24231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string var_decl_print_string; 24241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 24251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl->print(var_decl_print_stream); 24261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl_print_stream.flush(); 24271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 24281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str()); 24291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 24301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 24311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 24329b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean CallananNamespaceDecl * 24336916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl) 24346916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{ 24356916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 24366916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 2437e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton assert (m_parser_vars.get()); 2438e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 24399b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan Decl *copied_decl = m_parser_vars->GetASTImporter(context.GetASTContext())->CopyDecl(namespace_decl.GetASTContext(), 2440e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton namespace_decl.GetNamespaceDecl()); 24416916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 24429b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan return dyn_cast<NamespaceDecl>(copied_decl); 24436916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 24446916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 2445a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 2446da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context, 2447da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Function* fun, 2448da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton Symbol* symbol) 24498f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 2450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2451aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2452e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 24538f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 245458baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan NamedDecl *fun_decl = NULL; 24550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 245658baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan const Address *fun_address = NULL; 24578f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 24580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 24590fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 24609b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *fun_ast_context = NULL; 24618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 24620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 24630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 24640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 24650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 24660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 24670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 24680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 24690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no type"); 24700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 24710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 24720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 247304c9c7b03fbec6d0dcc6c848391147de2f129c66Greg Clayton fun_opaque_type = fun_type->GetClangFullType(); 24740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 24750fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 24760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 24770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 24780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no Clang type"); 24790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 24800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 24810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 24820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 24830fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 2484b01000fd063629facd45044f137446fb748ee179Greg Clayton fun_ast_context = fun_type->GetClangASTContext().getASTContext(); 2485ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 24860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 24870fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddFunDecl(copied_type); 24880fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 24890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 24900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 24910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 24920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 24930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 24940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 24950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 24968f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 2497810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 24980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("AddOneFunction called with no function and no symbol"); 24998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 25008f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 25018f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 2502da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(m_parser_vars->m_exe_ctx->target); 25038f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 25048f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 25058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 2506fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->GetBestExecutionContextScope (), 2507fa3a16a2ea380ef38388ebe323817bd1b32c20cdJim Ingham m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2508427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2509427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 25108de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2511427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 2512427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 2513427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 2514427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2515427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2516427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 2517427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2518427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 25198c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2520810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 25218de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2522a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string fun_decl_print_string; 2523a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string); 2524a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl->print(fun_decl_print_stream); 2525a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl_print_stream.flush(); 2526a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2527a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str()); 25288de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 252924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 253093a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 253193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 253293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 25333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 25343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 253593a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 25369b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *parser_ast_context = context.GetASTContext(); 25379b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan ASTContext *user_ast_context = ut.GetASTContext(); 25383c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 2539ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 25403c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 25413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromParser parser_type(copied_type, parser_ast_context); 254293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 25433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 25443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 25453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 25463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 25473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 25483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 25493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 25503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 25513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args, 25523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1, 25533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan false, 25543c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 255530449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 25561d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 25571d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 25581d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 255930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 256030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 25611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 25621d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 25638de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 25641d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 25651d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 25661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 25671d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 256830449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 256930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit); 25703c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 257193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 257293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 257393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 2574ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2575ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid * 2576ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context, 2577ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan ASTContext *source_context, 2578ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *clang_type) 2579ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{ 2580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2582aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = true; 2583ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2584e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton lldb_private::ClangASTImporter *importer = m_parser_vars->GetASTImporter(dest_context); 2585e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2586e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton QualType ret_qual_type = importer->CopyType (source_context, 2587e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton QualType::getFromOpaquePtr(clang_type)); 2588e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton 2589e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton void *ret = ret_qual_type.getAsOpaquePtr(); 2590ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2591aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = false; 2592ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2593ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return ret; 2594ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan} 2595