ClangExpressionDeclMap.cpp revision 97678d17ac9bcb66f7092178109271991ab16533
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" 2305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 25a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 276916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 36f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 37810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 3817c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h" 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 40f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 4178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h" 42a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "llvm/Support/raw_ostream.h" 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 443bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory) : 498de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_found_entities (), 508de27c761a22187ef63fb60000894be163e7285fGreg Clayton m_struct_members (), 51aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars (), 526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan m_struct_vars (), 536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan m_keep_result_in_memory (keep_result_in_memory) 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableStructVars(); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 59aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 61aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableStructVars(); 62aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 64427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 65427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx) 668c12720c108cd5e7ed792596749218d8400f647eSean Callanan{ 67aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableParserVars(); 68aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_exe_ctx = &exe_ctx; 6945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 70aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.frame) 71aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_sym_ctx = exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything); 7278b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham else if (exe_ctx.thread) 7378b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham m_parser_vars->m_sym_ctx = exe_ctx.thread->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything); 7478b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham 75427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (exe_ctx.target) 76427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_persistent_vars = &exe_ctx.target->GetPersistentVariables(); 77aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 78c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 79427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Claytonvoid 80427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse() 81aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 82aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars.get()) 83aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 84427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t entity_index = 0, num_entities = m_found_entities.GetSize(); 85aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan entity_index < num_entities; 86aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++entity_index) 87aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 88427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index)); 89427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (var_sp && 90427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars.get() && 91427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_lldb_value) 92427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton delete var_sp->m_parser_vars->m_lldb_value; 93aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 94427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->DisableParserVars(); 95aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 96aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 97427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize(); 98aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan pvar_index < num_pvars; 99aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ++pvar_index) 100aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 101427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index)); 102427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 103427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->DisableParserVars(); 104aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 105aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 106aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableParserVars(); 1077a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan } 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 1118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1128de27c761a22187ef63fb60000894be163e7285fGreg Claytonconst ConstString & 1138de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetPersistentResultName () 11482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan{ 115aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 116aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_result_name) 118427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton { 119427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton Target *target = m_parser_vars->GetTarget(); 120427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (target); 121427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_result_name = target->GetPersistentVariables().GetNextPersistentVariableName(); 122427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton } 123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan return m_struct_vars->m_result_name; 12482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan} 12582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 12605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callananlldb::ClangExpressionVariableSP 12705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean CallananClangExpressionDeclMap::BuildIntegerVariable (const ConstString &name, 12805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan lldb_private::TypeFromParser type, 12905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan const llvm::APInt& value) 13005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan{ 13105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan assert (m_parser_vars.get()); 13205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 13305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 13405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 13505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 13605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetASTContext(), 13705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan type.GetOpaqueQualType()), 13805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan context); 13905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 1400e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name, 1410e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan user_type, 1420e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan m_parser_vars->m_exe_ctx->process->GetByteOrder(), 1430e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan m_parser_vars->m_exe_ctx->process->GetAddressByteSize())) 1440e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 1450e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 1460e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan ClangExpressionVariableSP pvar_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 1470e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 1480e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (!pvar_sp) 1490e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 15005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 1510e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan uint8_t *pvar_data = pvar_sp->GetValueBytes(); 1520e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan if (pvar_data == NULL) 1530e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 15405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 15505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t value64 = value.getLimitedValue(); 15605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 15705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ByteOrder byte_order = m_parser_vars->m_exe_ctx->process->GetByteOrder(); 15805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 15905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_val_bytes = sizeof(value64); 1600e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan size_t num_data_bytes = pvar_sp->GetByteSize(); 16105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 16205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan size_t num_bytes = num_val_bytes; 16305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan if (num_bytes > num_data_bytes) 16405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan num_bytes = num_data_bytes; 16505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 16605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan for (off_t byte_idx = 0; 16705a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan byte_idx < num_bytes; 16805a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan ++byte_idx) 16905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 17005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t shift = byte_idx * 8; 17105a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint64_t mask = 0xffll << shift; 17205a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan uint8_t cur_byte = (uint8_t)((value64 & mask) >> shift); 17305a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 17405a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan switch (byte_order) 17505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan { 1760e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderBig: 1770e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // High Low 1780e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Original: |AABBCCDDEEFFGGHH| 1790e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |EEFFGGHH| 1800e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 1810e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[num_data_bytes - (1 + byte_idx)] = cur_byte; 1820e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 1830e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan case eByteOrderLittle: 1840e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan // Target: |HHGGFFEE| 1850e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan pvar_data[byte_idx] = cur_byte; 1860e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan break; 1870e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan default: 1880e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return lldb::ClangExpressionVariableSP(); 18905a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 19005a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan } 1916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 1926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_sp->m_flags |= ClangExpressionVariable::EVIsFreezeDried; 1930e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan 1940e0817dc2e68f02005b17b5a77e6a35bc1f85f1dSean Callanan return pvar_sp; 19505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan} 19605a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan 1978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 1988de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable 1998de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 2008de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 2018de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 2026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromParser parser_type, 2036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_result, 2046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool is_lvalue 2058de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 206a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 207aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 208aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 2106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 211aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan clang::ASTContext *context(m_parser_vars->m_exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 212a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 213a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan TypeFromUser user_type(ClangASTContext::CopyType(context, 21482b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetASTContext(), 21582b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan parser_type.GetOpaqueQualType()), 21697678d17ac9bcb66f7092178109271991ab16533Sean Callanan context); 217a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 218427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!m_parser_vars->m_persistent_vars->CreatePersistentVariable (name, 219427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type, 220427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetByteOrder(), 221427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())) 2228c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 2238c12720c108cd5e7ed792596749218d8400f647eSean Callanan 224427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_parser_vars->m_persistent_vars->GetVariable(name)); 2258c12720c108cd5e7ed792596749218d8400f647eSean Callanan 226427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 2278c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 2288c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_result) 2306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry; 2316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 2326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist 2336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (is_lvalue) 2356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference; 2376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 2386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 2396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 2406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated; 2416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation; 2426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 2436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 2446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 2456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags); 2466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 247427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableParserVars(); 2488c12720c108cd5e7ed792596749218d8400f647eSean Callanan 249427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_named_decl = decl; 250427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_parser_type = parser_type; 2518c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2528c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 253a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 254a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 255a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 2568de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct 2578de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 2588de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 2598de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 2608de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *value, 2618de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t size, 2628de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t alignment 2638de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 2648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 265aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 266aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 267aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 268e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 26945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 270aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = false; 2718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2728c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (m_struct_members.GetVariable(decl)) 2738c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 2748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 275427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl)); 2768c12720c108cd5e7ed792596749218d8400f647eSean Callanan 277427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 278427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl); 2798c12720c108cd5e7ed792596749218d8400f647eSean Callanan 280427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 2818c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 2828c12720c108cd5e7ed792596749218d8400f647eSean Callanan 28345690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 28445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan log->Printf("Adding value for decl %p [%s - %s] to the structure", 28545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan decl, 2868de27c761a22187ef63fb60000894be163e7285fGreg Clayton name.GetCString(), 287427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->GetName().GetCString()); 28845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 2898c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know entity->m_parser_vars is valid because we used a parser variable 2908c12720c108cd5e7ed792596749218d8400f647eSean Callanan // to find it 291427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_parser_vars->m_llvm_value = value; 2928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 293427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->EnableJITVars(); 294427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_alignment = alignment; 295427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton var_sp->m_jit_vars->m_size = size; 2968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 297427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_members.AddVariable(var_sp); 2988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 2998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 3008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 3018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 3038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 3048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 305aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 306aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 307aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_struct_vars->m_struct_laid_out) 3088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 3098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 3118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 312aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_alignment = 0; 313aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = 0; 3148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 315427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_index = 0, num_members = m_struct_members.GetSize(); 3168c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 3178c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 3188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 319427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 320427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 321427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 322427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 3248c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 3258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3268c12720c108cd5e7ed792596749218d8400f647eSean Callanan if (member_index == 0) 327427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_struct_vars->m_struct_alignment = member_sp->m_jit_vars->m_alignment; 3288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 329427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (cursor % member_sp->m_jit_vars->m_alignment) 330427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += (member_sp->m_jit_vars->m_alignment - (cursor % member_sp->m_jit_vars->m_alignment)); 3318c12720c108cd5e7ed792596749218d8400f647eSean Callanan 332427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset = cursor; 333427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton cursor += member_sp->m_jit_vars->m_size; 3348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 3358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 336aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_size = cursor; 3378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 338aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_struct_laid_out = true; 3398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 3408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 3418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3428de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo 3438de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3448de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t &num_elements, 3458de27c761a22187ef63fb60000894be163e7285fGreg Clayton size_t &size, 3468de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &alignment 3478de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 3488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 349aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 350aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 351aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 3528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 3538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 354427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton num_elements = m_struct_members.GetSize(); 355aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan size = m_struct_vars->m_struct_size; 356aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan alignment = m_struct_vars->m_struct_alignment; 3578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 3598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 3608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 3618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 3628de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement 3638de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3648de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *&decl, 3658de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value *&value, 3668de27c761a22187ef63fb60000894be163e7285fGreg Clayton off_t &offset, 3678de27c761a22187ef63fb60000894be163e7285fGreg Clayton ConstString &name, 3688de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint32_t index 3698de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 3708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 371aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 372aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 373aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 3748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 3758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 376427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (index >= m_struct_members.GetSize()) 3778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 3788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 379427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index)); 3808c12720c108cd5e7ed792596749218d8400f647eSean Callanan 381427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp || 382427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_parser_vars.get() || 383427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton !member_sp->m_jit_vars.get()) 3848c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 3858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 386427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton decl = member_sp->m_parser_vars->m_named_decl; 387427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = member_sp->m_parser_vars->m_llvm_value; 388427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton offset = member_sp->m_jit_vars->m_offset; 389427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton name = member_sp->GetName(); 3908c12720c108cd5e7ed792596749218d8400f647eSean Callanan 3918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 3928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 3938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 39402fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 3958de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo 3968de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 3978de27c761a22187ef63fb60000894be163e7285fGreg Clayton const clang::NamedDecl *decl, 3988de27c761a22187ef63fb60000894be163e7285fGreg Clayton llvm::Value**& value, 3998de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 4008de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 401ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl)); 4038c12720c108cd5e7ed792596749218d8400f647eSean Callanan 404427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!entity_sp) 4058c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 406ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 4078c12720c108cd5e7ed792596749218d8400f647eSean Callanan // We know m_parser_vars is valid since we searched for the variable by 4088c12720c108cd5e7ed792596749218d8400f647eSean Callanan // its NamedDecl 409ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 410427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton value = &entity_sp->m_parser_vars->m_llvm_value; 411427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ptr = entity_sp->m_parser_vars->m_lldb_value->GetScalar().ULongLong(); 4128c12720c108cd5e7ed792596749218d8400f647eSean Callanan 4138c12720c108cd5e7ed792596749218d8400f647eSean Callanan return true; 414ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 415ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 416f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 4178de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress 4188de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4198de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 4208de27c761a22187ef63fb60000894be163e7285fGreg Clayton uint64_t &ptr 4218de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 422f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 423aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 424aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 425f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 42678b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (m_parser_vars->m_exe_ctx->target == NULL) 42778b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham return false; 42878b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham if (!m_parser_vars->m_sym_ctx.target_sp) 429f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 430f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 431e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 432f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 433aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_sym_ctx.FindFunctionsByName(name, false, sc_list); 434f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 435e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton if (!sc_list.GetSize()) 436f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 437f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 438f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 439e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(0, sym_ctx); 440f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 441f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan const Address *fun_address; 442f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 443f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 444f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 445f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 446f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 447f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 448f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 449f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ptr = fun_address->GetLoadAddress (m_parser_vars->m_exe_ctx->target); 451f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 452f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 453f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 454f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 455810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 456f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 457f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 4588de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Materialize 4598de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 460aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 4618de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &struct_address, 4628de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 4638de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 464f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 465aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan EnableMaterialVars(); 466aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 467aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process = exe_ctx.process; 468aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 4696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool result = DoMaterialize(false /* dematerialize */, exe_ctx, NULL, err); 470f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 471f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 472aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan struct_address = m_material_vars->m_materialized_location; 473f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 474f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 475f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 476f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 477f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 4788de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetObjectPointer 4798de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 4808de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t &object_ptr, 4813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan ConstString &object_name, 482aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 483047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Error &err, 484047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan bool suppress_type_check 4858de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 4863c9c5eb466869ede185e879d14a47335fb43194dSean Callanan{ 487aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 488aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 489aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.frame || !exe_ctx.target || !exe_ctx.process) 4903c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 4913c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because the context is incomplete"); 4923c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 4933c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 4943c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 495aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) 4963c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 4973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan err.SetErrorString("Couldn't load 'this' because its type is unknown"); 4983c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 4993c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 5003c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 501047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan Variable *object_ptr_var = FindVariableInScope (*exe_ctx.frame, 502047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan object_name, 503047923c7bc90275f29c2e179d2385df26b8d81a1Sean Callanan (suppress_type_check ? NULL : &m_struct_vars->m_object_pointer_type)); 5043c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5053c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!object_ptr_var) 5063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 5073aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't find '%s' with appropriate type in scope", object_name.GetCString()); 5083c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 5093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 5103c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 511aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 5123c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr_var, 513aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 5143c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5153c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (!location_value.get()) 5163c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 5173aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Couldn't get the location for '%s'", object_name.GetCString()); 5183c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 5193c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 5203c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5213c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (location_value->GetValueType() == Value::eValueTypeLoadAddress) 5223c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 5233c9c5eb466869ede185e879d14a47335fb43194dSean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 524aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan uint32_t address_byte_size = exe_ctx.target->GetArchitecture().GetAddressByteSize(); 525aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ByteOrder address_byte_order = exe_ctx.process->GetByteOrder(); 5263c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 527aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (ClangASTType::GetClangTypeBitWidth(m_struct_vars->m_object_pointer_type.GetASTContext(), 528aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type.GetOpaqueQualType()) != address_byte_size * 8) 5293c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 5303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("'%s' is not of an expected pointer size", object_name.GetCString()); 5313c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 5323c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 5333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5343c9c5eb466869ede185e879d14a47335fb43194dSean Callanan DataBufferHeap data; 5353c9c5eb466869ede185e879d14a47335fb43194dSean Callanan data.SetByteSize(address_byte_size); 5363c9c5eb466869ede185e879d14a47335fb43194dSean Callanan Error read_error; 5373c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 538aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.process->ReadMemory (value_addr, data.GetBytes(), address_byte_size, read_error) != address_byte_size) 5393c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 5403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("Coldn't read '%s' from the target: %s", object_name.GetCString(), read_error.AsCString()); 5413c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 5423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 5433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan DataExtractor extractor(data.GetBytes(), data.GetByteSize(), address_byte_order, address_byte_size); 5453c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5463c9c5eb466869ede185e879d14a47335fb43194dSean Callanan uint32_t offset = 0; 5473c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5483c9c5eb466869ede185e879d14a47335fb43194dSean Callanan object_ptr = extractor.GetPointer(&offset); 5493c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5503c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return true; 5513c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 5523c9c5eb466869ede185e879d14a47335fb43194dSean Callanan else 5533c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 5543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan err.SetErrorStringWithFormat("'%s' is not in memory; LLDB must be extended to handle registers", object_name.GetCString()); 5553c9c5eb466869ede185e879d14a47335fb43194dSean Callanan return false; 5563c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 5573c9c5eb466869ede185e879d14a47335fb43194dSean Callanan} 5583c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 5593c9c5eb466869ede185e879d14a47335fb43194dSean Callananbool 5608de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::Dematerialize 5618de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 562aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 563427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &result_sp, 5648de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 5658de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 566f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 567427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return DoMaterialize(true, exe_ctx, &result_sp, err); 568aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 569aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DidDematerialize(); 570aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan} 571aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 572aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callananvoid 573aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean CallananClangExpressionDeclMap::DidDematerialize() 574aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 575aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars.get()) 576aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 577aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 578aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan { 579aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan //#define SINGLE_STEP_EXPRESSIONS 580aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 581aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 582aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_process->DeallocateMemory(m_material_vars->m_materialized_location); 583aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan#endif 584aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 585aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 586aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 587aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DisableMaterialVars(); 588aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan } 589f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 590f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 59132824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 5928de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DumpMaterializedStruct 5938de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 594aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 5958de27c761a22187ef63fb60000894be163e7285fGreg Clayton Stream &s, 5968de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 5978de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 59832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 599aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 600aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_material_vars.get()); 601aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 602aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 60332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 60432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 60532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 60632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 60732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 608aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.process) 60932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 61032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 61132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 61232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 61332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 614aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.target) 61532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 61632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 61732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 61832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 61932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 6203371102ecdff827087df3c27549e57760a6bbc97Sean Callanan if (!m_material_vars->m_materialized_location) 6213371102ecdff827087df3c27549e57760a6bbc97Sean Callanan { 6223371102ecdff827087df3c27549e57760a6bbc97Sean Callanan err.SetErrorString("No materialized location"); 6233371102ecdff827087df3c27549e57760a6bbc97Sean Callanan return false; 6243371102ecdff827087df3c27549e57760a6bbc97Sean Callanan } 6253371102ecdff827087df3c27549e57760a6bbc97Sean Callanan 626aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::DataBufferSP data(new DataBufferHeap(m_struct_vars->m_struct_size, 0)); 62732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 62832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 629aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (exe_ctx.process->ReadMemory (m_material_vars->m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize()) 63032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 63132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 63232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 63332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 63432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 635aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan DataExtractor extractor(data, exe_ctx.process->GetByteOrder(), exe_ctx.target->GetArchitecture().GetAddressByteSize()); 63632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 637427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (size_t member_idx = 0, num_members = m_struct_members.GetSize(); 638427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_idx < num_members; 639427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ++member_idx) 64032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 641427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_idx)); 64232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 643427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp) 644427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton return false; 645427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 646427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton s.Printf("[%s]\n", member_sp->GetName().GetCString()); 6478c12720c108cd5e7ed792596749218d8400f647eSean Callanan 648427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 6498c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 6508c12720c108cd5e7ed792596749218d8400f647eSean Callanan 651427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton extractor.Dump (&s, // stream 652427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_offset, // offset 653427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::eFormatBytesWithASCII, // format 654427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1, // byte size of individual entries 655427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton member_sp->m_jit_vars->m_size, // number of entries 656427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 16, // entries per line 657427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, // address to print 658427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0, // bit size (bitfields only; 0 means ignore) 659427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 0); // bit alignment (bitfields only; 0 means ignore) 66032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 66132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 66232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 66332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 66432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 66532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 66632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 6688de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterialize 6698de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 6708de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 671aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ExecutionContext &exe_ctx, 672427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton lldb::ClangExpressionVariableSP *result_sp_ptr, 6738de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 6748de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 675810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 676427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (result_sp_ptr) 677427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton result_sp_ptr->reset(); 678427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 679aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 680aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 681e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 68282b74c85f719be67b78f9284a6a1341d47f7ac9cSean Callanan 683aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_laid_out) 684810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 685810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 686810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 687810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 688810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 689aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!exe_ctx.frame) 69045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 69145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 69245839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan return LLDB_INVALID_ADDRESS; 69345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 69445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 695427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangPersistentVariables &persistent_vars = exe_ctx.target->GetPersistentVariables(); 696aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 697aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (!m_struct_vars->m_struct_size) 698e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan { 699e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan if (log) 700e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan log->PutCString("Not bothering to allocate a struct because no arguments are needed"); 701e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 702aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = NULL; 703e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 704e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan return true; 705e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan } 706e8a59a8ec92e71203e434f28b5bac6606aacaf3cSean Callanan 707aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan const SymbolContext &sym_ctx(exe_ctx.frame->GetSymbolContext(lldb::eSymbolContextEverything)); 708810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 709f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 710f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 711aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location) 712f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 713aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan exe_ctx.process->DeallocateMemory(m_material_vars->m_materialized_location); 714aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = 0; 715f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 716810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 7177a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan if (log) 7187a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan log->PutCString("Allocating memory for materialized argument struct"); 7197a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan 720aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t mem = exe_ctx.process->AllocateMemory(m_struct_vars->m_struct_alignment + m_struct_vars->m_struct_size, 721aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 722aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan err); 723f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 724f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 725f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 726f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 727aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_allocated_area = mem; 728f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 729810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 730aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_material_vars->m_materialized_location = m_material_vars->m_allocated_area; 731810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 732aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_material_vars->m_materialized_location % m_struct_vars->m_struct_alignment) 733aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean 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)); 734810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 735427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton for (uint64_t member_index = 0, num_members = m_struct_members.GetSize(); 7368c12720c108cd5e7ed792596749218d8400f647eSean Callanan member_index < num_members; 7378c12720c108cd5e7ed792596749218d8400f647eSean Callanan ++member_index) 738810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(member_index)); 7404d0b110715d321d366dec1dc690300f713b63236Sean Callanan 741a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (m_found_entities.ContainsVariable (member_sp)) 742336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 743a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton RegisterInfo *reg_info = member_sp->GetRegisterInfo (); 744427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (reg_info) 7451ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 7461ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan // This is a register variable 7471ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 748aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan RegisterContext *reg_ctx = exe_ctx.GetRegisterContext(); 7491ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 7501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx) 7511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 7521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 753427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneRegister (dematerialize, 754427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 755427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_ctx, 756427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton *reg_info, 757427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 758427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 7591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 7601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 7611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 7621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 763427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!member_sp->m_jit_vars.get()) 7641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 7651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 766427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!DoMaterializeOneVariable (dematerialize, 767427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton exe_ctx, 7686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan sym_ctx, 7696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan member_sp, 770427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 771427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err)) 7721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 7731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 7748c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 775a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 7768c12720c108cd5e7ed792596749218d8400f647eSean Callanan { 777a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // No need to look for presistent variables if the name doesn't start 778a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // with with a '$' character... 779a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName().AsCString ("!")[0] == '$' && persistent_vars.ContainsVariable(member_sp)) 78045690fe3b8b4efb101dd31085413381021a69c2fSean Callanan { 7816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan bool keep_this_in_memory = false; 7826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 783a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (member_sp->GetName() == m_struct_vars->m_result_name) 784a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 785a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (log) 786a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton log->PutCString("Found result member in the struct"); 7876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 788a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (result_sp_ptr) 789a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton *result_sp_ptr = member_sp; 7906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 7916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan keep_this_in_memory = m_keep_result_in_memory; 792a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 793a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 794a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!DoMaterializeOnePersistentVariable (dematerialize, 7956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx, 796a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton member_sp, 797a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_material_vars->m_materialized_location + member_sp->m_jit_vars->m_offset, 798a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err)) 799a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 800f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 801a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else 802a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 803a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton err.SetErrorStringWithFormat("Unexpected variable %s", member_sp->GetName().GetCString()); 8048c12720c108cd5e7ed792596749218d8400f647eSean Callanan return false; 805a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 8068c12720c108cd5e7ed792596749218d8400f647eSean Callanan } 807810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 808810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 809f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 810f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 811f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 8126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callananstatic bool WriteAddressInto 8136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan( 8146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ExecutionContext &exe_ctx, 8156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t target, 8166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t address, 8176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error &err 8186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan) 8196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan{ 8206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize(); 8216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan StreamString str (0 | Stream::eBinary, 8236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pointer_byte_size, 8246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan exe_ctx.process->GetByteOrder()); 8256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan switch (pointer_byte_size) 8276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 8286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan default: 8296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan assert(!"Unhandled byte size"); 8306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan case 4: 8316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 8326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan uint32_t address32 = address & 0xffffffffll; 8336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan str.PutRawBytes(&address32, sizeof(address32), eByteOrderHost, eByteOrderInvalid); 8346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 8356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan break; 8366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan case 8: 8376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 8386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan uint64_t address64 = address; 8396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan str.PutRawBytes(&address64, sizeof(address64), eByteOrderHost, eByteOrderInvalid); 8406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 8416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan break; 8426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 8436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return (exe_ctx.process->WriteMemory (target, str.GetData(), pointer_byte_size, err) == pointer_byte_size); 8456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan} 8466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callananstatic lldb::addr_t ReadAddressFrom 8486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan( 8496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ExecutionContext &exe_ctx, 8506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t source, 8516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error &err 8526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan) 8536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan{ 8546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t pointer_byte_size = exe_ctx.process->GetAddressByteSize(); 8556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan DataBufferHeap *buf = new DataBufferHeap(pointer_byte_size, 0); 8576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan DataBufferSP buf_sp(buf); 8586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->ReadMemory (source, buf->GetBytes(), pointer_byte_size, err) != pointer_byte_size) 8606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return LLDB_INVALID_ADDRESS; 8616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan DataExtractor extractor (buf_sp, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize()); 8636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan uint32_t offset = 0; 8656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 8666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return (lldb::addr_t)extractor.GetPointer(&offset); 8676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan} 8686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 869a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool 8708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOnePersistentVariable 8718de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 8728de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 8738de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 874427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &var_sp, 8758de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 8768de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 8778de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 878aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 8796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 8806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 881427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (!var_sp) 882a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 883427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton err.SetErrorString("Invalid persistent variable"); 884a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return LLDB_INVALID_ADDRESS; 885a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 886a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 887427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const size_t pvar_byte_size = var_sp->GetByteSize(); 888a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 889427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton uint8_t *pvar_data = var_sp->GetValueBytes(); 890427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_data == NULL) 891a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan return false; 892a6223431cf44c6c1e885d2f04cc78cb4155375e5Sean Callanan 893a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan Error error; 894a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 8956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area used to hold the persistent variable. 8966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 897a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan if (dematerialize) 898a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 8996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 9006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing persistent variable with flags 0x%hx", var_sp->m_flags); 9016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) || 9036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference)) 9046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the target out of the struct. 9066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error read_error; 9086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = ReadAddressFrom(exe_ctx, addr, read_error); 9096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 9116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't read address of %s from struct: %s", var_sp->GetName().GetCString(), error.AsCString()); 9136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 9146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && 9176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !var_sp->m_live_sp) 9186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // If the reference comes from the program, then the ClangExpressionVariable's 9206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // live variable data hasn't been set up yet. Do this now. 9216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_live_sp.reset(new lldb_private::ValueObjectConstResult(var_sp->GetTypeFromUser().GetASTContext(), 9236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->GetTypeFromUser().GetOpaqueQualType(), 9246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->GetName(), 9256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem, 9266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::eAddressTypeLoad, 9276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_byte_size)); 9286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!var_sp->m_live_sp) 9316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", var_sp->GetName().GetCString()); 9336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 9346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_live_sp->GetValue().GetValueAddressType() != lldb::eAddressTypeLoad) 9376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", var_sp->GetName().GetCString()); 9396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 9406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 94297678d17ac9bcb66f7092178109271991ab16533Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsFreezeDry || 94397678d17ac9bcb66f7092178109271991ab16533Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 9446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 9466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 9486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Dematerializing %s from 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 9496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Read the contents of the spare memory area 9516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 9536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Read"); 9546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->ValueUpdated (); 9566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->ReadMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 9576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 9596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 9606a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9616a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsFreezeDry; 9636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation && 9666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan !(var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget)) 9676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (m_keep_result_in_memory) 9696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; 9716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 9736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error deallocate_error = exe_ctx.process->DeallocateMemory(mem); 9756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!err.Success()) 9776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't deallocate memory for %s: %s", var_sp->GetName().GetCString(), deallocate_error.AsCString()); 9796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 9806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 9846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else 985a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 9866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 987a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 988a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 989a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 990a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan else 991a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 9926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 9936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materializing persistent variable with flags 0x%hx", var_sp->m_flags); 9946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVNeedsAllocation) 9966a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 9976a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Allocate a spare memory area to store the persistent variable's contents. 9986a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 9996a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 10006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10016a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = exe_ctx.process->AllocateMemory(pvar_byte_size, 10026a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 10036a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan allocate_error); 10046a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10056a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 10066a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10076a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", var_sp->GetName().GetCString(), allocate_error.AsCString()); 10086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 10096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10106a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 10126a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Allocated %s (0x%llx) sucessfully", var_sp->GetName().GetCString(), mem); 10136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10146a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 10156a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10166a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_live_sp.reset(new lldb_private::ValueObjectConstResult(var_sp->GetTypeFromUser().GetASTContext(), 10176a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->GetTypeFromUser().GetOpaqueQualType(), 10186a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->GetName(), 10196a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem, 10206a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::eAddressTypeLoad, 10216a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan pvar_byte_size)); 10226a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10236a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Clear the flag if the variable will never be deallocated. 10246a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10256a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (var_sp->m_flags & ClangExpressionVariable::EVKeepInTarget) 10266a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags &= ~ClangExpressionVariable::EVNeedsAllocation; 10276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Write the contents of the variable to the area. 10296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->WriteMemory (mem, pvar_data, pvar_byte_size, error) != pvar_byte_size) 10316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 10336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 10346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if ((var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference && var_sp->m_live_sp) || 10386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan var_sp->m_flags & ClangExpressionVariable::EVIsLLDBAllocated) 10396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = var_sp->m_live_sp->GetValue().GetScalar().ULongLong(); 10416a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 10436a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10446a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 10456a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!WriteAddressInto(exe_ctx, addr, mem, write_error)) 10466a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 10476a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", var_sp->GetName().GetCString(), write_error.AsCString()); 10486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 10496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (log) 10526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan log->Printf("Materialized %s into 0x%llx", var_sp->GetName().GetCString(), (uint64_t)mem); 10536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 10546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan else if (!var_sp->m_flags & ClangExpressionVariable::EVIsProgramReference) 1055a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan { 10566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Persistent variables without separate allocations are not currently supported."); 1057a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return false; 1058a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1059a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan } 1060a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1061a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan return true; 1062a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1063a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1064f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 10658de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::DoMaterializeOneVariable 10668de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 10678de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool dematerialize, 10688de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 10698de27c761a22187ef63fb60000894be163e7285fGreg Clayton const SymbolContext &sym_ctx, 10706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan ClangExpressionVariableSP &expr_var, 10718de27c761a22187ef63fb60000894be163e7285fGreg Clayton lldb::addr_t addr, 10728de27c761a22187ef63fb60000894be163e7285fGreg Clayton Error &err 10738de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1074f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 1075e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1076f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 107717c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!exe_ctx.frame || !exe_ctx.process) 1078cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan return false; 1079cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 10806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Vital information about the value 10816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const ConstString &name(expr_var->GetName()); 10836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan TypeFromUser type(expr_var->GetTypeFromUser()); 10846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 10853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton Variable *var = FindVariableInScope (*exe_ctx.frame, name, &type); 1086f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1087f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!var) 1088f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 10898de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name.GetCString()); 1090f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1091f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1092f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1093841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 10948de27c761a22187ef63fb60000894be163e7285fGreg Clayton log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name.GetCString(), type.GetOpaqueQualType()); 1095f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1096f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 1097f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan var, 1098aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan NULL)); 1099f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1100f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 1101f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 11028de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get value for %s", name.GetCString()); 1103f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 1104f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 110517c6a05cb96f7110332342326a90692d9505982eSean Callanan 110617c6a05cb96f7110332342326a90692d9505982eSean Callanan // The size of the type contained in addr 1107f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 11086a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 11096a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan size_t value_byte_size = value_bit_size % 8 ? ((value_bit_size + 8) / 8) : (value_bit_size / 8); 111017c6a05cb96f7110332342326a90692d9505982eSean Callanan 111117c6a05cb96f7110332342326a90692d9505982eSean Callanan Value::ValueType value_type = location_value->GetValueType(); 111217c6a05cb96f7110332342326a90692d9505982eSean Callanan 111317c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (value_type) 1114f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 111517c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 1116f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 111717c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 111817c6a05cb96f7110332342326a90692d9505982eSean Callanan 111917c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 112017c6a05cb96f7110332342326a90692d9505982eSean Callanan 11218de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name.GetCString(), ss.GetString().c_str()); 112217c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 1123f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 112417c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 112517c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeLoadAddress: 1126f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 11276a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!dematerialize) 112817c6a05cb96f7110332342326a90692d9505982eSean Callanan { 11296a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 11306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11316a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error error; 11326a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11336a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!WriteAddressInto(exe_ctx, 11346a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan addr, 11356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan value_addr, 11366a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan error)) 11376a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11386a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), error.AsCString()); 11396a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11406a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 114117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1142f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 114317c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 114417c6a05cb96f7110332342326a90692d9505982eSean Callanan case Value::eValueTypeScalar: 1145f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 11466916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (location_value->GetContextType() != Value::eContextTypeRegisterInfo) 114717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 114817c6a05cb96f7110332342326a90692d9505982eSean Callanan StreamString ss; 114917c6a05cb96f7110332342326a90692d9505982eSean Callanan location_value->Dump(&ss); 115017c6a05cb96f7110332342326a90692d9505982eSean Callanan 11518de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is a scalar of unhandled type: %s", name.GetCString(), ss.GetString().c_str()); 115217c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 115317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 115417c6a05cb96f7110332342326a90692d9505982eSean Callanan 11556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::addr_t mem; // The address of a spare memory area aused to hold the variable. 11566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 115717c6a05cb96f7110332342326a90692d9505982eSean Callanan lldb::RegisterInfo *register_info = location_value->GetRegisterInfo(); 115817c6a05cb96f7110332342326a90692d9505982eSean Callanan 115917c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_info) 116017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 11618de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't get the register information for %s", name.GetCString()); 116217c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 116317c6a05cb96f7110332342326a90692d9505982eSean Callanan } 116417c6a05cb96f7110332342326a90692d9505982eSean Callanan 116517c6a05cb96f7110332342326a90692d9505982eSean Callanan RegisterContext *register_context = exe_ctx.GetRegisterContext(); 116617c6a05cb96f7110332342326a90692d9505982eSean Callanan 116717c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_context) 116817c6a05cb96f7110332342326a90692d9505982eSean Callanan { 11698de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't read register context to read %s from %s", name.GetCString(), register_info->name); 117017c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 117117c6a05cb96f7110332342326a90692d9505982eSean Callanan } 117217c6a05cb96f7110332342326a90692d9505982eSean Callanan 117317c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_number = register_info->kinds[lldb::eRegisterKindLLDB]; 117417c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_byte_size = register_info->byte_size; 117517c6a05cb96f7110332342326a90692d9505982eSean Callanan 117617c6a05cb96f7110332342326a90692d9505982eSean Callanan if (dematerialize) 117717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 11786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Get the location of the spare memory area out of the variable's live data. 11796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!expr_var->m_live_sp) 11816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't find the memory area used to store %s", name.GetCString()); 11836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (expr_var->m_live_sp->GetValue().GetValueAddressType() != lldb::eAddressTypeLoad) 11876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 11886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("The address of the memory area for %s is in an incorrect format", name.GetCString()); 11896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 11906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 11916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 11926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = expr_var->m_live_sp->GetValue().GetScalar().ULongLong(); 11936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 119417c6a05cb96f7110332342326a90692d9505982eSean Callanan // Moving from addr into a register 119517c6a05cb96f7110332342326a90692d9505982eSean Callanan // 119617c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 1: addr_byte_size and register_byte_size are the same 119717c6a05cb96f7110332342326a90692d9505982eSean Callanan // 119817c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Address contents 119917c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Register contents 120017c6a05cb96f7110332342326a90692d9505982eSean Callanan // 120117c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 2: addr_byte_size is bigger than register_byte_size 120217c6a05cb96f7110332342326a90692d9505982eSean Callanan // 120317c6a05cb96f7110332342326a90692d9505982eSean Callanan // Error! (The register should always be big enough to hold the data) 120417c6a05cb96f7110332342326a90692d9505982eSean Callanan // 120517c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 3: register_byte_size is bigger than addr_byte_size 120617c6a05cb96f7110332342326a90692d9505982eSean Callanan // 120717c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABB| Address contents 120817c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABB0000| Register contents [on little-endian hardware] 120917c6a05cb96f7110332342326a90692d9505982eSean Callanan // |0000AABB| Register contents [on big-endian hardware] 121017c6a05cb96f7110332342326a90692d9505982eSean Callanan 12116a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 121217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 12138de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name); 121417c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 121517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 121617c6a05cb96f7110332342326a90692d9505982eSean Callanan 121717c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_offset; 121817c6a05cb96f7110332342326a90692d9505982eSean Callanan 121917c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (exe_ctx.process->GetByteOrder()) 122017c6a05cb96f7110332342326a90692d9505982eSean Callanan { 122117c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 12228de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString()); 122317c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 122417c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderLittle: 122517c6a05cb96f7110332342326a90692d9505982eSean Callanan register_offset = 0; 122617c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 122717c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderBig: 12286a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan register_offset = register_byte_size - value_byte_size; 122917c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 123017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 123117c6a05cb96f7110332342326a90692d9505982eSean Callanan 123217c6a05cb96f7110332342326a90692d9505982eSean Callanan DataBufferHeap register_data (register_byte_size, 0); 123317c6a05cb96f7110332342326a90692d9505982eSean Callanan 123417c6a05cb96f7110332342326a90692d9505982eSean Callanan Error error; 12356a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->ReadMemory (mem, register_data.GetBytes() + register_offset, value_byte_size, error) != value_byte_size) 123617c6a05cb96f7110332342326a90692d9505982eSean Callanan { 12378de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", name.GetCString(), error.AsCString()); 123817c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 123917c6a05cb96f7110332342326a90692d9505982eSean Callanan } 124017c6a05cb96f7110332342326a90692d9505982eSean Callanan 124117c6a05cb96f7110332342326a90692d9505982eSean Callanan DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize()); 124217c6a05cb96f7110332342326a90692d9505982eSean Callanan 124317c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_context->WriteRegisterBytes(register_number, register_extractor, 0)) 124417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 12458de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name); 124617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 124717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 12486a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12496a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Deallocate the spare area and clear the variable's live data. 12506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12516a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error deallocate_error = exe_ctx.process->DeallocateMemory(mem); 12526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12536a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!deallocate_error.Success()) 12546a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 12556a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't deallocate spare memory area for %s: %s", name.GetCString(), deallocate_error.AsCString()); 12566a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 12576a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 12586a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12596a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(); 126017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 126117c6a05cb96f7110332342326a90692d9505982eSean Callanan else 126217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 12636a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean 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 12646a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // struct. 12656a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error allocate_error; 12676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem = exe_ctx.process->AllocateMemory(value_byte_size, 12696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 12706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan allocate_error); 12716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (mem == LLDB_INVALID_ADDRESS) 12736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 12746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat("Couldn't allocate a memory area to store %s: %s", name.GetCString(), allocate_error.AsCString()); 12756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 12766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 12776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Put the location of the spare memory into the live data of the ValueObject. 12796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan expr_var->m_live_sp.reset(new lldb_private::ValueObjectConstResult(type.GetASTContext(), 12816a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan type.GetOpaqueQualType(), 12826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan name, 12836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan mem, 12846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan lldb::eAddressTypeLoad, 12856a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan value_byte_size)); 12866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan // Now write the location of the area into the struct. 12886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 12896a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan Error write_error; 12906a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (!WriteAddressInto(exe_ctx, addr, mem, write_error)) 12916a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan { 12926a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", name.GetCString(), write_error.AsCString()); 12936a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan return false; 12946a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan } 12956a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan 129617c6a05cb96f7110332342326a90692d9505982eSean Callanan // Moving from a register into addr 129717c6a05cb96f7110332342326a90692d9505982eSean Callanan // 129817c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 1: addr_byte_size and register_byte_size are the same 129917c6a05cb96f7110332342326a90692d9505982eSean Callanan // 130017c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Register contents 130117c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Address contents 130217c6a05cb96f7110332342326a90692d9505982eSean Callanan // 130317c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 2: addr_byte_size is bigger than register_byte_size 130417c6a05cb96f7110332342326a90692d9505982eSean Callanan // 130517c6a05cb96f7110332342326a90692d9505982eSean Callanan // Error! (The register should always be big enough to hold the data) 130617c6a05cb96f7110332342326a90692d9505982eSean Callanan // 130717c6a05cb96f7110332342326a90692d9505982eSean Callanan // Case 3: register_byte_size is bigger than addr_byte_size 130817c6a05cb96f7110332342326a90692d9505982eSean Callanan // 130917c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABBCCDD| Register contents 131017c6a05cb96f7110332342326a90692d9505982eSean Callanan // |AABB| Address contents on little-endian hardware 131117c6a05cb96f7110332342326a90692d9505982eSean Callanan // |CCDD| Address contents on big-endian hardware 131217c6a05cb96f7110332342326a90692d9505982eSean Callanan 13136a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (value_byte_size > register_byte_size) 131417c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13158de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is too big to store in %s", name.GetCString(), register_info->name); 131617c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 131717c6a05cb96f7110332342326a90692d9505982eSean Callanan } 131817c6a05cb96f7110332342326a90692d9505982eSean Callanan 131917c6a05cb96f7110332342326a90692d9505982eSean Callanan uint32_t register_offset; 132017c6a05cb96f7110332342326a90692d9505982eSean Callanan 132117c6a05cb96f7110332342326a90692d9505982eSean Callanan switch (exe_ctx.process->GetByteOrder()) 132217c6a05cb96f7110332342326a90692d9505982eSean Callanan { 132317c6a05cb96f7110332342326a90692d9505982eSean Callanan default: 13248de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("%s is stored with an unhandled byte order", name.GetCString()); 132517c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 132617c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderLittle: 132717c6a05cb96f7110332342326a90692d9505982eSean Callanan register_offset = 0; 132817c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 132917c6a05cb96f7110332342326a90692d9505982eSean Callanan case lldb::eByteOrderBig: 13306a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan register_offset = register_byte_size - value_byte_size; 133117c6a05cb96f7110332342326a90692d9505982eSean Callanan break; 133217c6a05cb96f7110332342326a90692d9505982eSean Callanan } 133317c6a05cb96f7110332342326a90692d9505982eSean Callanan 133417c6a05cb96f7110332342326a90692d9505982eSean Callanan DataExtractor register_extractor; 133517c6a05cb96f7110332342326a90692d9505982eSean Callanan 133617c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_context->ReadRegisterBytes(register_number, register_extractor)) 133717c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13388de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Couldn't read %s from %s", name.GetCString(), register_info->name); 133917c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 134017c6a05cb96f7110332342326a90692d9505982eSean Callanan } 134117c6a05cb96f7110332342326a90692d9505982eSean Callanan 13426a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan const void *register_data = register_extractor.GetData(®ister_offset, value_byte_size); 134317c6a05cb96f7110332342326a90692d9505982eSean Callanan 134417c6a05cb96f7110332342326a90692d9505982eSean Callanan if (!register_data) 134517c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13468de27c761a22187ef63fb60000894be163e7285fGreg Clayton err.SetErrorStringWithFormat("Read but couldn't extract data for %s from %s", name.GetCString(), register_info->name); 134717c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 134817c6a05cb96f7110332342326a90692d9505982eSean Callanan } 134917c6a05cb96f7110332342326a90692d9505982eSean Callanan 13506a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan if (exe_ctx.process->WriteMemory (mem, register_data, value_byte_size, write_error) != value_byte_size) 135117c6a05cb96f7110332342326a90692d9505982eSean Callanan { 13526a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", write_error.AsCString()); 135317c6a05cb96f7110332342326a90692d9505982eSean Callanan return false; 135417c6a05cb96f7110332342326a90692d9505982eSean Callanan } 135517c6a05cb96f7110332342326a90692d9505982eSean Callanan } 1356f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1358f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 1359f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 1360810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 1361810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 13621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananbool 13631ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean CallananClangExpressionDeclMap::DoMaterializeOneRegister 13641ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan( 13651ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan bool dematerialize, 13661ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan ExecutionContext &exe_ctx, 13671ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan RegisterContext ®_ctx, 13681ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const lldb::RegisterInfo ®_info, 13691ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::addr_t addr, 13701ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error &err 13711ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan) 13721ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 13731ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_number = reg_info.kinds[lldb::eRegisterKindLLDB]; 13741ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_byte_size = reg_info.byte_size; 13751ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13761ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error error; 13771ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13781ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (dematerialize) 13791ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 13801ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan DataBufferHeap register_data (register_byte_size, 0); 13811ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13821ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error error; 13831ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (exe_ctx.process->ReadMemory (addr, register_data.GetBytes(), register_byte_size, error) != register_byte_size) 13841ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 13851ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat ("Couldn't read %s from the target: %s", reg_info.name, error.AsCString()); 13861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13871ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan DataExtractor register_extractor (register_data.GetBytes(), register_byte_size, exe_ctx.process->GetByteOrder(), exe_ctx.process->GetAddressByteSize()); 13901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 13911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx.WriteRegisterBytes(register_number, register_extractor, 0)) 13921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 13931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name); 13941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 13951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 13971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan else 13981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 13991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan DataExtractor register_extractor; 14001ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 14011ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!reg_ctx.ReadRegisterBytes(register_number, register_extractor)) 14021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 14031ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat("Couldn't read %s", reg_info.name); 14041ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14051ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 14061ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 14071ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan uint32_t register_offset = 0; 14081ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 14091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const void *register_data = register_extractor.GetData(®ister_offset, register_byte_size); 14101ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 14111ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!register_data) 14121ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 14131ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat("Read but couldn't extract data for %s", reg_info.name); 14141ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 14161ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 14171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan Error error; 14181ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (exe_ctx.process->WriteMemory (addr, register_data, register_byte_size, error) != register_byte_size) 14191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 14201ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan err.SetErrorStringWithFormat ("Couldn't write %s to the target: %s", error.AsCString()); 14211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return false; 14221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 14231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 14241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 14251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return true; 14261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 14271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1428cc0746247880e9c87711031ce8a535544f4499d7Sean CallananVariable * 14298de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::FindVariableInScope 14308de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 14318de27c761a22187ef63fb60000894be163e7285fGreg Clayton StackFrame &frame, 14328de27c761a22187ef63fb60000894be163e7285fGreg Clayton const ConstString &name, 14338de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *type 14348de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 1435aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{ 1436e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1437cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1438cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan VariableList *var_list = frame.GetVariableList(true); 1439cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan 1440bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton if (!var_list) 1441bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton return NULL; 1442bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton 14433bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton lldb::VariableSP var_sp (var_list->FindVariable(name)); 14443bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 14453bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const bool append = true; 14463bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const uint32_t max_matches = 1; 14473bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!var_sp) 1448cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan { 14493bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Look for globals elsewhere in the module for the frame 1450aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ModuleSP module_sp (frame.GetSymbolContext(eSymbolContextModule).module_sp); 14513bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (module_sp) 14523bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 14533bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableList module_globals; 14543bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (module_sp->FindGlobalVariables (name, append, max_matches, module_globals)) 14553bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton var_sp = module_globals.GetVariableAtIndex (0); 14563bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 1457cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan } 14583bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 14593bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!var_sp) 1460cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan { 14613bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton // Look for globals elsewhere in the program (all images) 1462aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan TargetSP target_sp (frame.GetSymbolContext(eSymbolContextTarget).target_sp); 14633bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (target_sp) 14643bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 14653bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton VariableList program_globals; 14663bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (target_sp->GetImages().FindGlobalVariables (name, append, max_matches, program_globals)) 14673bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton var_sp = program_globals.GetVariableAtIndex (0); 14683bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 1469cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan } 14703bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 14713bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (var_sp && type) 14723bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 14733bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (type->GetASTContext() == var_sp->GetType()->GetClangAST()) 14743bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 14753bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var_sp->GetType()->GetClangType())) 14763bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return NULL; 14773bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 14783bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton else 14793bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton { 14803bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (log) 14813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton log->PutCString("Skipping a candidate variable because of different AST contexts"); 14823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return NULL; 14833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 14843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton } 14853bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 14863bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return var_sp.get(); 1487cc0746247880e9c87711031ce8a535544f4499d7Sean Callanan} 1488336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1491e5748d889fb7fb97b3ff07444894d7714776b609Greg ClaytonClangExpressionDeclMap::GetDecls (NameSearchContext &context, const ConstString &name) 149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1493aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_struct_vars.get()); 1494aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1495aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1496e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 14973c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1498810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 14998de27c761a22187ef63fb60000894be163e7285fGreg Clayton log->Printf("Hunting for a definition for '%s'", name.GetCString()); 150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Back out in all cases where we're not fully initialized 1502aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->frame == NULL) 150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 1504ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 1505aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_ignore_lookups) 1506ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 1507ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 1508ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf("Ignoring a query during an import"); 1509ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return; 1510ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 15113c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1512e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton SymbolContextList sc_list; 151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15143bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton const char *name_unique_cstr = name.GetCString(); 15153bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 15163bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr == NULL) 15173bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton return; 15183bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton 15198de27c761a22187ef63fb60000894be163e7285fGreg Clayton // Only look for functions by name out in our symbols if the function 15208de27c761a22187ef63fb60000894be163e7285fGreg Clayton // doesn't start with our phony prefix of '$' 15213bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton if (name_unique_cstr[0] != '$') 15220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 1523aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Variable *var = FindVariableInScope(*m_parser_vars->m_exe_ctx->frame, name); 15248de27c761a22187ef63fb60000894be163e7285fGreg Clayton 15258de27c761a22187ef63fb60000894be163e7285fGreg Clayton // If we found a variable in scope, no need to pull up function names 15268de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (var != NULL) 152792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan { 15288de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneVariable(context, var); 152992aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan } 15308de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 153192aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan { 1532aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_sym_ctx.FindFunctionsByName (name, false, sc_list); 15338de27c761a22187ef63fb60000894be163e7285fGreg Clayton 15348de27c761a22187ef63fb60000894be163e7285fGreg Clayton bool found_specific = false; 15358de27c761a22187ef63fb60000894be163e7285fGreg Clayton Symbol *generic_symbol = NULL; 15368de27c761a22187ef63fb60000894be163e7285fGreg Clayton Symbol *non_extern_symbol = NULL; 15378de27c761a22187ef63fb60000894be163e7285fGreg Clayton 1538e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton for (uint32_t index = 0, num_indices = sc_list.GetSize(); 15398de27c761a22187ef63fb60000894be163e7285fGreg Clayton index < num_indices; 15408de27c761a22187ef63fb60000894be163e7285fGreg Clayton ++index) 15418de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 15428de27c761a22187ef63fb60000894be163e7285fGreg Clayton SymbolContext sym_ctx; 1543e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton sc_list.GetContextAtIndex(index, sym_ctx); 15448de27c761a22187ef63fb60000894be163e7285fGreg Clayton 15458de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (sym_ctx.function) 15468de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 15478de27c761a22187ef63fb60000894be163e7285fGreg Clayton // TODO only do this if it's a C function; C++ functions may be 15488de27c761a22187ef63fb60000894be163e7285fGreg Clayton // overloaded 15498de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (!found_specific) 15508de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneFunction(context, sym_ctx.function, NULL); 15518de27c761a22187ef63fb60000894be163e7285fGreg Clayton found_specific = true; 15528de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 15538de27c761a22187ef63fb60000894be163e7285fGreg Clayton else if (sym_ctx.symbol) 15548de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 15558de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (sym_ctx.symbol->IsExternal()) 15568de27c761a22187ef63fb60000894be163e7285fGreg Clayton generic_symbol = sym_ctx.symbol; 15578de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 15588de27c761a22187ef63fb60000894be163e7285fGreg Clayton non_extern_symbol = sym_ctx.symbol; 15598de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 15608de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 15618de27c761a22187ef63fb60000894be163e7285fGreg Clayton 15628de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (!found_specific) 15638de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 15648de27c761a22187ef63fb60000894be163e7285fGreg Clayton if (generic_symbol) 15658de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneFunction(context, NULL, generic_symbol); 15668de27c761a22187ef63fb60000894be163e7285fGreg Clayton else if (non_extern_symbol) 15678de27c761a22187ef63fb60000894be163e7285fGreg Clayton AddOneFunction(context, NULL, non_extern_symbol); 15688de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 15696916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 1570aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan ClangNamespaceDecl namespace_decl (m_parser_vars->m_sym_ctx.FindNamespace(name)); 15716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton if (namespace_decl) 15726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton { 15739ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton clang::NamespaceDecl *clang_namespace_decl = AddNamespace(context, namespace_decl); 15749ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton if (clang_namespace_decl) 15759ceed1e2b872d12a1c01ba148855db07b193649eGreg Clayton clang_namespace_decl->setHasExternalLexicalStorage(); 15766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton } 157792aa666e66798e8d72d873d48da2b3f92e94c450Sean Callanan } 15780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 15798de27c761a22187ef63fb60000894be163e7285fGreg Clayton else 15803cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan { 158157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton static ConstString g_lldb_class_name ("$__lldb_class"); 158257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (name == g_lldb_class_name) 158357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton { 158457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton // Clang is looking for the type of "this" 158557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 1586aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false); 158757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 158857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!vars) 158957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 159057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 159157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton lldb::VariableSP this_var = vars->FindVariable(ConstString("this")); 159257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 159357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_var) 159457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 159557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 159657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton Type *this_type = this_var->GetType(); 159757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 159857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!this_type) 159957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 160057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 16012403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton if (log) 16022403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton { 16032403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString ("Type for \"this\" is: "); 16042403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton StreamString strm; 16052403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton this_type->Dump(&strm, true); 16062403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton log->PutCString (strm.GetData()); 16072403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton } 16082403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 160957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton TypeFromUser this_user_type(this_type->GetClangType(), 161057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 161157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 1612aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_struct_vars->m_object_pointer_type = this_user_type; 161357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 161457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton void *pointer_target_type; 161557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 161657452832fdce249dd673710c5603a9b44c672d1bGreg Clayton if (!ClangASTContext::IsPointerType(this_user_type.GetOpaqueQualType(), 161757452832fdce249dd673710c5603a9b44c672d1bGreg Clayton &pointer_target_type)) 161857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 161957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 162057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton TypeFromUser class_user_type(pointer_target_type, 162157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton this_type->GetClangAST()); 162257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 16233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 16243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 16253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 16263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 16273aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 16283aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_class: %s", type_stream.GetString().c_str()); 16293aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 16303aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 163157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton AddOneType(context, class_user_type, true); 163257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 163357452832fdce249dd673710c5603a9b44c672d1bGreg Clayton return; 163457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton } 163557452832fdce249dd673710c5603a9b44c672d1bGreg Clayton 16363aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan static ConstString g_lldb_objc_class_name ("$__lldb_objc_class"); 16373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (name == g_lldb_objc_class_name) 16383aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 16393aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan // Clang is looking for the type of "*self" 16403aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16413aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan VariableList *vars = m_parser_vars->m_exe_ctx->frame->GetVariableList(false); 16423aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!vars) 16443aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 16453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16463aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::VariableSP self_var = vars->FindVariable(ConstString("self")); 16473aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16483aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_var) 16493aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 16503aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16513aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan Type *self_type = self_var->GetType(); 16523aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16533aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!self_type) 16543aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 16553aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16563aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser self_user_type(self_type->GetClangType(), 16573aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 16583aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16593aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan m_struct_vars->m_object_pointer_type = self_user_type; 16603aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16613aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan void *pointer_target_type; 16623aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16633aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (!ClangASTContext::IsPointerType(self_user_type.GetOpaqueQualType(), 16643aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan &pointer_target_type)) 16653aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 16663aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16673aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan TypeFromUser class_user_type(pointer_target_type, 16683aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan self_type->GetClangAST()); 16693aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16703aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan if (log) 16713aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan { 16723aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan StreamString type_stream; 16733aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan class_user_type.DumpTypeCode(&type_stream); 16743aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan type_stream.Flush(); 16753aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan log->Printf("Adding type for $__lldb_objc_class: %s", type_stream.GetString().c_str()); 16763aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 16773aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16783aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan AddOneType(context, class_user_type, false); 16793aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan 16803aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan return; 16813aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan } 1682427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 1683427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name)); 16843cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan 1685427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton if (pvar_sp) 16861ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1687427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton AddOneVariable(context, pvar_sp); 16881ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 16891ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 16901ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 16911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan const char *reg_name(&name.GetCString()[1]); 16921ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1693aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan if (m_parser_vars->m_exe_ctx->GetRegisterContext()) 16941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 1695aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan const lldb::RegisterInfo *reg_info(m_parser_vars->m_exe_ctx->GetRegisterContext()->GetRegisterInfoByName(reg_name)); 16961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 16971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (reg_info) 16981ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan AddOneRegister(context, reg_info); 16991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 17008de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 1701a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1702aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::TypeSP type_sp (m_parser_vars->m_sym_ctx.FindTypeByName (name)); 17036df0840c87be29724055716db951aa6d494ddabcSean Callanan 1704ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (type_sp) 1705ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan { 1706ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan if (log) 17076df0840c87be29724055716db951aa6d494ddabcSean Callanan { 1708ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->Printf ("Matching type found for \"%s\": ", name.GetCString()); 1709ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan StreamString strm; 1710ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan type_sp->Dump(&strm, true); 1711ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan log->PutCString (strm.GetData()); 1712ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan } 17132403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton 1714ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan TypeFromUser user_type(type_sp->GetClangType(), 17152403b5e89760c1c970c3fe6936cb620d45dcf6c8Greg Clayton type_sp->GetClangAST()); 17166df0840c87be29724055716db951aa6d494ddabcSean Callanan 1717ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan AddOneType(context, user_type, false); 17186df0840c87be29724055716db951aa6d494ddabcSean Callanan } 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1720336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1721336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 17228de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetVariableValue 17238de27c761a22187ef63fb60000894be163e7285fGreg Clayton( 17248de27c761a22187ef63fb60000894be163e7285fGreg Clayton ExecutionContext &exe_ctx, 17258de27c761a22187ef63fb60000894be163e7285fGreg Clayton Variable *var, 17268de27c761a22187ef63fb60000894be163e7285fGreg Clayton clang::ASTContext *parser_ast_context, 17278de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromUser *user_type, 17288de27c761a22187ef63fb60000894be163e7285fGreg Clayton TypeFromParser *parser_type 17298de27c761a22187ef63fb60000894be163e7285fGreg Clayton) 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1731e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 17326184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1737810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1738810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 1739336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1742462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton void *var_opaque_type = var_type->GetClangType(); 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1746810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1747810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 1748336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeList *type_list = var_type->GetTypeList(); 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!type_list) 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1755810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1756810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because the type has no associated type list"); 1757336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext(); 176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!exe_ast_ctx) 176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1764810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1765810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 1766336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1769336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 1770336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1773178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS; 1774178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton 1775178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (var_location_expr.IsLocationList()) 1776178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton { 1777178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SymbolContext var_sc; 1778178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton var->CalculateSymbolContext (&var_sc); 1779eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (exe_ctx.target); 1780178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton } 178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17838e69de4b9c55ec2eaebc62e4d987c2f0618ac431Jason Molenda if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, loclist_base_load_addr, NULL, *var_location.get(), &err)) 178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1785810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 1786810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 1787336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1790810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext(); 1791810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 1792336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type_to_use; 1793336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1794f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 1795f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 1796ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan type_to_use = GuardedCopyType(parser_ast_context, var_ast_context, var_opaque_type); 1797f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 17984b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!type_to_use) 17994b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan { 18004b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (log) 18014b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan log->Printf("Couldn't copy a variable's type into the parser's AST context"); 18024b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 18034b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return NULL; 18044b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan } 18054b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 1806f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 1807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 1808f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 1809336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 1810336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 18136916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton var_location.get()->SetContext(Value::eContextTypeClangType, type_to_use); 181424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 181624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 181724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 1819336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 182024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 1821336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 182424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 182524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 1826336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 1827336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 182824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 182924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1830aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t load_addr = so_addr.GetLoadAddress(exe_ctx.target); 183124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->GetScalar() = load_addr; 183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->SetValueType(Value::eValueTypeLoadAddress); 183424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 183524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1836f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 1837f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *user_type = TypeFromUser(var_opaque_type, var_ast_context); 1838336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1839336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 1840336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 1841336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1842336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 1843336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 18443c9c5eb466869ede185e879d14a47335fb43194dSean Callanan Variable* var) 1845336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 1846aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1847aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1848e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1849336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1850f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 1851f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 1852336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 1853aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan Value *var_location = GetVariableValue (*m_parser_vars->m_exe_ctx, 18548de27c761a22187ef63fb60000894be163e7285fGreg Clayton var, 18558de27c761a22187ef63fb60000894be163e7285fGreg Clayton context.GetASTContext(), 18568de27c761a22187ef63fb60000894be163e7285fGreg Clayton &ut, 18578de27c761a22187ef63fb60000894be163e7285fGreg Clayton &pt); 1858336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 18594b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan if (!var_location) 18604b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan return; 18614b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan 18626a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(pt.GetASTContext(), pt.GetOpaqueQualType())); 18638de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 1864427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ConstString entity_name(decl_name.c_str()); 1865427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity(m_found_entities.CreateVariable (entity_name, 1866427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ut, 1867427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetByteOrder(), 1868427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 1869427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 1870427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 1871427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = pt; 1872427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 1873427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 1874427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = var_location; 187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1876810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 18778de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 1878a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 1879a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 1880a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 1881a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 1882a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 1883a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found variable %s, returned %s", decl_name.c_str(), var_decl_print_string.c_str()); 18848de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 18858f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 18868f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 18878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 1888a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 1889427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP &pvar_sp) 1890a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{ 1891e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 189245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 1893427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromUser user_type (pvar_sp->GetTypeFromUser()); 1894a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 1895427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (GuardedCopyType(context.GetASTContext(), 1896427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetASTContext(), 1897427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton user_type.GetOpaqueQualType()), 1898427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 1899a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 19006a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan NamedDecl *var_decl = context.AddVarDecl(ClangASTContext::CreateLValueReferenceType(parser_type.GetASTContext(), parser_type.GetOpaqueQualType())); 19018c12720c108cd5e7ed792596749218d8400f647eSean Callanan 1902427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->EnableParserVars(); 1903427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_parser_type = parser_type; 1904427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_named_decl = var_decl; 1905427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_llvm_value = NULL; 1906427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton pvar_sp->m_parser_vars->m_lldb_value = NULL; 190745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan 190845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan if (log) 1909a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan { 1910a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string var_decl_print_string; 1911a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 1912a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl->print(var_decl_print_stream); 1913a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan var_decl_print_stream.flush(); 1914a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 1915427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton log->Printf("Added pvar %s, returned %s", pvar_sp->GetName().GetCString(), var_decl_print_string.c_str()); 1916a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan } 1917a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan} 1918a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan 19191ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid 1920427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context, 1921427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton const RegisterInfo *reg_info) 19221ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{ 19231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 19241ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19251ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan void *ast_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize(context.GetASTContext(), 19261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->encoding, 19271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan reg_info->byte_size * 8); 19281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19291ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (!ast_type) 19301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 19311ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str()); 19321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan return; 19331ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19341ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1935427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton TypeFromParser parser_type (ast_type, 1936427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton context.GetASTContext()); 19371ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan NamedDecl *var_decl = context.AddVarDecl(parser_type.GetOpaqueQualType()); 19391ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 1940427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->process->GetByteOrder(), 1941427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 1942427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 19431ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string decl_name(context.m_decl_name.getAsString()); 1944427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName (ConstString (decl_name.c_str())); 1945427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetRegisterInfo (reg_info); 1946427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 1947427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_parser_type = parser_type; 1948427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = var_decl; 1949427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 1950427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = NULL; 19511ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19521ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan if (log) 19531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan { 19541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan std::string var_decl_print_string; 19551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan llvm::raw_string_ostream var_decl_print_stream(var_decl_print_string); 19561ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl->print(var_decl_print_stream); 19571ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan var_decl_print_stream.flush(); 19581ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19591ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan log->Printf("Added register %s, returned %s", context.m_decl_name.getAsString().c_str(), var_decl_print_string.c_str()); 19601ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan } 19611ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan} 19621ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan 19636916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::NamespaceDecl * 19646916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangExpressionDeclMap::AddNamespace (NameSearchContext &context, const ClangNamespaceDecl &namespace_decl) 19656916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton{ 19666916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 19676916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 19686916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 19696916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton clang::Decl *copied_decl = ClangASTContext::CopyDecl (context.GetASTContext(), 19706916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton namespace_decl.GetASTContext(), 19716916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton namespace_decl.GetNamespaceDecl()); 19726916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 19736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton return dyn_cast<clang::NamespaceDecl>(copied_decl); 19746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton} 19756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton 1976a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid 19778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 19780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Function* fun, 19790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Symbol* symbol) 19808f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 1981aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 1982aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 1983e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton lldb::LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 19848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 19850fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan NamedDecl *fun_decl; 19860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 19870fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan const Address *fun_address; 19888f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 19890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 19900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 19910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan clang::ASTContext *fun_ast_context = NULL; 19928f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 19930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 19940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 19950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 19960fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 19970fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 19980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 19990fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 20000fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no type"); 20010fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 20020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 20030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 2004462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton fun_opaque_type = fun_type->GetClangType(); 20050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 20060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 20070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 20080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 20090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no Clang type"); 20100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 20110fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 20120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 20130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 20140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 20150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan TypeList *type_list = fun_type->GetTypeList(); 20160fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_ast_context = type_list->GetClangASTContext().getASTContext(); 2017ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 20180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 20190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddFunDecl(copied_type); 20200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 20210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 20220fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 20230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 20240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 20250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 20260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 20270fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 20288f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 2029810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 20300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("AddOneFunction called with no function and no symbol"); 20318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 20328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 20338f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 2034aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan lldb::addr_t load_addr = fun_address->GetLoadAddress(m_parser_vars->m_exe_ctx->target); 20358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 20368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 20378f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 2038427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx->process->GetByteOrder(), 2039427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton m_parser_vars->m_exe_ctx->process->GetAddressByteSize())); 2040427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton assert (entity.get()); 20418de27c761a22187ef63fb60000894be163e7285fGreg Clayton std::string decl_name(context.m_decl_name.getAsString()); 2042427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetName(ConstString(decl_name.c_str())); 2043427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangType (fun_opaque_type); 2044427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->SetClangAST (fun_ast_context); 2045427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton 2046427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->EnableParserVars(); 2047427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_named_decl = fun_decl; 2048427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_llvm_value = NULL; 2049427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton entity->m_parser_vars->m_lldb_value = fun_location.release(); 20508c12720c108cd5e7ed792596749218d8400f647eSean Callanan 2051810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 20528de27c761a22187ef63fb60000894be163e7285fGreg Clayton { 2053a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan std::string fun_decl_print_string; 2054a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan llvm::raw_string_ostream fun_decl_print_stream(fun_decl_print_string); 2055a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl->print(fun_decl_print_stream); 2056a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan fun_decl_print_stream.flush(); 2057a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan 2058a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan log->Printf("Found %s function %s, returned %s", (fun ? "specific" : "generic"), decl_name.c_str(), fun_decl_print_string.c_str()); 20598de27c761a22187ef63fb60000894be163e7285fGreg Clayton } 206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 206193a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 206293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callananvoid 206393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context, 20643c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromUser &ut, 20653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool add_method) 206693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{ 20673c9c5eb466869ede185e879d14a47335fb43194dSean Callanan clang::ASTContext *parser_ast_context = context.GetASTContext(); 20683c9c5eb466869ede185e879d14a47335fb43194dSean Callanan clang::ASTContext *user_ast_context = ut.GetASTContext(); 20693c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 2070ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *copied_type = GuardedCopyType(parser_ast_context, user_ast_context, ut.GetOpaqueQualType()); 20713c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 20723c9c5eb466869ede185e879d14a47335fb43194dSean Callanan TypeFromParser parser_type(copied_type, parser_ast_context); 207393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 20743c9c5eb466869ede185e879d14a47335fb43194dSean Callanan if (add_method && ClangASTContext::IsAggregateType(copied_type)) 20753c9c5eb466869ede185e879d14a47335fb43194dSean Callanan { 20763c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *args[1]; 20773c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 20783c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args[0] = ClangASTContext::GetVoidPtrType(parser_ast_context, false); 20793c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 20803c9c5eb466869ede185e879d14a47335fb43194dSean Callanan void *method_type = ClangASTContext::CreateFunctionType (parser_ast_context, 20813c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetBuiltInType_void(parser_ast_context), 20823c9c5eb466869ede185e879d14a47335fb43194dSean Callanan args, 20833c9c5eb466869ede185e879d14a47335fb43194dSean Callanan 1, 20843c9c5eb466869ede185e879d14a47335fb43194dSean Callanan false, 20853c9c5eb466869ede185e879d14a47335fb43194dSean Callanan ClangASTContext::GetTypeQualifiers(copied_type)); 208630449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 20871d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_virtual = false; 20881d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_static = false; 20891d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton const bool is_inline = false; 209030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton const bool is_explicit = false; 209130449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton 20921d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton ClangASTContext::AddMethodToCXXRecordType (parser_ast_context, 20931d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton copied_type, 20948de27c761a22187ef63fb60000894be163e7285fGreg Clayton "$__lldb_expr", 20951d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton method_type, 20961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton lldb::eAccessPublic, 20971d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_virtual, 20981d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton is_static, 209930449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_inline, 210030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton is_explicit); 21013c9c5eb466869ede185e879d14a47335fb43194dSean Callanan } 210293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan 210393a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan context.AddTypeDecl(copied_type); 210493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan} 2105ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2106ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callananvoid * 2107ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean CallananClangExpressionDeclMap::GuardedCopyType (ASTContext *dest_context, 2108ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan ASTContext *source_context, 2109ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *clang_type) 2110ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan{ 2111aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan assert (m_parser_vars.get()); 2112aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan 2113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = true; 2114ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2115ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan void *ret = ClangASTContext::CopyType (dest_context, 2116ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan source_context, 2117ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan clang_type); 2118ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2119aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan m_parser_vars->m_ignore_lookups = false; 2120ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan 2121ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan return ret; 2122ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan} 2123