ClangExpressionDeclMap.cpp revision 0fc7358d61218ba5d5abb5c2ea489a9ef936bbf7
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" 31f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h" 32810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h" 34f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang; 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::ClangExpressionDeclMap(ExecutionContext *exe_ctx) : 408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_exe_ctx(exe_ctx), 41810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan m_struct_laid_out(false), 42810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan m_materialized_location(0) 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_ctx && exe_ctx->frame) 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sym_ctx = new SymbolContext(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything)); 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sym_ctx = NULL; 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap() 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_tuples = m_tuples.size (); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t tuple_index; 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (tuple_index = 0; tuple_index < num_tuples; ++tuple_index) 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner delete m_tuples[tuple_index].m_value; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_sym_ctx) 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner delete m_sym_ctx; 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetIndexForDecl (uint32_t &index, 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const clang::Decl *decl) 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_tuples = m_tuples.size (); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t tuple_index; 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (tuple_index = 0; tuple_index < num_tuples; ++tuple_index) 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_tuples[tuple_index].m_decl == decl) 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner index = tuple_index; 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget 828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::AddValueToStruct (llvm::Value *value, 858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan const clang::NamedDecl *decl, 86810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan std::string &name, 87f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan void *parser_type, 88f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *parser_ast_context, 898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t size, 908bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t alignment) 918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_laid_out = false; 938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan StructMemberIterator iter; 958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan for (iter = m_members.begin(); 978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan iter != m_members.end(); 988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan ++iter) 998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 1008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (iter->m_decl == decl) 1018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 1038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan StructMember member; 1058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 106f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan member.m_value = value; 107f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan member.m_decl = decl; 108f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan member.m_name = name; 109f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan member.m_parser_type = TypeFromParser(parser_type, parser_ast_context); 110f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan member.m_offset = 0; 111f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan member.m_size = size; 112f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan member.m_alignment = alignment; 1138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_members.push_back(member); 1158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 1208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout () 1218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 1228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (m_struct_laid_out) 1238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1248bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan StructMemberIterator iter; 1268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t cursor = 0; 1288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_alignment = 0; 1308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_size = 0; 1318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan for (iter = m_members.begin(); 1338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan iter != m_members.end(); 1348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan ++iter) 1358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan { 1368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (iter == m_members.begin()) 1378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_alignment = iter->m_alignment; 1388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (cursor % iter->m_alignment) 1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan cursor += (iter->m_alignment - (cursor % iter->m_alignment)); 1418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan iter->m_offset = cursor; 1438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan cursor += iter->m_size; 1448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan } 1458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_size = cursor; 1478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan m_struct_laid_out = true; 1498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool ClangExpressionDeclMap::GetStructInfo (uint32_t &num_elements, 1538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size_t &size, 1548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t &alignment) 1558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 1568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (!m_struct_laid_out) 1578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 1588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan num_elements = m_members.size(); 1608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan size = m_struct_size; 1618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan alignment = m_struct_alignment; 1628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool 1678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::GetStructElement (const clang::NamedDecl *&decl, 1688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan llvm::Value *&value, 1698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan off_t &offset, 1708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan uint32_t index) 1718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{ 1728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (!m_struct_laid_out) 1738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 1748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan if (index >= m_members.size()) 1768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return false; 1778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan decl = m_members[index].m_decl; 1798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan value = m_members[index].m_value; 1808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan offset = m_members[index].m_offset; 1818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 1828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan return true; 1838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan} 1848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for DwarfExpression 186f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananlldb_private::Value 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner*ClangExpressionDeclMap::GetValueForIndex (uint32_t index) 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index >= m_tuples.size ()) 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_tuples[index].m_value; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 195810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 196f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 197f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 198f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::Materialize (ExecutionContext *exe_ctx, 199f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t &struct_address, 200f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 201f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 202f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool result = DoMaterialize(false, exe_ctx, NULL, err); 203f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 204f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 205f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan struct_address = m_materialized_location; 206f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 207f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 208f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 209f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 210f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 211f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::Dematerialize (ExecutionContext *exe_ctx, 212f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value &result_value, 213f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 214f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 215f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return DoMaterialize(true, exe_ctx, &result_value, err); 216f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 217f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 21832824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 21932824aa43fdc8393d829c16f126f32ca8d3582adSean CallananClangExpressionDeclMap::DumpMaterializedStruct(ExecutionContext *exe_ctx, 22032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Stream &s, 22132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error &err) 22232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 22332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (!m_struct_laid_out) 22432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 22532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 22632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 22732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 22832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 22932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (!exe_ctx) 23032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 23132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Received null execution context"); 23232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 23332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 23432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 23532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 23632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (!exe_ctx->process) 23732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 23832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 23932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 24032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 24132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 24232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (!exe_ctx->target) 24332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 24432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 24532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 24632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 24732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 24832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan lldb::DataBufferSP data(new DataBufferHeap(m_struct_size, 0)); 24932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 25032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 25132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (exe_ctx->process->ReadMemory (m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize()) 25232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 25332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 25432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 25532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 25632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 25732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan DataExtractor extractor(data, exe_ctx->process->GetByteOrder(), exe_ctx->target->GetArchitecture().GetAddressByteSize()); 25832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 25932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan StructMemberIterator iter; 26032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 26132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan for (iter = m_members.begin(); 26232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan iter != m_members.end(); 26332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan ++iter) 26432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 26532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.Printf("[%s]\n", iter->m_name.c_str()); 26632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 26732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan extractor.Dump(&s, // stream 26832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan iter->m_offset, // offset 26932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan lldb::eFormatBytesWithASCII, // format 27032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1, // byte size of individual entries 27132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan iter->m_size, // number of entries 27232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 16, // entries per line 27332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan m_materialized_location + iter->m_offset, // address to print 27432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 0, // bit size (bitfields only; 0 means ignore) 27532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 0); // bit alignment (bitfields only; 0 means ignore) 27632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 27732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 27832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 27932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 28032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 28132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 28232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 283f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 284f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterialize (bool dematerialize, 285f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext *exe_ctx, 286f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value *result_value, 287f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 288810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 289336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 290336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 291810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!m_struct_laid_out) 292810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 293810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 294810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 295810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 296810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 297810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!exe_ctx) 298810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 299810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Received null execution context"); 300810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 301810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 302810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 30345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan if (!exe_ctx->frame) 30445839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 30545839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 30645839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan return LLDB_INVALID_ADDRESS; 30745839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 30845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 309810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan const SymbolContext &sym_ctx(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything)); 310810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 311f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 312f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 313f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (m_materialized_location) 314f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 315f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan exe_ctx->process->DeallocateMemory(m_materialized_location); 316f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location = 0; 317f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 318810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 319f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t mem = exe_ctx->process->AllocateMemory(m_struct_alignment + m_struct_size, 320f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 321f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err); 322f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 323f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 324f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 325f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 326f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_allocated_area = mem; 327f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 328810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 329f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location = m_allocated_area; 330810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 331f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (m_materialized_location % m_struct_alignment) 332810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 333f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location += (m_struct_alignment - (m_materialized_location % m_struct_alignment)); 334810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 335f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 336f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan StructMemberIterator iter; 337810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 338810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan for (iter = m_members.begin(); 339810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan iter != m_members.end(); 340810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan ++iter) 341810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 342810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan uint32_t tuple_index; 343810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 344336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!GetIndexForDecl(tuple_index, iter->m_decl)) 345336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 346336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (iter->m_name.find("___clang_expr_result") == std::string::npos) 347336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 348336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat("Unexpected variable %s", iter->m_name.c_str()); 349336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 350336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 351336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 352336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 353336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Found special result variable %s", iter->m_name.c_str()); 354336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 355f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (dematerialize) 356f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 358f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 359f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!context) 360f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 361f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorString("Couldn't find a scratch AST context to put the result type into"); 362f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 363f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 364f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser copied_type(ClangASTContext::CopyType(context, 365f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan iter->m_parser_type.GetASTContext(), 3661674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton iter->m_parser_type.GetOpaqueQualType()), 367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan context); 368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 369841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan result_value->SetContext(Value::eContextTypeOpaqueClangQualType, copied_type.GetOpaqueQualType()); 370841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan 371841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan result_value->SetValueType(Value::eValueTypeLoadAddress); 372841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan result_value->GetScalar() = (uintptr_t)m_materialized_location + iter->m_offset; 373f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 374f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 375810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 376336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 377810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 378810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Tuple &tuple(m_tuples[tuple_index]); 379810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 380f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!DoMaterializeOneVariable(dematerialize, *exe_ctx, sym_ctx, iter->m_name.c_str(), tuple.m_user_type, m_materialized_location + iter->m_offset, err)) 381336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 382810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 383810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 384f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 385f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 386f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 387f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 388f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterializeOneVariable(bool dematerialize, 389f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext &exe_ctx, 390f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const SymbolContext &sym_ctx, 391f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const char *name, 392f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser type, 393f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t addr, 394f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 395f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 396f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 397f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 398f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Variable *var = FindVariableInScope(sym_ctx, name, &type); 399f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 400f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!var) 401f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 402f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name); 403f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 404f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 405f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 406841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 407841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name, type.GetOpaqueQualType()); 408f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 409f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 410f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan var, 411f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan type.GetASTContext())); 412f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 413f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 414f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 415f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("Couldn't get value for %s", name); 416f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 417f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 418f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 419f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (location_value->GetValueType() == Value::eValueTypeLoadAddress) 420f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 421f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 422f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 423841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan size_t bit_size = ClangASTContext::GetTypeBitSize(type.GetASTContext(), type.GetOpaqueQualType()); 424f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan size_t byte_size = bit_size % 8 ? ((bit_size + 8) / 8) : (bit_size / 8); 425f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 426f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan DataBufferHeap data; 427f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan data.SetByteSize(byte_size); 428f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 429f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t src_addr; 430f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t dest_addr; 431f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 432f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (dematerialize) 433f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 434f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan src_addr = addr; 435f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan dest_addr = value_addr; 436f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 437f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan else 438f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 439f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan src_addr = value_addr; 440f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan dest_addr = addr; 441f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 442f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 443f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error error; 444f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), byte_size, error) != byte_size) 445f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 446f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 447f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 448f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 449f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 450f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), byte_size, error) != byte_size) 451f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 452f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 453f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 454f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 455f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 456f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (log) 457f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr); 458f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 459f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan else 460f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 461f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan StreamString ss; 462f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 463f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan location_value->Dump(&ss); 464f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 465f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name, ss.GetString().c_str()); 466f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 467f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 468f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 469810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 470810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 471336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananVariable* 472336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::FindVariableInScope(const SymbolContext &sym_ctx, 473336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan const char *name, 474f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *type) 475810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 476810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 477810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 478810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Function *function(m_sym_ctx->function); 479810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Block *block(m_sym_ctx->block); 480810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 481810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!function || !block) 482810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 483810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 484810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("function = %p, block = %p", function, block); 485336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 486810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 487810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 488810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan BlockList& blocks(function->GetBlocks(true)); 489810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 490336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan ConstString name_cs(name); 491336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 492810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::user_id_t current_block_id; 493810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 494810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan for (current_block_id = block->GetID(); 495810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan current_block_id != Block::InvalidID; 496810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan current_block_id = blocks.GetParent(current_block_id)) 497810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 498810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Block *current_block(blocks.GetBlockByID(current_block_id)); 499810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 500810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::VariableListSP var_list = current_block->GetVariableList(false, true); 501810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 502810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!var_list) 503810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 504810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 505336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableSP var = var_list->FindVariable(name_cs); 506810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 507810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!var) 508810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 509810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 510810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // var->GetType()->GetClangAST() is the program's AST context and holds 511810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // var->GetType()->GetOpaqueClangQualType(). 512810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 513810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // type is m_type for one of the struct members, which was added by 514810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // AddValueToStruct. That type was extracted from the AST context of 515810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // the compiler in IRForTarget. The original for the type was copied 516810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // out of the program's AST context by AddOneVariable. 517810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 518336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // So that we can compare these two without having to copy back 519336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // something we already had in the original AST context, we maintain 520336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // m_orig_type and m_ast_context (which are passed into 521336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // MaterializeOneVariable by Materialize) for each variable. 522336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 523336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!type) 524336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 525810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 526f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (type->GetASTContext() == var->GetType()->GetClangAST()) 527810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 528f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type, var->GetType()->GetOpaqueClangQualType())) 529810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 530810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 531810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan else 532810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 533810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 534810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 535810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 536810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 537810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 538336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 539336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 540336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 541336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 542336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan CompileUnit *compile_unit = m_sym_ctx->comp_unit; 543336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 544336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!compile_unit) 545336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 546336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 547336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("compile_unit = %p", compile_unit); 548336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 549336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 550336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 551336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableListSP var_list = compile_unit->GetVariableList(true); 552336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 553336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var_list) 554336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 555336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 556336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableSP var = var_list->FindVariable(name_cs); 557336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 558336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var) 559336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 560336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 561336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!type) 562336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 563336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 564f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (type->GetASTContext() == var->GetType()->GetClangAST()) 565336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 566841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var->GetType()->GetOpaqueClangQualType())) 567336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 568336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 569336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 570336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 571336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 572336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 573336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 574336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 575336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 576336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 577336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 578336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 579336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 580336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 581336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetDecls(NameSearchContext &context, 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name) 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5876184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 5886184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 589810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 590810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Hunting for a definition for %s", name); 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Back out in all cases where we're not fully initialized 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_exe_ctx || !m_exe_ctx->frame || !m_sym_ctx) 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Function *function = m_sym_ctx->function; 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 598336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!function) 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 600810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 601336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Can't evaluate an expression when not in a function"); 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString name_cs(name); 6060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan SymbolContextList sym_ctxs; 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan m_sym_ctx->FindFunctionsByName(name_cs, false, sym_ctxs); 6090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 6100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan for (uint32_t index = 0, num_indices = sym_ctxs.GetSize(); 6110fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan index < num_indices; 6120fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan ++index) 6130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 6140fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan SymbolContext sym_ctx; 6150fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan sym_ctxs.GetContextAtIndex(index, sym_ctx); 6160fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 6170fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (sym_ctx.function) 6180fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan AddOneFunction(context, sym_ctx.function, NULL); 6190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if(sym_ctx.symbol) 6200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan AddOneFunction(context, NULL, sym_ctx.symbol); 6210fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 6228f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 623336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var = FindVariableInScope(*m_sym_ctx, name); 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 625336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (var) 626336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan AddOneVariable(context, var); 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 628336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 629336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 630336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::GetVariableValue(ExecutionContext &exe_ctx, 631336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var, 632f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *parser_ast_context, 633f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *user_type, 634f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser *parser_type) 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6366184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 6376184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 642810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 643810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 644336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *var_opaque_type = var_type->GetOpaqueClangQualType(); 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 651810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 652810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 653336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeList *type_list = var_type->GetTypeList(); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!type_list) 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 660810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 661810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because the type has no associated type list"); 662336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext(); 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!exe_ast_ctx) 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 669810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 670810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 671336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 674336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 675336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 680336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, *var_location.get(), &err)) 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 682810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 683810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 684336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 687810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext(); 688810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 689336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type_to_use; 690336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 691f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 692f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 693f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan type_to_use = ClangASTContext::CopyType(parser_ast_context, var_ast_context, var_opaque_type); 694f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 695f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 696f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 697f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 698336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 699336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 702336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var_location.get()->SetContext(Value::eContextTypeOpaqueClangQualType, type_to_use); 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 708336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 710336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 715336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 716336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t load_addr = so_addr.GetLoadAddress(m_exe_ctx->process); 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->GetScalar() = load_addr; 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->SetValueType(Value::eValueTypeLoadAddress); 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 725f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 726f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *user_type = TypeFromUser(var_opaque_type, var_ast_context); 727336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 728336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 729336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 730336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 731336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 732336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 733336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable* var) 734336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 735336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 736336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 737f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 738f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 739336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 740336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Value *var_location = GetVariableValue(*m_exe_ctx, 741336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var, 742336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan context.GetASTContext(), 743f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan &ut, 744f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan &pt); 745336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 7461674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Tuple tuple; 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 750810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_decl = var_decl; 751336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan tuple.m_value = var_location; 752f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_user_type = ut; 753f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_parser_type = pt; 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tuples.push_back(tuple); 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 757810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 758810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Found variable"); 7598f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 7608f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 7628f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 7630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Function* fun, 7640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Symbol* symbol) 7658f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 7666184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 7678f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan NamedDecl *fun_decl; 7690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 7700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan const Address *fun_address; 7718f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 7730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 7740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan clang::ASTContext *fun_ast_context = NULL; 7758f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 7770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 7780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 7790fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 7800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 7810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 7820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 7830fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no type"); 7840fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 7850fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 7860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 7870fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_opaque_type = fun_type->GetOpaqueClangQualType(); 7880fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 7890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 7900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 7910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 7920fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no Clang type"); 7930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 7940fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 7950fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 7960fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 7970fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 7980fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan TypeList *type_list = fun_type->GetTypeList(); 7990fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_ast_context = type_list->GetClangASTContext().getASTContext(); 8000fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 8010fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8020fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddFunDecl(copied_type); 8030fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 8040fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 8050fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 8060fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 8070fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8080fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 8090fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 8100fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 8118f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 812810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 8130fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("AddOneFunction called with no function and no symbol"); 8148f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 8158f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 8168f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8170fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan lldb::addr_t load_addr = fun_address->GetLoadAddress(m_exe_ctx->process); 8188f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 8198f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 8208f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8218f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Tuple tuple; 8228f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 823810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_decl = fun_decl; 824810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_value = fun_location.release(); 825f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_user_type = TypeFromUser(fun_opaque_type, fun_ast_context); 8268f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8278f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan m_tuples.push_back(tuple); 8288f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 829810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 830810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Found function"); 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 832