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