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