ClangExpressionDeclMap.cpp revision f328c9ffe0bb00f48601027ec86dbdf238b42c2a
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 218f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 219f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterialize (bool dematerialize, 220f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext *exe_ctx, 221f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value *result_value, 222f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 223810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 224336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 225336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 226810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!m_struct_laid_out) 227810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 228810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 229810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 230810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 231810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 232810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!exe_ctx) 233810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 234810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Received null execution context"); 235810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 236810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 237810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 238810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan const SymbolContext &sym_ctx(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything)); 239810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 240f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 241f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 242f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (m_materialized_location) 243f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 244f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan exe_ctx->process->DeallocateMemory(m_materialized_location); 245f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location = 0; 246f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 247810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 248f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t mem = exe_ctx->process->AllocateMemory(m_struct_alignment + m_struct_size, 249f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 250f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err); 251f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 252f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 253f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 254f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 255f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_allocated_area = mem; 256f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 257810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 258f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location = m_allocated_area; 259810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 260f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (m_materialized_location % m_struct_alignment) 261810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 262f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location += (m_struct_alignment - (m_materialized_location % m_struct_alignment)); 263810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 264f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 265f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan StructMemberIterator iter; 266810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 267810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan for (iter = m_members.begin(); 268810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan iter != m_members.end(); 269810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan ++iter) 270810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 271810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan uint32_t tuple_index; 272810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 273336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!GetIndexForDecl(tuple_index, iter->m_decl)) 274336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 275336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (iter->m_name.find("___clang_expr_result") == std::string::npos) 276336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 277336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat("Unexpected variable %s", iter->m_name.c_str()); 278336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 279336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 280336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 281336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 282336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Found special result variable %s", iter->m_name.c_str()); 283336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 284f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (dematerialize) 285f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 286f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 287f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 288f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!context) 289f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 290f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorString("Couldn't find a scratch AST context to put the result type into"); 291f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 292f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 293f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser copied_type(ClangASTContext::CopyType(context, 294f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan iter->m_parser_type.GetASTContext(), 295f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan iter->m_parser_type.GetType()), 296f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan context); 297f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 298f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan result_value->SetContext(Value::eContextTypeOpaqueClangQualType, copied_type.GetType()); 299f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 300f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 301810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 302336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 303810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 304810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Tuple &tuple(m_tuples[tuple_index]); 305810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 306f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!DoMaterializeOneVariable(dematerialize, *exe_ctx, sym_ctx, iter->m_name.c_str(), tuple.m_user_type, m_materialized_location + iter->m_offset, err)) 307336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 308810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 309810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 310f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 311f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 312f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 313f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 314f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterializeOneVariable(bool dematerialize, 315f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext &exe_ctx, 316f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const SymbolContext &sym_ctx, 317f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const char *name, 318f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser type, 319f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t addr, 320f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 321f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 322f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 323f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 324f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Variable *var = FindVariableInScope(sym_ctx, name, &type); 325f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 326f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!var) 327f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 328f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name); 329f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 330f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 331f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 332f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name, type.GetType()); 333f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 334f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 335f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan var, 336f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan type.GetASTContext())); 337f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 338f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 339f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 340f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("Couldn't get value for %s", name); 341f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 342f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 343f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 344f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (location_value->GetValueType() == Value::eValueTypeLoadAddress) 345f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 346f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 347f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 348f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan size_t bit_size = ClangASTContext::GetTypeBitSize(type.GetASTContext(), type.GetType()); 349f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan size_t byte_size = bit_size % 8 ? ((bit_size + 8) / 8) : (bit_size / 8); 350f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 351f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan DataBufferHeap data; 352f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan data.SetByteSize(byte_size); 353f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 354f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t src_addr; 355f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t dest_addr; 356f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (dematerialize) 358f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 359f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan src_addr = addr; 360f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan dest_addr = value_addr; 361f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 362f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan else 363f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 364f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan src_addr = value_addr; 365f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan dest_addr = addr; 366f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error error; 369f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), byte_size, error) != byte_size) 370f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 371f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 372f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 373f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 374f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 375f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), byte_size, error) != byte_size) 376f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 377f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 378f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 379f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 380f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 381f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (log) 382f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr); 383f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 384f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan else 385f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 386f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan StreamString ss; 387f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 388f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan location_value->Dump(&ss); 389f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 390f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name, ss.GetString().c_str()); 391f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 392f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 393f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 394810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 395810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 396336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananVariable* 397336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::FindVariableInScope(const SymbolContext &sym_ctx, 398336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan const char *name, 399f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *type) 400810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 401810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 402810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 403810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Function *function(m_sym_ctx->function); 404810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Block *block(m_sym_ctx->block); 405810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 406810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!function || !block) 407810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 408810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 409810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("function = %p, block = %p", function, block); 410336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 411810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 412810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 413810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan BlockList& blocks(function->GetBlocks(true)); 414810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 415336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan ConstString name_cs(name); 416336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 417810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::user_id_t current_block_id; 418810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 419810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan for (current_block_id = block->GetID(); 420810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan current_block_id != Block::InvalidID; 421810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan current_block_id = blocks.GetParent(current_block_id)) 422810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 423810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Block *current_block(blocks.GetBlockByID(current_block_id)); 424810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 425810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::VariableListSP var_list = current_block->GetVariableList(false, true); 426810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 427810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!var_list) 428810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 429810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 430336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableSP var = var_list->FindVariable(name_cs); 431810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 432810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!var) 433810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 434810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 435810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // var->GetType()->GetClangAST() is the program's AST context and holds 436810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // var->GetType()->GetOpaqueClangQualType(). 437810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 438810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // type is m_type for one of the struct members, which was added by 439810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // AddValueToStruct. That type was extracted from the AST context of 440810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // the compiler in IRForTarget. The original for the type was copied 441810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // out of the program's AST context by AddOneVariable. 442810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 443336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // So that we can compare these two without having to copy back 444336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // something we already had in the original AST context, we maintain 445336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // m_orig_type and m_ast_context (which are passed into 446336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // MaterializeOneVariable by Materialize) for each variable. 447336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 448336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!type) 449336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 450810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 451f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (type->GetASTContext() == var->GetType()->GetClangAST()) 452810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 453f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type, var->GetType()->GetOpaqueClangQualType())) 454810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 455810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 456810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan else 457810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 458810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 459810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 460810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 461810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 462810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 463336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 464336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 465336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 466336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 467336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan CompileUnit *compile_unit = m_sym_ctx->comp_unit; 468336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 469336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!compile_unit) 470336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 471336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 472336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("compile_unit = %p", compile_unit); 473336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 474336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 475336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 476336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableListSP var_list = compile_unit->GetVariableList(true); 477336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 478336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var_list) 479336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 480336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 481336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableSP var = var_list->FindVariable(name_cs); 482336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 483336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var) 484336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 485336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 486336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!type) 487336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 488336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 489f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (type->GetASTContext() == var->GetType()->GetClangAST()) 490336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 491f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetType(), var->GetType()->GetOpaqueClangQualType())) 492336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 493336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 494336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 495336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 496336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 497336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 498336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 499336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 500336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 501336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 502336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 503336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 504336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 505336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 506336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetDecls(NameSearchContext &context, 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name) 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5126184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 5136184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 514810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 515810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Hunting for a definition for %s", name); 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Back out in all cases where we're not fully initialized 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_exe_ctx || !m_exe_ctx->frame || !m_sym_ctx) 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Function *function = m_sym_ctx->function; 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 523336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!function) 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 525810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 526336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Can't evaluate an expression when not in a function"); 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString name_cs(name); 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Function *fn = m_sym_ctx->FindFunctionByName(name_cs.GetCString()); 5338f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 5348f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan if (fn) 5358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan AddOneFunction(context, fn); 536336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 537336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var = FindVariableInScope(*m_sym_ctx, name); 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 539336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (var) 540336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan AddOneVariable(context, var); 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 542336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 543336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 544336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::GetVariableValue(ExecutionContext &exe_ctx, 545336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var, 546f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *parser_ast_context, 547f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *user_type, 548f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser *parser_type) 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5506184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 5516184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 556810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 557810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 558336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *var_opaque_type = var_type->GetOpaqueClangQualType(); 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 565810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 566810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 567336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeList *type_list = var_type->GetTypeList(); 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!type_list) 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 574810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 575810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because the type has no associated type list"); 576336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext(); 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!exe_ast_ctx) 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 583810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 584810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 585336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 588336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 589336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 594336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, *var_location.get(), &err)) 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 596810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 597810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 598336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 601810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext(); 602810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 603336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type_to_use; 604336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 605f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 606f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 607f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan type_to_use = ClangASTContext::CopyType(parser_ast_context, var_ast_context, var_opaque_type); 608f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 609f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 610f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 611f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 612336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 613336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 616336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var_location.get()->SetContext(Value::eContextTypeOpaqueClangQualType, type_to_use); 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 622336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 624336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 629336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 630336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t load_addr = so_addr.GetLoadAddress(m_exe_ctx->process); 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->GetScalar() = load_addr; 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->SetValueType(Value::eValueTypeLoadAddress); 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 639f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 640f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *user_type = TypeFromUser(var_opaque_type, var_ast_context); 641336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 642336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 643336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 644336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 645336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 646336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 647336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable* var) 648336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 649336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 650336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 651f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 652f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 653336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 654336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Value *var_location = GetVariableValue(*m_exe_ctx, 655336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var, 656336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan context.GetASTContext(), 657f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan &ut, 658f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan &pt); 659336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 660f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan NamedDecl *var_decl = context.AddVarDecl(pt.GetType()); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Tuple tuple; 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 664810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_decl = var_decl; 665336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan tuple.m_value = var_location; 666f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_user_type = ut; 667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_parser_type = pt; 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tuples.push_back(tuple); 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 671810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 672810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Found variable"); 6738f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 6748f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6758f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 6768f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 6778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Function* fun) 6788f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 6796184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 6806184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 6818f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Type *fun_type = fun->GetType(); 6828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan if (!fun_type) 6848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 685810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 686810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a function because it has no type"); 6878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 6888f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 6898f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6908f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan void *fun_opaque_type = fun_type->GetOpaqueClangQualType(); 6918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6928f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan if (!fun_opaque_type) 6938f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 694810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 695810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a function because it has no Clang type"); 6968f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 6978f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 6988f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 6998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan std::auto_ptr<Value> fun_location(new Value); 7008f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7018f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan const Address &fun_address = fun->GetAddressRange().GetBaseAddress(); 7028f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan lldb::addr_t load_addr = fun_address.GetLoadAddress(m_exe_ctx->process); 7038f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 7048f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 7058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7068f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan TypeList *type_list = fun_type->GetTypeList(); 707810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan clang::ASTContext *fun_ast_context = type_list->GetClangASTContext().getASTContext(); 708810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 7098f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7108f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan NamedDecl *fun_decl = context.AddFunDecl(copied_type); 7118f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7128f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Tuple tuple; 7138f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 714810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_decl = fun_decl; 715810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_value = fun_location.release(); 716f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_user_type = TypeFromUser(fun_opaque_type, fun_ast_context); 7178f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 7188f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan m_tuples.push_back(tuple); 7198f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 720810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 721810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Found function"); 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 723