ClangExpressionDeclMap.cpp revision f328c9ffe0bb00f48601027ec86dbdf238b42c2a
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangExpressionDeclMap.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
18810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h"
196184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
31f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
32810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
34f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::ClangExpressionDeclMap(ExecutionContext *exe_ctx) :
408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_exe_ctx(exe_ctx),
41810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    m_struct_laid_out(false),
42810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    m_materialized_location(0)
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (exe_ctx && exe_ctx->frame)
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_sym_ctx = new SymbolContext(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything));
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_sym_ctx = NULL;
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_tuples = m_tuples.size ();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t tuple_index;
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (tuple_index = 0; tuple_index < num_tuples; ++tuple_index)
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        delete m_tuples[tuple_index].m_value;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_sym_ctx)
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        delete m_sym_ctx;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetIndexForDecl (uint32_t &index,
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                         const clang::Decl *decl)
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_tuples = m_tuples.size ();
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t tuple_index;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (tuple_index = 0; tuple_index < num_tuples; ++tuple_index)
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_tuples[tuple_index].m_decl == decl)
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            index = tuple_index;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::AddValueToStruct (llvm::Value *value,
858bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          const clang::NamedDecl *decl,
86810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                                          std::string &name,
87f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                          void *parser_type,
88f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                          clang::ASTContext *parser_ast_context,
898bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          size_t size,
908bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          off_t alignment)
918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_laid_out = false;
938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    StructMemberIterator iter;
958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    for (iter = m_members.begin();
978bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan         iter != m_members.end();
988bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan         ++iter)
998bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
1008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        if (iter->m_decl == decl)
1018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan            return true;
1028bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
1038bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    StructMember member;
1058bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
106f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    member.m_value          = value;
107f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    member.m_decl           = decl;
108f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    member.m_name           = name;
109f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    member.m_parser_type    = TypeFromParser(parser_type, parser_ast_context);
110f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    member.m_offset         = 0;
111f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    member.m_size           = size;
112f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    member.m_alignment      = alignment;
1138bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1148bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_members.push_back(member);
1158bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1168bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
1178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
1188bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1198bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
1218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
1228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (m_struct_laid_out)
1238bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
1248bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1258bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    StructMemberIterator iter;
1268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    off_t cursor = 0;
1288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_alignment = 0;
1308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_size = 0;
1318bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1328bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    for (iter = m_members.begin();
1338bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan         iter != m_members.end();
1348bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan         ++iter)
1358bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    {
1368bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        if (iter == m_members.begin())
1378bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan            m_struct_alignment = iter->m_alignment;
1388bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        if (cursor % iter->m_alignment)
1408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan            cursor += (iter->m_alignment - (cursor % iter->m_alignment));
1418bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1428bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        iter->m_offset = cursor;
1438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        cursor += iter->m_size;
1448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    }
1458bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_size = cursor;
1478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    m_struct_laid_out = true;
1498bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
1508bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
1518bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1528bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool ClangExpressionDeclMap::GetStructInfo (uint32_t &num_elements,
1538bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                            size_t &size,
1548bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                            off_t &alignment)
1558bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
1568bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (!m_struct_laid_out)
1578bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
1588bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    num_elements = m_members.size();
1608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    size = m_struct_size;
1618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    alignment = m_struct_alignment;
1628bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1638bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
1648bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
1658bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::GetStructElement (const clang::NamedDecl *&decl,
1688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          llvm::Value *&value,
1698bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          off_t &offset,
1708bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan                                          uint32_t index)
1718bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
1728bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (!m_struct_laid_out)
1738bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
1748bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1758bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    if (index >= m_members.size())
1768bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
1778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1788bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    decl = m_members[index].m_decl;
1798bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    value = m_members[index].m_value;
1808bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    offset = m_members[index].m_offset;
1818bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
1828bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
1838bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
1848bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for DwarfExpression
186f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananlldb_private::Value
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner*ClangExpressionDeclMap::GetValueForIndex (uint32_t index)
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (index >= m_tuples.size ())
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_tuples[index].m_value;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan// Interface for CommandObjectExpression
196f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
197f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
198f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::Materialize (ExecutionContext *exe_ctx,
199f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                     lldb::addr_t &struct_address,
200f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                     Error &err)
201f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
202f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    bool result = DoMaterialize(false, exe_ctx, NULL, err);
203f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
204f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (result)
205f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        struct_address = m_materialized_location;
206f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
207f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return result;
208f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
209f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
210f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
211f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::Dematerialize (ExecutionContext *exe_ctx,
212f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                       lldb_private::Value &result_value,
213f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                       Error &err)
214f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
215f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return DoMaterialize(true, exe_ctx, &result_value, err);
216f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
217f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
218f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
219f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterialize (bool dematerialize,
220f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                       ExecutionContext *exe_ctx,
221f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                       lldb_private::Value *result_value,
222f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                       Error &err)
223810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
224336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
225336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
226810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (!m_struct_laid_out)
227810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
228810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Structure hasn't been laid out yet");
229810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
230810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
231810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
232810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (!exe_ctx)
233810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
234810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        err.SetErrorString("Received null execution context");
235810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        return LLDB_INVALID_ADDRESS;
236810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
237810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
238810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    const SymbolContext &sym_ctx(exe_ctx->frame->GetSymbolContext(lldb::eSymbolContextEverything));
239810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
240f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!dematerialize)
241f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
242f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (m_materialized_location)
243f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
244f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            exe_ctx->process->DeallocateMemory(m_materialized_location);
245f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            m_materialized_location = 0;
246f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
247810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
248f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t mem = exe_ctx->process->AllocateMemory(m_struct_alignment + m_struct_size,
249f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                            lldb::ePermissionsReadable | lldb::ePermissionsWritable,
250f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                            err);
251f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
252f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (mem == LLDB_INVALID_ADDRESS)
253f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
254f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
255f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        m_allocated_area = mem;
256f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
257810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
258f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    m_materialized_location = m_allocated_area;
259810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
260f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (m_materialized_location % m_struct_alignment)
261810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
262f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        m_materialized_location += (m_struct_alignment - (m_materialized_location % m_struct_alignment));
263810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
264f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
265f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    StructMemberIterator iter;
266810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
267810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    for (iter = m_members.begin();
268810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan         iter != m_members.end();
269810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan         ++iter)
270810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
271810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        uint32_t tuple_index;
272810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
273336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        if (!GetIndexForDecl(tuple_index, iter->m_decl))
274336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
275336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            if (iter->m_name.find("___clang_expr_result") == std::string::npos)
276336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            {
277336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                err.SetErrorStringWithFormat("Unexpected variable %s", iter->m_name.c_str());
278336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                return false;
279336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            }
280336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
281336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            if (log)
282336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                log->Printf("Found special result variable %s", iter->m_name.c_str());
283336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
284f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            if (dematerialize)
285f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            {
286f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                clang::ASTContext *context(exe_ctx->target->GetScratchClangASTContext()->getASTContext());
287f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
288f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                if (!context)
289f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                {
290f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                    err.SetErrorString("Couldn't find a scratch AST context to put the result type into");
291f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                }
292f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
293f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                TypeFromUser copied_type(ClangASTContext::CopyType(context,
294f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                   iter->m_parser_type.GetASTContext(),
295f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                   iter->m_parser_type.GetType()),
296f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                         context);
297f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
298f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                result_value->SetContext(Value::eContextTypeOpaqueClangQualType, copied_type.GetType());
299f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            }
300f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
301810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            continue;
302336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        }
303810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
304810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        Tuple &tuple(m_tuples[tuple_index]);
305810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
306f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (!DoMaterializeOneVariable(dematerialize, *exe_ctx, sym_ctx, iter->m_name.c_str(), tuple.m_user_type, m_materialized_location + iter->m_offset, err))
307336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return false;
308810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
309810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
310f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
311f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan}
312f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
313f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callananbool
314f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean CallananClangExpressionDeclMap::DoMaterializeOneVariable(bool dematerialize,
315f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 ExecutionContext &exe_ctx,
316f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 const SymbolContext &sym_ctx,
317f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 const char *name,
318f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 TypeFromUser type,
319f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 lldb::addr_t addr,
320f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                 Error &err)
321f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan{
322f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
323f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
324f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    Variable *var = FindVariableInScope(sym_ctx, name, &type);
325f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
326f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!var)
327f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
328f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        err.SetErrorStringWithFormat("Couldn't find %s with appropriate type", name);
329f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
330f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
331f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
332f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    log->Printf("%s %s with type %p", (dematerialize ? "Dematerializing" : "Materializing"), name, type.GetType());
333f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
334f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    std::auto_ptr<lldb_private::Value> location_value(GetVariableValue(exe_ctx,
335f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                       var,
336f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                                                       type.GetASTContext()));
337f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
338f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (!location_value.get())
339f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
340f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        err.SetErrorStringWithFormat("Couldn't get value for %s", name);
341f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        return false;
342f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
343f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
344f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (location_value->GetValueType() == Value::eValueTypeLoadAddress)
345f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
346f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t value_addr = location_value->GetScalar().ULongLong();
347f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
348f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        size_t bit_size = ClangASTContext::GetTypeBitSize(type.GetASTContext(), type.GetType());
349f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        size_t byte_size = bit_size % 8 ? ((bit_size + 8) / 8) : (bit_size / 8);
350f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
351f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        DataBufferHeap data;
352f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        data.SetByteSize(byte_size);
353f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
354f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t src_addr;
355f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        lldb::addr_t dest_addr;
356f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
357f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (dematerialize)
358f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
359f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            src_addr = addr;
360f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            dest_addr = value_addr;
361f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
362f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        else
363f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
364f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            src_addr = value_addr;
365f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            dest_addr = addr;
366f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
367f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
368f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        Error error;
369f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (exe_ctx.process->ReadMemory (src_addr, data.GetBytes(), byte_size, error) != byte_size)
370f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
371f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            err.SetErrorStringWithFormat ("Couldn't read a composite type from the target: %s", error.AsCString());
372f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
373f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
374f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
375f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (exe_ctx.process->WriteMemory (dest_addr, data.GetBytes(), byte_size, error) != byte_size)
376f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        {
377f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            err.SetErrorStringWithFormat ("Couldn't write a composite type to the target: %s", error.AsCString());
378f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            return false;
379f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        }
380f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
381f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (log)
382f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            log->Printf("Copied from 0x%llx to 0x%llx", (uint64_t)src_addr, (uint64_t)addr);
383f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
384f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    else
385f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
386f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        StreamString ss;
387f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
388f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        location_value->Dump(&ss);
389f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
390f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        err.SetErrorStringWithFormat("%s has a value of unhandled type: %s", name, ss.GetString().c_str());
391f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
392f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
393f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    return true;
394810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan}
395810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
396336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananVariable*
397336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::FindVariableInScope(const SymbolContext &sym_ctx,
398336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                            const char *name,
399f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                            TypeFromUser *type)
400810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan{
401810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
402810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
403810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    Function *function(m_sym_ctx->function);
404810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    Block *block(m_sym_ctx->block);
405810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
406810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (!function || !block)
407810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
408810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
409810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("function = %p, block = %p", function, block);
410336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
411810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    }
412810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
413810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    BlockList& blocks(function->GetBlocks(true));
414810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
415336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    ConstString name_cs(name);
416336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
417810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    lldb::user_id_t current_block_id;
418810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
419810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    for (current_block_id = block->GetID();
420810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan         current_block_id != Block::InvalidID;
421810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan         current_block_id = blocks.GetParent(current_block_id))
422810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    {
423810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        Block *current_block(blocks.GetBlockByID(current_block_id));
424810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
425810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        lldb::VariableListSP var_list = current_block->GetVariableList(false, true);
426810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
427810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (!var_list)
428810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            continue;
429810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
430336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        lldb::VariableSP var = var_list->FindVariable(name_cs);
431810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
432810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (!var)
433810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            continue;
434810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
435810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        // var->GetType()->GetClangAST() is the program's AST context and holds
436810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        // var->GetType()->GetOpaqueClangQualType().
437810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
438810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        // type is m_type for one of the struct members, which was added by
439810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        // AddValueToStruct.  That type was extracted from the AST context of
440810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        // the compiler in IRForTarget.  The original for the type was copied
441810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        // out of the program's AST context by AddOneVariable.
442810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
443336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        // So that we can compare these two without having to copy back
444336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        // something we already had in the original AST context, we maintain
445336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        // m_orig_type and m_ast_context (which are passed into
446336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        // MaterializeOneVariable by Materialize) for each variable.
447336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
448336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        if (!type)
449336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return var.get();
450810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
451f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (type->GetASTContext() == var->GetType()->GetClangAST())
452810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        {
453f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type, var->GetType()->GetOpaqueClangQualType()))
454810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                continue;
455810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        }
456810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        else
457810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        {
458810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            if (log)
459810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan                log->PutCString("Skipping a candidate variable because of different AST contexts");
460810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            continue;
461810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        }
462810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
463336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return var.get();
464336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    }
465336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
466336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    {
467336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        CompileUnit *compile_unit = m_sym_ctx->comp_unit;
468336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
469336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        if (!compile_unit)
470336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
471336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            if (log)
472336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                log->Printf("compile_unit = %p", compile_unit);
473336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
474336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        }
475336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
476336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        lldb::VariableListSP var_list = compile_unit->GetVariableList(true);
477336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
478336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        if (!var_list)
479336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
480336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
481336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        lldb::VariableSP var = var_list->FindVariable(name_cs);
482336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
483336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        if (!var)
484336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
485336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
486336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        if (!type)
487336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return var.get();
488336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
489f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (type->GetASTContext() == var->GetType()->GetClangAST())
490336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
491f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            if (!ClangASTContext::AreTypesSame(type->GetASTContext(), type->GetType(), var->GetType()->GetOpaqueClangQualType()))
492336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                return NULL;
493336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        }
494336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        else
495336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        {
496336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            if (log)
497336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                log->PutCString("Skipping a candidate variable because of different AST contexts");
498336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
499336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        }
500336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
501336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return var.get();
502336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    }
503336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
504336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return NULL;
505336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
506336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::GetDecls(NameSearchContext &context,
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const char *name)
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5126184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
5136184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
514810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
515810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        log->Printf("Hunting for a definition for %s", name);
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Back out in all cases where we're not fully initialized
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!m_exe_ctx || !m_exe_ctx->frame || !m_sym_ctx)
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Function *function = m_sym_ctx->function;
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
523336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    if (!function)
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
525810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
526336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            log->Printf("Can't evaluate an expression when not in a function");
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ConstString name_cs(name);
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5328f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    Function *fn = m_sym_ctx->FindFunctionByName(name_cs.GetCString());
5338f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
5348f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    if (fn)
5358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        AddOneFunction(context, fn);
536336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
537336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Variable *var = FindVariableInScope(*m_sym_ctx, name);
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
539336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    if (var)
540336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        AddOneVariable(context, var);
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
542336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
543336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananValue *
544336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::GetVariableValue(ExecutionContext &exe_ctx,
545336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                         Variable *var,
546f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                         clang::ASTContext *parser_ast_context,
547f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                         TypeFromUser *user_type,
548f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                         TypeFromParser *parser_type)
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5506184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
5516184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
556810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
557810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
558336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void *var_opaque_type = var_type->GetOpaqueClangQualType();
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_opaque_type)
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
565810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
566810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
567336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TypeList *type_list = var_type->GetTypeList();
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!type_list)
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
574810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
575810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because the type has no associated type list");
576336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    clang::ASTContext *exe_ast_ctx = type_list->GetClangASTContext().getASTContext();
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!exe_ast_ctx)
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
583810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
584810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
585336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
588336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
589336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<Value> var_location(new Value);
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
594336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    if (!var_location_expr.Evaluate(&exe_ctx, exe_ast_ctx, NULL, *var_location.get(), &err))
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
596810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
597810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->Printf("Error evaluating location: %s", err.AsCString());
598336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        return NULL;
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
601810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    clang::ASTContext *var_ast_context = type_list->GetClangASTContext().getASTContext();
602810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan
603336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    void *type_to_use;
604336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
605f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (parser_ast_context)
606f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
607f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        type_to_use = ClangASTContext::CopyType(parser_ast_context, var_ast_context, var_opaque_type);
608f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan
609f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        if (parser_type)
610f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan            *parser_type = TypeFromParser(type_to_use, parser_ast_context);
611f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
612336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    else
613336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        type_to_use = var_opaque_type;
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetContextType() == Value::eContextTypeInvalid)
616336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan        var_location.get()->SetContext(Value::eContextTypeOpaqueClangQualType, type_to_use);
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (var_location.get()->GetValueType() == Value::eValueTypeFileAddress)
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
622336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
624336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *object_file = var_sc.module_sp->GetObjectFile();
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!object_file)
629336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan            return NULL;
630336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Address so_addr(var_location->GetScalar().ULongLong(), object_file->GetSectionList());
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t load_addr = so_addr.GetLoadAddress(m_exe_ctx->process);
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->GetScalar() = load_addr;
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var_location->SetValueType(Value::eValueTypeLoadAddress);
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
639f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
640f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan        *user_type = TypeFromUser(var_opaque_type, var_ast_context);
641336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
642336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    return var_location.release();
643336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
644336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
645336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
646336a0002b94c7f23573ec613c4d4ac89a67fd299Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
647336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                       Variable* var)
648336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
649336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
650336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
651f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
652f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
653336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
654336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    Value *var_location = GetVariableValue(*m_exe_ctx,
655336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                           var,
656336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan                                           context.GetASTContext(),
657f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                           &ut,
658f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan                                           &pt);
659336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
660f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    NamedDecl *var_decl = context.AddVarDecl(pt.GetType());
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Tuple tuple;
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
664810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    tuple.m_decl        = var_decl;
665336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    tuple.m_value       = var_location;
666f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    tuple.m_user_type   = ut;
667f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    tuple.m_parser_type = pt;
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_tuples.push_back(tuple);
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
671810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
672810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        log->PutCString("Found variable");
6738f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
6748f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
6758f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
6768f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean CallananClangExpressionDeclMap::AddOneFunction(NameSearchContext &context,
6778f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan                                       Function* fun)
6788f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
6796184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
6806184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
6818f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    Type *fun_type = fun->GetType();
6828f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
6838f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    if (!fun_type)
6848f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
685810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
686810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a function because it has no type");
6878f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
6888f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
6898f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
6908f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    void *fun_opaque_type = fun_type->GetOpaqueClangQualType();
6918f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
6928f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    if (!fun_opaque_type)
6938f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
694810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
695810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a function because it has no Clang type");
6968f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
6978f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
6988f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
6998f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    std::auto_ptr<Value> fun_location(new Value);
7008f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
7018f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    const Address &fun_address = fun->GetAddressRange().GetBaseAddress();
7028f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    lldb::addr_t load_addr = fun_address.GetLoadAddress(m_exe_ctx->process);
7038f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->SetValueType(Value::eValueTypeLoadAddress);
7048f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    fun_location->GetScalar() = load_addr;
7058f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
7068f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    TypeList *type_list = fun_type->GetTypeList();
707810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    clang::ASTContext *fun_ast_context = type_list->GetClangASTContext().getASTContext();
708810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    void *copied_type = ClangASTContext::CopyType(context.GetASTContext(), fun_ast_context, fun_opaque_type);
7098f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
7108f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    NamedDecl *fun_decl = context.AddFunDecl(copied_type);
7118f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
7128f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    Tuple tuple;
7138f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
714810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    tuple.m_decl        = fun_decl;
715810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    tuple.m_value       = fun_location.release();
716f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    tuple.m_user_type   = TypeFromUser(fun_opaque_type, fun_ast_context);
7178f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
7188f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    m_tuples.push_back(tuple);
7198f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
720810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
721810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        log->PutCString("Found function");
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
723