ClangExpressionDeclMap.cpp revision 336a0002b94c7f23573ec613c4d4ac89a67fd299
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 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 18810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h" 196184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 31810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContext.h" 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::ClangExpressionDeclMap(ExecutionContext *exe_ctx) : 398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_exe_ctx(exe_ctx), 40810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan m_struct_laid_out(false), 41810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan m_materialized_location(0) 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_ctx && exe_ctx->frame) 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sym_ctx = new SymbolContext(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything)); 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sym_ctx = NULL; 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_tuples = m_tuples.size (); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t tuple_index; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (tuple_index = 0; tuple_index < num_tuples; ++tuple_index) 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner delete m_tuples[tuple_index].m_value; 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_sym_ctx) 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner delete m_sym_ctx; 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetIndexForDecl (uint32_t &index, 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::Decl *decl) 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_tuples = m_tuples.size (); 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t tuple_index; 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (tuple_index = 0; tuple_index < num_tuples; ++tuple_index) 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_tuples[tuple_index].m_decl == decl) 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner index = tuple_index; 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::AddValueToStruct (llvm::Value *value, 848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan const clang::NamedDecl *decl, 85810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan std::string &name, 86810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan void *type, 878bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t size, 888bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t alignment) 898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 908bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_laid_out = false; 918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan StructMemberIterator iter; 938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan for (iter = m_members.begin(); 958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan iter != m_members.end(); 968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan ++iter) 978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (iter->m_decl == decl) 998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 1018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan StructMember member; 1038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan member.m_value = value; 1058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan member.m_decl = decl; 106810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan member.m_name = name; 107810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan member.m_type = type; 1088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan member.m_offset = 0; 1098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan member.m_size = size; 1108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan member.m_alignment = alignment; 1118bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1128bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_members.push_back(member); 1138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 1188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 1198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 1208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (m_struct_laid_out) 1218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan StructMemberIterator iter; 1248bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 1268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_alignment = 0; 1288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_size = 0; 1298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan for (iter = m_members.begin(); 1318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan iter != m_members.end(); 1328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan ++iter) 1338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 1348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (iter == m_members.begin()) 1358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_alignment = iter->m_alignment; 1368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (cursor % iter->m_alignment) 1388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan cursor += (iter->m_alignment - (cursor % iter->m_alignment)); 1398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan iter->m_offset = cursor; 1418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan cursor += iter->m_size; 1428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 1438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_size = cursor; 1458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_laid_out = true; 1478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool ClangExpressionDeclMap::GetStructInfo (uint32_t &num_elements, 1518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t &size, 1528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t &alignment) 1538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 1548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (!m_struct_laid_out) 1558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 1568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan num_elements = m_members.size(); 1588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size = m_struct_size; 1598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan alignment = m_struct_alignment; 1608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 1658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::GetStructElement (const clang::NamedDecl *&decl, 1668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan llvm::Value *&value, 1678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t &offset, 1688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan uint32_t index) 1698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 1708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (!m_struct_laid_out) 1718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 1728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (index >= m_members.size()) 1748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 1758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan decl = m_members[index].m_decl; 1778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan value = m_members[index].m_value; 1788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan offset = m_members[index].m_offset; 1798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for DwarfExpression 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerValue 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner*ClangExpressionDeclMap::GetValueForIndex (uint32_t index) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index >= m_tuples.size ()) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_tuples[index].m_value; 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 193810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 194810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callananlldb::addr_t 195810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean CallananClangExpressionDeclMap::Materialize (ExecutionContext *exe_ctx, Error &err) 196810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 197336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 198336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 199810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!m_struct_laid_out) 200810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 201810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 202810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 203810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 204810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 205810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (m_materialized_location) 206810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 207810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan exe_ctx->process->DeallocateMemory(m_materialized_location); 208810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan m_materialized_location = 0; 209810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 210810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 211810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!exe_ctx) 212810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 213810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Received null execution context"); 214810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 215810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 216810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 217810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan const SymbolContext &sym_ctx(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything)); 218810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 219810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan StructMemberIterator iter; 220810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 221810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::addr_t mem = exe_ctx->process->AllocateMemory(m_struct_alignment + m_struct_size, 222810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 223810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err); 224810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 225810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (mem == LLDB_INVALID_ADDRESS) 226810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 227810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 228810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan m_materialized_location = mem; 229810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 230810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::addr_t aligned_mem = mem; 231810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 232810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (aligned_mem % m_struct_alignment) 233810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 234810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan aligned_mem += (m_struct_alignment - (aligned_mem % m_struct_alignment)); 235810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 236810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 237810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan for (iter = m_members.begin(); 238810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan iter != m_members.end(); 239810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan ++iter) 240810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 241810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan uint32_t tuple_index; 242810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 243336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!GetIndexForDecl(tuple_index, iter->m_decl)) 244336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 245336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (iter->m_name.find("___clang_expr_result") == std::string::npos) 246336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 247336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat("Unexpected variable %s", iter->m_name.c_str()); 248336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 249336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 250336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 251336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 252336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Found special result variable %s", iter->m_name.c_str()); 253336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 254810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 255336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 256810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 257810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Tuple &tuple(m_tuples[tuple_index]); 258810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 259336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!MaterializeOneVariable(*exe_ctx, sym_ctx, iter->m_name.c_str(), tuple.m_orig_type, tuple.m_ast_context, aligned_mem + iter->m_offset, err)) 260336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 261810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 262810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 263810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return aligned_mem; 264810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 265810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 266336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananVariable* 267336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::FindVariableInScope(const SymbolContext &sym_ctx, 268336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan const char *name, 269336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type, 270336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan clang::ASTContext *ast_context) 271810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 272810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 273810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 274810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Function *function(m_sym_ctx->function); 275810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Block *block(m_sym_ctx->block); 276810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 277810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!function || !block) 278810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 279810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 280810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("function = %p, block = %p", function, block); 281336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 282810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 283810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 284810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan BlockList& blocks(function->GetBlocks(true)); 285810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 286336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan ConstString name_cs(name); 287336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 288810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::user_id_t current_block_id; 289810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 290810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan for (current_block_id = block->GetID(); 291810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan current_block_id != Block::InvalidID; 292810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan current_block_id = blocks.GetParent(current_block_id)) 293810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 294810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Block *current_block(blocks.GetBlockByID(current_block_id)); 295810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 296810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::VariableListSP var_list = current_block->GetVariableList(false, true); 297810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 298810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!var_list) 299810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 300810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 301336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableSP var = var_list->FindVariable(name_cs); 302810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 303810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!var) 304810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 305810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 306810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // var->GetType()->GetClangAST() is the program's AST context and holds 307810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // var->GetType()->GetOpaqueClangQualType(). 308810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 309810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // type is m_type for one of the struct members, which was added by 310810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // AddValueToStruct. That type was extracted from the AST context of 311810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // the compiler in IRForTarget. The original for the type was copied 312810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // out of the program's AST context by AddOneVariable. 313810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 314336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // So that we can compare these two without having to copy back 315336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // something we already had in the original AST context, we maintain 316336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // m_orig_type and m_ast_context (which are passed into 317336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // MaterializeOneVariable by Materialize) for each variable. 318336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 319336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!type) 320336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 321810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 322810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (ast_context == var->GetType()->GetClangAST()) 323810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 324810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!ClangASTContext::AreTypesSame(ast_context, type, var->GetType()->GetOpaqueClangQualType())) 325810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 326810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 327810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan else 328810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 329810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 330810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 331810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 332810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 333810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 334336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 335336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 336336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 337336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 338336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan CompileUnit *compile_unit = m_sym_ctx->comp_unit; 339336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 340336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!compile_unit) 341336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 342336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 343336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("compile_unit = %p", compile_unit); 344336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 345336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 346336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 347336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableListSP var_list = compile_unit->GetVariableList(true); 348336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 349336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var_list) 350336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 351336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 352336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableSP var = var_list->FindVariable(name_cs); 353336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 354336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var) 355336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 356336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 357336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!type) 358336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 359336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 360336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (ast_context == var->GetType()->GetClangAST()) 361336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 362336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!ClangASTContext::AreTypesSame(ast_context, type, var->GetType()->GetOpaqueClangQualType())) 363336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 364336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 365336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 366336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 367336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 368336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 369336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 370336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 371336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 372336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 373336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 374336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 375336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 376336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 377336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 378336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananbool 379336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::MaterializeOneVariable(ExecutionContext &exe_ctx, 380336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan const SymbolContext &sym_ctx, 381336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan const char *name, 382336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type, 383336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan clang::ASTContext *ast_context, 384336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::addr_t addr, 385336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Error &err) 386336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 387336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 388336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 389336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var = FindVariableInScope(sym_ctx, name, type, ast_context); 390336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 391336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var) 392336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 393336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name); 394336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 395336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 396336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 397336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Materializing %s with type %p", name, type); 398810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 399336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan std::auto_ptr<Value> location_value(GetVariableValue(exe_ctx, 400336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var, 401336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan ast_context)); 402336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 403336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!location_value.get()) 404336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 405336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat("Couldn't get value for %s", name); 406336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 407336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 408336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 409336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (location_value->GetValueType() == Value::eValueTypeLoadAddress) 410336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 411336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::addr_t src_addr = location_value->GetScalar().ULongLong(); 412336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 413336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan size_t bit_size = ClangASTContext::GetTypeBitSize(ast_context, type); 414336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan size_t byte_size = bit_size % 8 ? ((bit_size + 8) / 8) : (bit_size / 8); 415336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 416336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DataBufferHeap data; 417336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan data.SetByteSize(byte_size); 418336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 419336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Error error; 420336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), byte_size, error) != byte_size) 421336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 422336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 423336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 424336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 425336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 426336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (exe_ctx.process->WriteMemory (addr, data.GetBytes(), byte_size, error) != byte_size) 427336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 428336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 429336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 430336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 431336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 432336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 433336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr); 434336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 435336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 436336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 437336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan StreamString ss; 438336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 439336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan location_value->Dump(&ss); 440336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 441336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name, ss.GetString().c_str()); 442810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 443810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 444810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return true; 445810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 446810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetDecls(NameSearchContext &context, 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4526184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 4536184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 454810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 455810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Hunting for a definition for %s", name); 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Back out in all cases where we're not fully initialized 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_exe_ctx || !m_exe_ctx->frame || !m_sym_ctx) 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Function *function = m_sym_ctx->function; 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 463336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!function) 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 465810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 466336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Can't evaluate an expression when not in a function"); 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString name_cs(name); 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4728f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Function *fn = m_sym_ctx->FindFunctionByName(name_cs.GetCString()); 4738f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 4748f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan if (fn) 4758f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan AddOneFunction(context, fn); 476336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 477336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var = FindVariableInScope(*m_sym_ctx, name); 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 479336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (var) 480336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan AddOneVariable(context, var); 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 482336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 483336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 484336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::GetVariableValue(ExecutionContext &exe_ctx, 485336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var, 486336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan clang::ASTContext *target_ast_context, 487336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void **opaque_type, 488336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan clang::ASTContext **found_ast_context) 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4906184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 4916184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 496810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 497810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 498336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *var_opaque_type = var_type->GetOpaqueClangQualType(); 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 505810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 506810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 507336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeList *type_list = var_type->GetTypeList(); 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!type_list) 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 514810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 515810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because the type has no associated type list"); 516336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext(); 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!exe_ast_ctx) 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 523810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 524810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 525336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 528336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 529336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 534336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, *var_location.get(), &err)) 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 536810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 537810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 538336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 541810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext(); 542810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 543336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type_to_use; 544336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 545336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (target_ast_context) 546336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = ClangASTContext::CopyType(target_ast_context, var_ast_context, var_opaque_type); 547336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 548336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 551336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var_location.get()->SetContext(Value::eContextTypeOpaqueClangQualType, type_to_use); 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 557336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 559336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 564336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 565336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t load_addr = so_addr.GetLoadAddress(m_exe_ctx->process); 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->GetScalar() = load_addr; 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->SetValueType(Value::eValueTypeLoadAddress); 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 574336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (opaque_type) 575336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan *opaque_type = var_opaque_type; 576336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 577336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (found_ast_context) 578336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan *found_ast_context = var_ast_context; 579336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 580336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 581336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 582336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 583336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 584336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 585336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable* var) 586336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 587336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 588336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 589336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *var_opaque_type = NULL; 590336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan clang::ASTContext *var_ast_context = NULL; 591336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 592336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Value *var_location = GetVariableValue(*m_exe_ctx, 593336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var, 594336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan context.GetASTContext(), 595336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan &var_opaque_type, 596336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan &var_ast_context); 597336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 598336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan NamedDecl *var_decl = context.AddVarDecl(var_opaque_type); 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Tuple tuple; 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 602810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_decl = var_decl; 603336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan tuple.m_value = var_location; 604810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_orig_type = var_opaque_type; 605810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_ast_context = var_ast_context; 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tuples.push_back(tuple); 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 609810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 610810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Found variable"); 6118f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 6128f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6138f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 6148f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 6158f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Function* fun) 6168f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 6176184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 6186184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 6198f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Type *fun_type = fun->GetType(); 6208f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6218f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan if (!fun_type) 6228f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 623810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 624810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a function because it has no type"); 6258f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 6268f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 6278f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6288f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan void *fun_opaque_type = fun_type->GetOpaqueClangQualType(); 6298f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6308f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan if (!fun_opaque_type) 6318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 632810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 633810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a function because it has no Clang type"); 6348f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 6358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 6368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6378f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan std::auto_ptr<Value> fun_location(new Value); 6388f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6398f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan const Address &fun_address = fun->GetAddressRange().GetBaseAddress(); 6408f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan lldb::addr_t load_addr = fun_address.GetLoadAddress(m_exe_ctx->process); 6418f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 6428f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 6438f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6448f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan TypeList *type_list = fun_type->GetTypeList(); 645810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan clang::ASTContext *fun_ast_context = type_list->GetClangASTContext().getASTContext(); 646810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 6478f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6488f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan NamedDecl *fun_decl = context.AddFunDecl(copied_type); 6498f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6508f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Tuple tuple; 6518f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 652810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_decl = fun_decl; 653810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_value = fun_location.release(); 654810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_orig_type = fun_opaque_type; 655810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_ast_context = fun_ast_context; 6568f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6578f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan m_tuples.push_back(tuple); 6588f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 659810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 660810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Found function"); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 662