ClangExpressionDeclMap.cpp revision 960d6a40711f05effe6fcc5b66f0952450f79ea2
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 18502fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool 18602fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean CallananClangExpressionDeclMap::GetFunctionInfo (const clang::NamedDecl *decl, 18702fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan llvm::Value**& value, 18802fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan uint64_t &ptr) 189ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{ 190ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan TupleIterator iter; 191ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 192ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan for (iter = m_tuples.begin(); 193ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan iter != m_tuples.end(); 194ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan ++iter) 195ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan { 196ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan if (decl == iter->m_decl) 197ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan { 19802fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan value = &iter->m_llvm_value; 19902fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan ptr = iter->m_value->GetScalar().ULongLong(); 20002fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan return true; 201ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan } 202ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan } 203ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 20402fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan return false; 205ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan} 206ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan 207f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool 208f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean CallananClangExpressionDeclMap::GetFunctionAddress (const char *name, 209f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan uint64_t &ptr) 210f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{ 211f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan // Back out in all cases where we're not fully initialized 212f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (!m_exe_ctx || !m_exe_ctx->frame || !m_sym_ctx) 213f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 214f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 215f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan ConstString name_cs(name); 216f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContextList sym_ctxs; 217f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 218f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan m_sym_ctx->FindFunctionsByName(name_cs, false, sym_ctxs); 219f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 220f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (!sym_ctxs.GetSize()) 221f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 222f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 223f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan SymbolContext sym_ctx; 224f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan sym_ctxs.GetContextAtIndex(0, sym_ctx); 225f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 226f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan const Address *fun_address; 227f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 228f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (sym_ctx.function) 229f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan fun_address = &sym_ctx.function->GetAddressRange().GetBaseAddress(); 230f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else if (sym_ctx.symbol) 231f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan fun_address = &sym_ctx.symbol->GetAddressRangeRef().GetBaseAddress(); 232f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan else 233f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return false; 234f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 235f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan ptr = fun_address->GetLoadAddress(m_exe_ctx->process); 236f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 237f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan return true; 238f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan} 239f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for DwarfExpression 241f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananlldb_private::Value 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner*ClangExpressionDeclMap::GetValueForIndex (uint32_t index) 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index >= m_tuples.size ()) 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_tuples[index].m_value; 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression 251f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 252f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 253f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::Materialize (ExecutionContext *exe_ctx, 254f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t &struct_address, 255f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 256f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 257f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan bool result = DoMaterialize(false, exe_ctx, NULL, err); 258f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 259f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (result) 260f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan struct_address = m_materialized_location; 261f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 262f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return result; 263f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 264f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 265f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 266f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::Dematerialize (ExecutionContext *exe_ctx, 267f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value &result_value, 268f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 269f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 270f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return DoMaterialize(true, exe_ctx, &result_value, err); 271f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 272f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 27332824aa43fdc8393d829c16f126f32ca8d3582adSean Callananbool 27432824aa43fdc8393d829c16f126f32ca8d3582adSean CallananClangExpressionDeclMap::DumpMaterializedStruct(ExecutionContext *exe_ctx, 27532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Stream &s, 27632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error &err) 27732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan{ 27832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (!m_struct_laid_out) 27932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 28032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 28132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 28232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 28332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 28432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (!exe_ctx) 28532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 28632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Received null execution context"); 28732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 28832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 28932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 29032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 29132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (!exe_ctx->process) 29232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 29332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the process"); 29432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 29532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 29632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 29732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (!exe_ctx->target) 29832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 29932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorString("Couldn't find the target"); 30032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 30132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 30232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 30332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan lldb::DataBufferSP data(new DataBufferHeap(m_struct_size, 0)); 30432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 30532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan Error error; 30632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan if (exe_ctx->process->ReadMemory (m_materialized_location, data->GetBytes(), data->GetByteSize(), error) != data->GetByteSize()) 30732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 30832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan err.SetErrorStringWithFormat ("Couldn't read struct from the target: %s", error.AsCString()); 30932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return false; 31032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 31132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 31232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan DataExtractor extractor(data, exe_ctx->process->GetByteOrder(), exe_ctx->target->GetArchitecture().GetAddressByteSize()); 31332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 31432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan StructMemberIterator iter; 31532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 31632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan for (iter = m_members.begin(); 31732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan iter != m_members.end(); 31832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan ++iter) 31932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan { 32032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.Printf("[%s]\n", iter->m_name.c_str()); 32132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 32232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan extractor.Dump(&s, // stream 32332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan iter->m_offset, // offset 32432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan lldb::eFormatBytesWithASCII, // format 32532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 1, // byte size of individual entries 32632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan iter->m_size, // number of entries 32732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 16, // entries per line 32832824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan m_materialized_location + iter->m_offset, // address to print 32932824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 0, // bit size (bitfields only; 0 means ignore) 33032824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 0); // bit alignment (bitfields only; 0 means ignore) 33132824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 33232824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan s.PutChar('\n'); 33332824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan } 33432824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 33532824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan return true; 33632824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan} 33732824aa43fdc8393d829c16f126f32ca8d3582adSean Callanan 338f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 339f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterialize (bool dematerialize, 340f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext *exe_ctx, 341f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb_private::Value *result_value, 342f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 343810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 344336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 345336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 346810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!m_struct_laid_out) 347810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 348810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Structure hasn't been laid out yet"); 349810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 350810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 351810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 352810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!exe_ctx) 353810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 354810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan err.SetErrorString("Received null execution context"); 355810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan return LLDB_INVALID_ADDRESS; 356810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 357810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 35845839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan if (!exe_ctx->frame) 35945839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan { 36045839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan err.SetErrorString("Received null execution frame"); 36145839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan return LLDB_INVALID_ADDRESS; 36245839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan } 36345839276c3de51a55adef98a2a20a98f2ba428a9Sean Callanan 364810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan const SymbolContext &sym_ctx(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything)); 365810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 366f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!dematerialize) 367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (m_materialized_location) 369f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 370f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan exe_ctx->process->DeallocateMemory(m_materialized_location); 371f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location = 0; 372f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 373810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 374f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t mem = exe_ctx->process->AllocateMemory(m_struct_alignment + m_struct_size, 375f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::ePermissionsReadable | lldb::ePermissionsWritable, 376f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err); 377f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 378f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (mem == LLDB_INVALID_ADDRESS) 379f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 380f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 381f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_allocated_area = mem; 382f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 383810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 384f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location = m_allocated_area; 385810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 386f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (m_materialized_location % m_struct_alignment) 387810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 388f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan m_materialized_location += (m_struct_alignment - (m_materialized_location % m_struct_alignment)); 389810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 390f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 391f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan StructMemberIterator iter; 392810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 393810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan for (iter = m_members.begin(); 394810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan iter != m_members.end(); 395810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan ++iter) 396810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 397810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan uint32_t tuple_index; 398810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 399336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!GetIndexForDecl(tuple_index, iter->m_decl)) 400336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 401336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (iter->m_name.find("___clang_expr_result") == std::string::npos) 402336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 403336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan err.SetErrorStringWithFormat("Unexpected variable %s", iter->m_name.c_str()); 404336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 405336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 406336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 407336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 408336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Found special result variable %s", iter->m_name.c_str()); 409336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 410f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (dematerialize) 411f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 412f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext()); 413f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 414f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!context) 415f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 416f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorString("Couldn't find a scratch AST context to put the result type into"); 417f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 418f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 419f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser copied_type(ClangASTContext::CopyType(context, 420f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan iter->m_parser_type.GetASTContext(), 4211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton iter->m_parser_type.GetOpaqueQualType()), 422f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan context); 423f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 424841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan result_value->SetContext(Value::eContextTypeOpaqueClangQualType, copied_type.GetOpaqueQualType()); 425841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan 426841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan result_value->SetValueType(Value::eValueTypeLoadAddress); 427841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan result_value->GetScalar() = (uintptr_t)m_materialized_location + iter->m_offset; 428f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 429f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 430810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 431336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 432810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 433810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Tuple &tuple(m_tuples[tuple_index]); 434810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 435f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!DoMaterializeOneVariable(dematerialize, *exe_ctx, sym_ctx, iter->m_name.c_str(), tuple.m_user_type, m_materialized_location + iter->m_offset, err)) 436336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return false; 437810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 438810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 439f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 440f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan} 441f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 442f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool 443f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterializeOneVariable(bool dematerialize, 444f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan ExecutionContext &exe_ctx, 445f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const SymbolContext &sym_ctx, 446f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan const char *name, 447f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser type, 448f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t addr, 449f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error &err) 450f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{ 451f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 452f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 453f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Variable *var = FindVariableInScope(sym_ctx, name, &type); 454f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 455f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!var) 456f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 457f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name); 458f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 459f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 460f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 461841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (log) 462841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name, type.GetOpaqueQualType()); 463f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 464f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx, 465f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan var, 466f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan type.GetASTContext())); 467f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 468f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (!location_value.get()) 469f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 470f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("Couldn't get value for %s", name); 471f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 472f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 473f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 474f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (location_value->GetValueType() == Value::eValueTypeLoadAddress) 475f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 476f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t value_addr = location_value->GetScalar().ULongLong(); 477f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 478960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton size_t bit_size = ClangASTType::GetClangTypeBitWidth(type.GetASTContext(), type.GetOpaqueQualType()); 479f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan size_t byte_size = bit_size % 8 ? ((bit_size + 8) / 8) : (bit_size / 8); 480f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 481f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan DataBufferHeap data; 482f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan data.SetByteSize(byte_size); 483f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 484f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t src_addr; 485f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan lldb::addr_t dest_addr; 486f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 487f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (dematerialize) 488f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 489f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan src_addr = addr; 490f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan dest_addr = value_addr; 491f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 492f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan else 493f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 494f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan src_addr = value_addr; 495f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan dest_addr = addr; 496f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 497f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 498f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan Error error; 499f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), byte_size, error) != byte_size) 500f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 501f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString()); 502f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 503f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 504f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 505f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), byte_size, error) != byte_size) 506f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 507f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString()); 508f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return false; 509f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 510f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 511f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (log) 512f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr); 513f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 514f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan else 515f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 516f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan StreamString ss; 517f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 518f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan location_value->Dump(&ss); 519f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 520f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name, ss.GetString().c_str()); 521f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 522f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 523f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan return true; 524810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan} 525810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 526336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananVariable* 527336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::FindVariableInScope(const SymbolContext &sym_ctx, 528336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan const char *name, 529f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *type) 530810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{ 531810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 532810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 533810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Function *function(m_sym_ctx->function); 534810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Block *block(m_sym_ctx->block); 535810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 536810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!function || !block) 537810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 538810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 539810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("function = %p, block = %p", function, block); 540336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 541810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 542810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 543810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan BlockList& blocks(function->GetBlocks(true)); 544810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 545336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan ConstString name_cs(name); 546336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 547810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::user_id_t current_block_id; 548810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 549810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan for (current_block_id = block->GetID(); 550810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan current_block_id != Block::InvalidID; 551810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan current_block_id = blocks.GetParent(current_block_id)) 552810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 553810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan Block *current_block(blocks.GetBlockByID(current_block_id)); 554810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 555810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan lldb::VariableListSP var_list = current_block->GetVariableList(false, true); 556810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 557810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!var_list) 558810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 559810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 560336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableSP var = var_list->FindVariable(name_cs); 561810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 562810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (!var) 563810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 564810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 565810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // var->GetType()->GetClangAST() is the program's AST context and holds 566810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // var->GetType()->GetOpaqueClangQualType(). 567810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 568810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // type is m_type for one of the struct members, which was added by 569810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // AddValueToStruct. That type was extracted from the AST context of 570810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // the compiler in IRForTarget. The original for the type was copied 571810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan // out of the program's AST context by AddOneVariable. 572810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 573336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // So that we can compare these two without having to copy back 574336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // something we already had in the original AST context, we maintain 575336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // m_orig_type and m_ast_context (which are passed into 576336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan // MaterializeOneVariable by Materialize) for each variable. 577336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 578336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!type) 579336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 580810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 581f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (type->GetASTContext() == var->GetType()->GetClangAST()) 582810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 583f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var->GetType()->GetOpaqueClangQualType())) 584810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 585810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 586810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan else 587810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan { 588810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 589810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 590810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan continue; 591810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan } 592810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 593336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 594336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 595336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 596336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 597336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan CompileUnit *compile_unit = m_sym_ctx->comp_unit; 598336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 599336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!compile_unit) 600336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 601336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 602336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("compile_unit = %p", compile_unit); 603336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 604336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 605336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 606336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableListSP var_list = compile_unit->GetVariableList(true); 607336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 608336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var_list) 609336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 610336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 611336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan lldb::VariableSP var = var_list->FindVariable(name_cs); 612336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 613336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var) 614336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 615336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 616336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!type) 617336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 618336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 619f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (type->GetASTContext() == var->GetType()->GetClangAST()) 620336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 621841026fc8d1cc22bd3b9e74623b413a3e6aa9d38Sean Callanan if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetOpaqueQualType(), var->GetType()->GetOpaqueClangQualType())) 622336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 623336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 624336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 625336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan { 626336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (log) 627336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->PutCString("Skipping a candidate variable because of different AST contexts"); 628336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 629336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 630336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 631336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var.get(); 632336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan } 633336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 634336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 635336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 636336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetDecls(NameSearchContext &context, 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name) 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6426184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 6436184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 644810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 645810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Hunting for a definition for %s", name); 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Back out in all cases where we're not fully initialized 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_exe_ctx || !m_exe_ctx->frame || !m_sym_ctx) 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Function *function = m_sym_ctx->function; 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 653336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!function) 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 655810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 656336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan log->Printf("Can't evaluate an expression when not in a function"); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString name_cs(name); 6610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan SymbolContextList sym_ctxs; 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan m_sym_ctx->FindFunctionsByName(name_cs, false, sym_ctxs); 6640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 6650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan for (uint32_t index = 0, num_indices = sym_ctxs.GetSize(); 6660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan index < num_indices; 6670fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan ++index) 6680fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 6690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan SymbolContext sym_ctx; 6700fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan sym_ctxs.GetContextAtIndex(index, sym_ctx); 6710fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 6720fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (sym_ctx.function) 6730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan AddOneFunction(context, sym_ctx.function, NULL); 6740fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if(sym_ctx.symbol) 6750fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan AddOneFunction(context, NULL, sym_ctx.symbol); 6760fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 6778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 678336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var = FindVariableInScope(*m_sym_ctx, name); 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 680336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (var) 681336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan AddOneVariable(context, var); 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 683336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 684336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue * 685336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::GetVariableValue(ExecutionContext &exe_ctx, 686336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable *var, 687f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan clang::ASTContext *parser_ast_context, 688f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser *user_type, 689f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser *parser_type) 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6916184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 6926184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Type *var_type = var->GetType(); 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_type) 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 697810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 698810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no type"); 699336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void *var_opaque_type = var_type->GetOpaqueClangQualType(); 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_opaque_type) 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 706810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 707810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because it has no Clang type"); 708336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TypeList *type_list = var_type->GetTypeList(); 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!type_list) 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 715810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 716810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("Skipped a definition because the type has no associated type list"); 717336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext(); 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!exe_ast_ctx) 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 724810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 725810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->PutCString("There is no AST context for the current execution context"); 726336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 729336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan DWARFExpression &var_location_expr = var->LocationExpression(); 730336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::auto_ptr<Value> var_location(new Value); 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error err; 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 735336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, *var_location.get(), &err)) 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 737810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 738810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan log->Printf("Error evaluating location: %s", err.AsCString()); 739336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 742810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext(); 743810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan 744336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan void *type_to_use; 745336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 746f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_ast_context) 747f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan { 748f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan type_to_use = ClangASTContext::CopyType(parser_ast_context, var_ast_context, var_opaque_type); 749f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan 750f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (parser_type) 751f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *parser_type = TypeFromParser(type_to_use, parser_ast_context); 752f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan } 753336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan else 754336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan type_to_use = var_opaque_type; 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetContextType() == Value::eContextTypeInvalid) 757336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var_location.get()->SetContext(Value::eContextTypeOpaqueClangQualType, type_to_use); 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress) 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext var_sc; 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var->CalculateSymbolContext(&var_sc); 763336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!var_sc.module_sp) 765336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *object_file = var_sc.module_sp->GetObjectFile(); 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!object_file) 770336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return NULL; 771336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList()); 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t load_addr = so_addr.GetLoadAddress(m_exe_ctx->process); 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->GetScalar() = load_addr; 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner var_location->SetValueType(Value::eValueTypeLoadAddress); 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 780f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan if (user_type) 781f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan *user_type = TypeFromUser(var_opaque_type, var_ast_context); 782336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 783336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan return var_location.release(); 784336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan} 785336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 786336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid 787336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context, 788336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Variable* var) 789336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{ 790336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 791336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 792f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromUser ut; 793f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan TypeFromParser pt; 794336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 795336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan Value *var_location = GetVariableValue(*m_exe_ctx, 796336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan var, 797336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan context.GetASTContext(), 798f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan &ut, 799f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan &pt); 800336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan 8011674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton NamedDecl *var_decl = context.AddVarDecl(pt.GetOpaqueQualType()); 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Tuple tuple; 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 805810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_decl = var_decl; 806336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan tuple.m_value = var_location; 807f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_user_type = ut; 808f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_parser_type = pt; 80902fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan tuple.m_llvm_value = NULL; 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_tuples.push_back(tuple); 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 813810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 814f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan log->Printf("Found variable %s, returned (NamedDecl)%p", context.Name.getAsString().c_str(), var_decl); 8158f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan} 8168f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8178f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid 8188f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context, 8190fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Function* fun, 8200fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Symbol* symbol) 8218f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{ 8226184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 8238f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan NamedDecl *fun_decl; 8250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan std::auto_ptr<Value> fun_location(new Value); 8260fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan const Address *fun_address; 8278f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8280fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan // only valid for Functions, not for Symbols 8290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *fun_opaque_type = NULL; 8300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan clang::ASTContext *fun_ast_context = NULL; 8318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8320fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (fun) 8330fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 8340fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan Type *fun_type = fun->GetType(); 8350fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8360fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_type) 8370fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 8380fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 8390fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no type"); 8400fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 8410fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 8420fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8430fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_opaque_type = fun_type->GetOpaqueClangQualType(); 8440fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8450fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (!fun_opaque_type) 8460fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 8470fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan if (log) 8480fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("Skipped a function because it has no Clang type"); 8490fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan return; 8500fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 8510fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8520fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &fun->GetAddressRange().GetBaseAddress(); 8530fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8540fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan TypeList *type_list = fun_type->GetTypeList(); 8550fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_ast_context = type_list->GetClangASTContext().getASTContext(); 8560fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type); 8570fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8580fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddFunDecl(copied_type); 8590fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 8600fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else if (symbol) 8610fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan { 8620fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_address = &symbol->GetAddressRangeRef().GetBaseAddress(); 8630fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan 8640fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan fun_decl = context.AddGenericFunDecl(); 8650fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan } 8660fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan else 8678f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan { 868810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 8690fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan log->PutCString("AddOneFunction called with no function and no symbol"); 8708f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan return; 8718f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan } 8728f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan lldb::addr_t load_addr = fun_address->GetLoadAddress(m_exe_ctx->process); 8748f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->SetValueType(Value::eValueTypeLoadAddress); 8758f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan fun_location->GetScalar() = load_addr; 8768f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan Tuple tuple; 8788f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 879810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_decl = fun_decl; 880810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan tuple.m_value = fun_location.release(); 881f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan tuple.m_user_type = TypeFromUser(fun_opaque_type, fun_ast_context); 88202fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callanan tuple.m_llvm_value = NULL; 8838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 8848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan m_tuples.push_back(tuple); 8858f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan 886810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan if (log) 887f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan log->Printf("Found function %s, returned (NamedDecl)%p", context.Name.getAsString().c_str(), fun_decl); 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 889