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
1606dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan#include "clang/AST/ASTContext.h"
1747a5c4c01066ece2d41cba56c3a065eeca12d47cSean Callanan#include "clang/AST/DeclarationName.h"
18a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan#include "clang/AST/Decl.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
21810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Core/Error.h"
226184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan#include "lldb/Core/Log.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
24061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h"
2505a5a1bcbed5c0f31fed29153bb2912d71836e91Sean Callanan#include "lldb/Core/ValueObjectConstResult.h"
26f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan#include "lldb/Core/ValueObjectVariable.h"
276e74dbb2e10a1119f6f7c3b59efbe43c6426658aSean Callanan#include "lldb/Expression/ASTDumper.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Expression/ClangASTSource.h"
29a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan#include "lldb/Expression/ClangPersistentVariables.h"
303b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan#include "lldb/Expression/Materializer.h"
31cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ClangASTContext.h"
336916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/CompileUnit.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Function.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan#include "lldb/Symbol/SymbolVendor.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Type.h"
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/TypeList.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/Variable.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h"
43f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/ExecutionContext.h"
44d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan#include "lldb/Target/ObjCLanguageRuntime.h"
45810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan#include "lldb/Target/Process.h"
4617c6a05cb96f7110332342326a90692d9505982eSean Callanan#include "lldb/Target/RegisterContext.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
48f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan#include "lldb/Target/Target.h"
4978b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham#include "lldb/Target/Thread.h"
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
513bc52d0a96c18be384028a90914f534ac252fbe4Greg Claytonusing namespace lldb;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5573b520f4f60dca58e58e446c9504d45384ee677bSean CallananClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
5673b520f4f60dca58e58e446c9504d45384ee677bSean Callanan    ClangASTSource (exe_ctx.GetTargetSP()),
578de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_found_entities (),
588de27c761a22187ef63fb60000894be163e7285fGreg Clayton    m_struct_members (),
59dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_keep_result_in_memory (keep_result_in_memory),
60aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_parser_vars (),
61dbeb3e1e038a75f00fd565203839020e1d00a7c6Stephen Wilson    m_struct_vars ()
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
63aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableStructVars();
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangExpressionDeclMap::~ClangExpressionDeclMap()
67aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
686d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    // Note: The model is now that the parser's AST context and all associated
696d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   data does not vanish until the expression has been executed.  This means
706d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    //   that valuable lookup data (like namespaces) doesn't vanish, but
716d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan
726d284ef56532873d669f8edd4b40031407f0ffe4Sean Callanan    DidParse();
73aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    DisableStructVars();
74aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
75aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
76166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callananbool
773b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean CallananClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx,
783b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan                                  Materializer *materializer)
796741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan{
806741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan    ClangASTMetrics::ClearLocalCounters();
816741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan
82aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    EnableParserVars();
83dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    m_parser_vars->m_exe_ctx = exe_ctx;
84567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
85567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = exe_ctx.GetTargetPtr();
86567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (exe_ctx.GetFramePtr())
87567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
8876580088fc836397fa6e7336535d1b216c93fe7eSean Callanan    else if (exe_ctx.GetThreadPtr() && exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0))
89567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
90567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (exe_ctx.GetProcessPtr())
91987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
92a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton        m_parser_vars->m_sym_ctx.Clear(true);
93567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
94987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
95567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    else if (target)
96987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    {
97a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton        m_parser_vars->m_sym_ctx.Clear(true);
98567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
99987c7ebe1daa425ba7abfa9643800e3237146fc0Greg Clayton    }
10097ad47fbfaee942dd16f081d30ad1b16340f339fSean Callanan
101567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target)
102567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
103567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
104166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
105567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (!target->GetScratchClangASTContext())
106567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            return false;
107567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
108166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan
10947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    m_parser_vars->m_target_info = GetTargetInfo();
1103b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan    m_parser_vars->m_materializer = materializer;
11147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
112166ba106f9d8c377f2fda72112c821550d2e82d1Sean Callanan    return true;
113aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan}
114c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan
1153b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callananvoid
116427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::DidParse()
117aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan{
118952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1196741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan
1206741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan    if (log)
1216741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan        ClangASTMetrics::DumpCounters(log);
1226741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan
123aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_parser_vars.get())
124aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    {
125427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
126aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             entity_index < num_entities;
127aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++entity_index)
128aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
129427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
1306f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            if (var_sp)
13131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                var_sp->DisableParserVars(GetParserID());
132aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
133aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
134427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
135aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             pvar_index < num_pvars;
136aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan             ++pvar_index)
137aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        {
138427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
139427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            if (pvar_sp)
14031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan                pvar_sp->DisableParserVars(GetParserID());
141aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        }
142aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
143aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan        DisableParserVars();
1447a60b9403bb7c24f907f3269d246fb04971ecb8bSean Callanan    }
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan// Interface for IRForTarget
1488bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
14947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::TargetInfo
15047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::GetTargetInfo()
15147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
15247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    assert (m_parser_vars.get());
15347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
15447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TargetInfo ret;
15547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
156dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
157dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
158dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Process *process = exe_ctx.GetProcessPtr();
159dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (process)
16047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
161dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        ret.byte_order = process->GetByteOrder();
162dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        ret.address_byte_size = process->GetAddressByteSize();
163dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    }
164dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    else
165dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    {
166dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        Target *target = exe_ctx.GetTargetPtr();
167dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        if (target)
168567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        {
169dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            ret.byte_order = target->GetArchitecture().GetByteOrder();
170dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
171567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        }
17247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
173dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan
17447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return ret;
17547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
17647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1778bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
1788de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddPersistentVariable
1798de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
1809b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
1818de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
1826a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    TypeFromParser parser_type,
1836a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_result,
1846a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    bool is_lvalue
1858de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
186a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
187aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
188aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1890f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan    if (m_parser_vars->m_materializer && is_result)
1900f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan    {
1910f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        Error err;
1920f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
1930f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
1940f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        Target *target = exe_ctx.GetTargetPtr();
1950f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        if (target == NULL)
1960f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan            return false;
1970f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
1980f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
1990f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2000f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        TypeFromUser user_type(m_ast_importer->DeportType(context,
2010f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan                                                          parser_type.GetASTContext(),
2020f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan                                                          parser_type.GetOpaqueQualType()),
2030f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan                               context);
2040f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2050f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(user_type, is_lvalue, m_keep_result_in_memory, err);
2060f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
207a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan        ClangExpressionVariableSP var_sp = m_found_entities.CreateVariable(exe_ctx.GetBestExecutionContextScope(),
208a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan                                                                           name,
209a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan                                                                           user_type,
210a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan                                                                           m_parser_vars->m_target_info.byte_order,
211a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan                                                                           m_parser_vars->m_target_info.address_byte_size);
2120f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2130f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        if (!var_sp)
2140f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan            return false;
2150f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2160f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        var_sp->EnableParserVars(GetParserID());
2170f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2180f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
2190f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2200f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        parser_vars->m_named_decl = decl;
2210f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        parser_vars->m_parser_type = parser_type;
2220f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2230f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        var_sp->EnableJITVars(GetParserID());
2240f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2250f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
2260f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2270f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        jit_vars->m_offset = offset;
2280f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
2290f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        return true;
2300f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan    }
2310f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
232952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
233dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
234dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
235567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
236567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return false;
237567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
238567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
239a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
2400539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan    TypeFromUser user_type(m_ast_importer->DeportType(context,
2410539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan                                                      parser_type.GetASTContext(),
2420539a80ae9cdb243d1db3cfd34b504b391658703Sean Callanan                                                      parser_type.GetOpaqueQualType()),
24397678d17ac9bcb66f7092178109271991ab16533Sean Callanan                           context);
2445a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan
2455a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    if (!user_type.GetOpaqueQualType())
2465a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    {
2475a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        if (log)
2485a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            log->Printf("Persistent variable's type wasn't copied successfully");
2495a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        return false;
2505a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan    }
25147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
25247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (!m_parser_vars->m_target_info.IsValid())
25347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        return false;
254a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
255a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan    ClangExpressionVariableSP var_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
256a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan                                                                                                   name,
257a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan                                                                                                   user_type,
258a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan                                                                                                   m_parser_vars->m_target_info.byte_order,
259a9aab24fcb95392c23144348f6c2e0a2b318f421Sean Callanan                                                                                                   m_parser_vars->m_target_info.address_byte_size);
2608c12720c108cd5e7ed792596749218d8400f647eSean Callanan
261427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
2628c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
2638c12720c108cd5e7ed792596749218d8400f647eSean Callanan
264bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan    var_sp->m_frozen_sp->SetHasCompleteType();
265bf346eb7d6ed91a1696d5659dec1bf16302a89ceSean Callanan
2666a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_result)
2676a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
2686a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
2696a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
2706a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
2716a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (is_lvalue)
2726a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
2736a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
2746a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
2756a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    else
2766a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    {
2776a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
2786a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
2796a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    }
2806a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
281f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan    if (m_keep_result_in_memory)
282f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan    {
283f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan        var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
284f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan    }
285f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan
2866a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan    if (log)
2876a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan        log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
2886a92553d2cc2b7a3b853fcb6da101583435c2dc0Sean Callanan
28931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    var_sp->EnableParserVars(GetParserID());
29031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
29131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
2928c12720c108cd5e7ed792596749218d8400f647eSean Callanan
29331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl = decl;
29431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = parser_type;
2958c12720c108cd5e7ed792596749218d8400f647eSean Callanan
2968c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
297a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
298a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
299a48fe1637ec6a381e500633c087f76662e364c20Sean Callananbool
3008de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::AddValueToStruct
3018de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
3029b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
3038de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
3048de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *value,
3058de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t size,
3068de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t alignment
3078de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
3088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
309aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
310aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
311aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
3129d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan    bool is_persistent_variable = false;
3139d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan
314952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
31545690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
316aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = false;
3178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
31831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    if (m_struct_members.GetVariable(decl, GetParserID()))
3198c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return true;
3208bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
32131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID()));
3228c12720c108cd5e7ed792596749218d8400f647eSean Callanan
323427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
3249d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan    {
32531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID());
3269d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan        is_persistent_variable = true;
3279d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan    }
3288c12720c108cd5e7ed792596749218d8400f647eSean Callanan
329427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!var_sp)
3308c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
3318c12720c108cd5e7ed792596749218d8400f647eSean Callanan
33245690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
3335a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan        log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
33445690fe3b8b4efb101dd31085413381021a69c2fSean Callanan                    decl,
3358de27c761a22187ef63fb60000894be163e7285fGreg Clayton                    name.GetCString(),
336427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton                    var_sp->GetName().GetCString());
33745690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
3388c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know entity->m_parser_vars is valid because we used a parser variable
3398c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // to find it
3408bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
34131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
34231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
34331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value = value;
34431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
3450f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan    if (ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID()))
3460f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan    {
3470f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        // We already laid this out; do not touch
3480f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
3490f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan        if (log)
3500f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan            log->Printf("Already placed at 0x%llx", (unsigned long long)jit_vars->m_offset);
3510f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan    }
3520f0551e67d8ea8d63ace5456f7d42d951827b017Sean Callanan
35331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    var_sp->EnableJITVars(GetParserID());
35431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
35531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
35631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
35731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    jit_vars->m_alignment = alignment;
35831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    jit_vars->m_size = size;
3598bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
360427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    m_struct_members.AddVariable(var_sp);
3618bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3629d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan    if (m_parser_vars->m_materializer)
3639d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan    {
364ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan        uint32_t offset = 0;
365ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan
3669d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan        Error err;
3679d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan
3689d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan        if (is_persistent_variable)
3699d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan        {
370ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan            offset = m_parser_vars->m_materializer->AddPersistentVariable(var_sp, err);
3719d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan        }
3729d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan        else
3739d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan        {
3749d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan            if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym)
375ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan                offset = m_parser_vars->m_materializer->AddSymbol(*sym, err);
3769d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan            else if (const RegisterInfo *reg_info = var_sp->GetRegisterInfo())
377ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan                offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err);
3789d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan            else if (parser_vars->m_lldb_var)
379ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan                offset = m_parser_vars->m_materializer->AddVariable(parser_vars->m_lldb_var, err);
3809d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan        }
381ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan
382ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan        if (!err.Success())
383ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan            return false;
384ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan
385ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan        if (log)
386ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan            log->Printf("Placed at 0x%llx", (unsigned long long)offset);
387ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan
388ce66f96d4329a5664561ceb6f1fc571ed497bcefSean Callanan        jit_vars->m_offset = offset; // TODO DoStructLayout() should not change this.
3899d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan    }
3909d2e69d064a088422c6717b5a190af84b3cbb64fSean Callanan
3918bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
3928bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
3938bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
3948bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
3958bce665569ea08dd43d9ff21e23f14ebbc191d12Sean CallananClangExpressionDeclMap::DoStructLayout ()
3968bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
397aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
398aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
399aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (m_struct_vars->m_struct_laid_out)
4008bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return true;
4018bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
402a6686e36cd56843e594139324884585fb47b918bSean Callanan    if (!m_parser_vars->m_materializer)
403a6686e36cd56843e594139324884585fb47b918bSean Callanan        return false;
4048bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
405a6686e36cd56843e594139324884585fb47b918bSean Callanan    m_struct_vars->m_struct_alignment = m_parser_vars->m_materializer->GetStructAlignment();
406a6686e36cd56843e594139324884585fb47b918bSean Callanan    m_struct_vars->m_struct_size = m_parser_vars->m_materializer->GetStructByteSize();
407aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    m_struct_vars->m_struct_laid_out = true;
4088bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
4098bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
4108bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4118de27c761a22187ef63fb60000894be163e7285fGreg Claytonbool ClangExpressionDeclMap::GetStructInfo
4128de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4138de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t &num_elements,
4148de27c761a22187ef63fb60000894be163e7285fGreg Clayton    size_t &size,
4158de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &alignment
4168de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4178bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
418aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
419aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
420aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
4218bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
4228bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
423427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    num_elements = m_struct_members.GetSize();
424aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    size = m_struct_vars->m_struct_size;
425aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    alignment = m_struct_vars->m_struct_alignment;
4268bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4278bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
4288bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
4298bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
4308bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callananbool
4318de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetStructElement
4328de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4339b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *&decl,
4348de27c761a22187ef63fb60000894be163e7285fGreg Clayton    llvm::Value *&value,
4358de27c761a22187ef63fb60000894be163e7285fGreg Clayton    off_t &offset,
4368de27c761a22187ef63fb60000894be163e7285fGreg Clayton    ConstString &name,
4378de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint32_t index
4388de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
4398bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan{
440aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_struct_vars.get());
441aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
442aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    if (!m_struct_vars->m_struct_laid_out)
4438bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
4448bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
445427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (index >= m_struct_members.GetSize())
4468bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan        return false;
4478bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
448427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
4498c12720c108cd5e7ed792596749218d8400f647eSean Callanan
45031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    if (!member_sp)
45131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        return false;
45231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
45331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = member_sp->GetParserVars(GetParserID());
45431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
45531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
45631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    if (!parser_vars ||
45731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        !jit_vars ||
45853a5a9986e2a201717ea723f67ae32571be95b32Sean Callanan        !member_sp->GetValueObject())
4598c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
4608bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
46131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    decl = parser_vars->m_named_decl;
46231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    value = parser_vars->m_llvm_value;
46331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    offset = jit_vars->m_offset;
464427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    name = member_sp->GetName();
4658c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4668bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan    return true;
4678bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan}
4688bce665569ea08dd43d9ff21e23f14ebbc191d12Sean Callanan
46902fbafa1bf2bb77bf8f25af3403d7d8721a3f8b1Sean Callananbool
4708de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionInfo
4718de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
4729b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    const NamedDecl *decl,
4738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    uint64_t &ptr
4748de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
475ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan{
47631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl, GetParserID()));
4778c12720c108cd5e7ed792596749218d8400f647eSean Callanan
478427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (!entity_sp)
4798c12720c108cd5e7ed792596749218d8400f647eSean Callanan        return false;
480ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
4818c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // We know m_parser_vars is valid since we searched for the variable by
4828c12720c108cd5e7ed792596749218d8400f647eSean Callanan    // its NamedDecl
483ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
48431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = entity_sp->GetParserVars(GetParserID());
48531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
48652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ptr = parser_vars->m_lldb_value.GetScalar().ULongLong();
4878c12720c108cd5e7ed792596749218d8400f647eSean Callanan
4888c12720c108cd5e7ed792596749218d8400f647eSean Callanan    return true;
489ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan}
490ba992c58b25ec0a67ef430024dc3dca154982dc9Sean Callanan
491ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callananstatic void
492ca2516d8d27affa4181ed2f6bd663caccded9535Sean CallananFindCodeSymbolInContext
493ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan(
494ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    const ConstString &name,
495ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContext &sym_ctx,
496ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    SymbolContextList &sc_list
497ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan)
498ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan{
4994f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    SymbolContextList temp_sc_list;
500ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    if (sym_ctx.module_sp)
5014f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
502ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
5034f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    if (!sc_list.GetSize() && sym_ctx.target_sp)
5044f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
5054f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
5064f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    unsigned temp_sc_list_size = temp_sc_list.GetSize();
5074f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    for (unsigned i = 0; i < temp_sc_list_size; i++)
5084f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    {
5094f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        SymbolContext sym_ctx;
5104f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        temp_sc_list.GetContextAtIndex(i, sym_ctx);
5114f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        if (sym_ctx.symbol)
5124f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        {
5134f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec            switch (sym_ctx.symbol->GetType())
5144f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec            {
5154f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                case eSymbolTypeCode:
5164f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                case eSymbolTypeResolver:
5174f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                    sc_list.Append(sym_ctx);
5184f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                    break;
5194f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
5204f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                default:
5214f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                    break;
5224f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec            }
5234f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        }
5244f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    }
525ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan}
526ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan
527f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callananbool
5288de27c761a22187ef63fb60000894be163e7285fGreg ClaytonClangExpressionDeclMap::GetFunctionAddress
5298de27c761a22187ef63fb60000894be163e7285fGreg Clayton(
5308de27c761a22187ef63fb60000894be163e7285fGreg Clayton    const ConstString &name,
531da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    uint64_t &func_addr
5328de27c761a22187ef63fb60000894be163e7285fGreg Clayton)
533f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan{
534aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
535aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
536952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
537dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
538dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = exe_ctx.GetTargetPtr();
539f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    // Back out in all cases where we're not fully initialized
540567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
54178b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham        return false;
54278b9ee820284e71f9eb9523b5bbebbfd10f5500cJim Ingham    if (!m_parser_vars->m_sym_ctx.target_sp)
543f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
544f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
545e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
546f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
547ca2516d8d27affa4181ed2f6bd663caccded9535Sean Callanan    FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
5484f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
549e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    if (!sc_list.GetSize())
550aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    {
551aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // We occasionally get debug information in which a const function is reported
552aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        // as non-const, so the mangled name is wrong.  This is a hack to compensate.
553aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
5540eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan        if (!strncmp(name.GetCString(), "_ZN", 3) &&
5550eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            strncmp(name.GetCString(), "_ZNK", 4))
556aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        {
5570eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            std::string fixed_scratch("_ZNK");
5580eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            fixed_scratch.append(name.GetCString() + 3);
5590eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            ConstString fixed_name(fixed_scratch.c_str());
560aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
561aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan            if (log)
5620eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan                log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
5630eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan
5640eb213912d8c8347cce5ff5a00a2de2d8f5d0015Sean Callanan            FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
565aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan        }
566aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    }
567aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan
568aba367e84c6bdcaaa56a4abc8ff883940ef4c706Sean Callanan    if (!sc_list.GetSize())
569f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
5704f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
571f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    SymbolContext sym_ctx;
572e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    sc_list.GetContextAtIndex(0, sym_ctx);
5734f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
574da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton    const Address *func_so_addr = NULL;
5754f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    bool is_indirect_function = false;
5764f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
577f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    if (sym_ctx.function)
578da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton        func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
5794f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    else if (sym_ctx.symbol) {
5800c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        func_so_addr = &sym_ctx.symbol->GetAddress();
5814f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        is_indirect_function = sym_ctx.symbol->IsIndirect();
5824f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    } else
583f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan        return false;
5844f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
585ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan    if (!func_so_addr || !func_so_addr->IsValid())
586ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        return false;
5874f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
5884f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    func_addr = func_so_addr->GetCallableLoadAddress (target, is_indirect_function);
589da7af84c427c5c3a7b18e550c665c2f538670a34Greg Clayton
590f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan    return true;
591f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan}
592f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan
593cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
594d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean CallananClangExpressionDeclMap::GetSymbolAddress (Target &target, Process *process, const ConstString &name, lldb::SymbolType symbol_type)
595c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan{
596c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan    SymbolContextList sc_list;
597c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
59821ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
599c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
600cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    const uint32_t num_matches = sc_list.GetSize();
601cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
602cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton
60321ef5bb658e4582339bedf5befc10c13953bdac0Sean Callanan    for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++)
604cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    {
605cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        SymbolContext sym_ctx;
606cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
607c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
6080c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        const Address *sym_address = &sym_ctx.symbol->GetAddress();
609ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
610ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan        if (!sym_address || !sym_address->IsValid())
61195cad867ca439a7ad2e7566c1524646ad0a062bcSean Callanan            continue;
612ae9f748962645504f4b30e7d53aee2ff825b0162Sean Callanan
613cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        if (sym_address)
614cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        {
615cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            switch (sym_ctx.symbol->GetType())
616cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            {
617cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCode:
618cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeTrampoline:
619cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
620cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
6214f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
6224f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                case eSymbolTypeResolver:
6234f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                    symbol_load_addr = sym_address->GetCallableLoadAddress (&target, true);
6244f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                    break;
6254f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
626cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeData:
627cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeRuntime:
628cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariable:
629cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLocal:
630cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeParam:
631cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInvalid:
632cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAbsolute:
633cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeException:
634cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeSourceFile:
635cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeHeaderFile:
636cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeObjectFile:
637cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCommonBlock:
638cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeBlock:
639cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeVariableType:
640cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineEntry:
641cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeLineHeader:
642cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeBegin:
643cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeScopeEnd:
644cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeAdditional:
645cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeCompiler:
646cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeInstrumentation:
647cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                case eSymbolTypeUndefined:
6483f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCClass:
6493f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCMetaClass:
6503f69eacbb218a37390822c89d3675bd740590382Greg Clayton                case eSymbolTypeObjCIVar:
651cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    symbol_load_addr = sym_address->GetLoadAddress (&target);
652cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton                    break;
653cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton            }
654cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton        }
655cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    }
656c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
657d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    if (symbol_load_addr == LLDB_INVALID_ADDRESS && process)
658d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    {
659d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
660d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan
661d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        if (runtime)
662d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        {
663d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan            symbol_load_addr = runtime->LookupRuntimeSymbol(name);
664d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan        }
665d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    }
666d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan
667cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Clayton    return symbol_load_addr;
668c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan}
669c7674af9458fbad6f07fa73609c354abf93af2dcSean Callanan
670cbc07cfd435fb703d8feb69b97ca8590e6ee2fd8Greg Claytonaddr_t
67121ef5bb658e4582339bedf5befc10c13953bdac0Sean CallananClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
672819749647b1605f75753f625050cb240292c08b0Sean Callanan{
673819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (m_parser_vars.get());
674819749647b1605f75753f625050cb240292c08b0Sean Callanan
675dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
676819749647b1605f75753f625050cb240292c08b0Sean Callanan        return false;
677819749647b1605f75753f625050cb240292c08b0Sean Callanan
678d27e543e9c5f81ef1288afbc9e48de2da5976a8aSean Callanan    return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), m_parser_vars->m_exe_ctx.GetProcessPtr(), name, symbol_type);
679819749647b1605f75753f625050cb240292c08b0Sean Callanan}
680819749647b1605f75753f625050cb240292c08b0Sean Callanan
68101e6a58b057676d5dc434876dbb2d54871bb962eGreg Claytonconst Symbol *
68201e6a58b057676d5dc434876dbb2d54871bb962eGreg ClaytonClangExpressionDeclMap::FindGlobalDataSymbol (Target &target,
68301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                              const ConstString &name)
684819749647b1605f75753f625050cb240292c08b0Sean Callanan{
685819749647b1605f75753f625050cb240292c08b0Sean Callanan    SymbolContextList sc_list;
686819749647b1605f75753f625050cb240292c08b0Sean Callanan
68701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
688819749647b1605f75753f625050cb240292c08b0Sean Callanan
68901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    const uint32_t matches = sc_list.GetSize();
69001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    for (uint32_t i=0; i<matches; ++i)
691819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
692819749647b1605f75753f625050cb240292c08b0Sean Callanan        SymbolContext sym_ctx;
69301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        sc_list.GetContextAtIndex(i, sym_ctx);
69401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        if (sym_ctx.symbol)
69501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        {
69601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            const Symbol *symbol = sym_ctx.symbol;
69701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            const Address *sym_address = &symbol->GetAddress();
69801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton
69901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            if (sym_address && sym_address->IsValid())
70001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            {
70101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                switch (symbol->GetType())
70201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                {
70301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeData:
70401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeRuntime:
70501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeAbsolute:
70601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeObjCClass:
70701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeObjCMetaClass:
70801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeObjCIVar:
70901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        if (symbol->GetDemangledNameIsSynthesized())
71001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        {
71101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                            // If the demangled name was synthesized, then don't use it
71201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                            // for expressions. Only let the symbol match if the mangled
71301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                            // named matches for these symbols.
71401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                            if (symbol->GetMangled().GetMangledName() != name)
71501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                break;
71601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        }
71701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        return symbol;
71801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton
71901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeCode: // We already lookup functions elsewhere
72001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeVariable:
72101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeLocal:
72201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeParam:
72301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeTrampoline:
72401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeInvalid:
72501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeException:
72601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeSourceFile:
72701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeHeaderFile:
72801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeObjectFile:
72901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeCommonBlock:
73001e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeBlock:
73101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeVariableType:
73201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeLineEntry:
73301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeLineHeader:
73401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeScopeBegin:
73501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeScopeEnd:
73601e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeAdditional:
73701e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeCompiler:
73801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeInstrumentation:
73901e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                    case eSymbolTypeUndefined:
7404f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                    case eSymbolTypeResolver:
74101e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                        break;
74201e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                }
74301e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton            }
74401e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton        }
745819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
746819749647b1605f75753f625050cb240292c08b0Sean Callanan
747819749647b1605f75753f625050cb240292c08b0Sean Callanan    return NULL;
748819749647b1605f75753f625050cb240292c08b0Sean Callanan}
749819749647b1605f75753f625050cb240292c08b0Sean Callanan
75047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callananlldb::VariableSP
75147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean CallananClangExpressionDeclMap::FindGlobalVariable
75247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan(
75347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    Target &target,
75494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ModuleSP &module,
75594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    const ConstString &name,
75694cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    ClangNamespaceDecl *namespace_decl,
75747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    TypeFromUser *type
75847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan)
75947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan{
76047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    VariableList vars;
76147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
76294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    if (module && namespace_decl)
76394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
76494cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan    else
76594cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan        target.GetImages().FindGlobalVariables(name, true, -1, vars);
76647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
76747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    if (vars.GetSize())
76847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    {
76947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (type)
77047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
77147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            for (size_t i = 0; i < vars.GetSize(); ++i)
77247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            {
77347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                VariableSP var_sp = vars.GetVariableAtIndex(i);
77447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
77552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (ClangASTContext::AreTypesSame(*type, var_sp->GetType()->GetClangFullType()))
77652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return var_sp;
77747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            }
77847dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
77947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        else
78047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
78147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan            return vars.GetVariableAtIndex(0);
78247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
78347dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    }
78447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
78547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan    return VariableSP();
78647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan}
78747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Interface for ClangASTSource
78947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
79016b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
791f76afff22617c3f632af58ffebe1f037ba935717Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
793f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
794f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
7956741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan    ClangASTMetrics::RegisterVisibleQuery();
7966741173bf58eaeab4964226ba5a42b2a9bbc21b1Sean Callanan
797f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
798f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan
799952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8019394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (GetImportInProgress())
802ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    {
80367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
804ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan            log->Printf("Ignoring a query during an import");
805ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan        return;
806ee8fc726f2eff9c3b3db7f00f9fddbaa9735e045Sean Callanan    }
807e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
80867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    static unsigned int invocation_id = 0;
80967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan    unsigned int current_id = invocation_id++;
81067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan
81116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (log)
81216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
81316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (!context.m_decl_context)
8149394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
81516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
8169394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
81716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        else
8189394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
81916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
8209394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
82116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
82216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
82373b520f4f60dca58e58e446c9504d45384ee677bSean Callanan        ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
824a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
82567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan        if (log && log->GetVerbose())
8265a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            log->Printf("  CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
82767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        current_id,
82867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        namespace_map.get(),
82967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        (int)namespace_map->size());
830a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
831a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan        if (!namespace_map)
832a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan            return;
833a7cb1fa9d7d9c71fc2a5d9946cbec8e928baa5b9Sean Callanan
83416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
83516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             i != e;
83616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan             ++i)
83716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        {
83816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan            if (log)
8399394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Searching namespace %s in module %s",
84067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                            current_id,
84116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->second.GetNamespaceDecl()->getNameAsString().c_str(),
84216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                            i->first->GetFileSpec().GetFilename().GetCString());
84316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
844c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan            FindExternalVisibleDecls(context,
845c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->first,
846c839adc5a17c6736617ff3a2441857bf6c25f183Sean Callanan                                     i->second,
84767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                     current_id);
84816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        }
84916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
850e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan    else if (isa<TranslationUnitDecl>(context.m_decl_context))
85116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    {
85216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        ClangNamespaceDecl namespace_decl;
85316b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
85416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        if (log)
8559394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan            log->Printf("  CEDM::FEVD[%u] Searching the root namespace", current_id);
85616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
85716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan        FindExternalVisibleDecls(context,
85816b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 lldb::ModuleSP(),
85916b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan                                 namespace_decl,
86067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                 current_id);
86116b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan    }
862a75970673121eb7cb4c947625235b8c201940fe2Sean Callanan
8639394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    if (!context.m_found.variable)
8649394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        ClangASTSource::FindExternalVisibleDecls(context);
86516b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan}
86616b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
86716b53ab189392cb30056ce1bbc24202cb935bf15Sean Callananvoid
86816b53ab189392cb30056ce1bbc24202cb935bf15Sean CallananClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
86938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                                  lldb::ModuleSP module_sp,
87003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                  ClangNamespaceDecl &namespace_decl,
87167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                                  unsigned int current_id)
87216b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan{
873f76afff22617c3f632af58ffebe1f037ba935717Sean Callanan    assert (m_ast_context);
87416b53ab189392cb30056ce1bbc24202cb935bf15Sean Callanan
875952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
8769394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
877e5748d889fb7fb97b3ff07444894d7714776b609Greg Clayton    SymbolContextList sc_list;
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8799394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan    const ConstString name(context.m_decl_name.getAsString().c_str());
8809394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
8813bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    const char *name_unique_cstr = name.GetCString();
8823bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton
8833bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton    if (name_unique_cstr == NULL)
8843bc52d0a96c18be384028a90914f534ac252fbe4Greg Clayton        return;
8859394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
8868f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    static ConstString id_name("id");
8878f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    static ConstString Class_name("Class");
8888f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
8898f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    if (name == id_name || name == Class_name)
8908f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        return;
8918f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
8928de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // Only look for functions by name out in our symbols if the function
8938de27c761a22187ef63fb60000894be163e7285fGreg Clayton    // doesn't start with our phony prefix of '$'
894dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
895dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
89603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    if (name_unique_cstr[0] == '$' && !namespace_decl)
8973cfbd338aef72c7990c37395cda6804708e0aacbSean Callanan    {
89857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        static ConstString g_lldb_class_name ("$__lldb_class");
89947dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        if (name == g_lldb_class_name)
90157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        {
90257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            // Clang is looking for the type of "this"
90375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
90475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (frame == NULL)
90547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
90647dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
90775ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
90857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
90975ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (!sym_ctx.function)
91057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
91157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
912b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // Get the block that defines the function
913b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            Block *function_block = sym_ctx.GetFunctionBlock();
914b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
915b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (!function_block)
916b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                return;
917b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
918b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            clang::DeclContext *decl_context = function_block->GetClangDeclContext();
91957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
92075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            if (!decl_context)
92157452832fdce249dd673710c5603a9b44c672d1bGreg Clayton                return;
92257452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
92375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
92457452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
925c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham            if (method_decl)
9263aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            {
927c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                clang::CXXRecordDecl *class_decl = method_decl->getParent();
928c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
929c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                QualType class_qual_type(class_decl->getTypeForDecl(), 0);
930c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
931c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
932c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                              &class_decl->getASTContext());
933c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
934c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (log)
935c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
936c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    ASTDumper ast_dumper(class_qual_type);
937c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    log->Printf("  CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
938c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
939c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
940dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                TypeFromParser class_type = CopyClassType(class_user_type, current_id);
941dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
942dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                if (!class_type.IsValid())
943dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                    return;
944dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
945d9c7d40d73a47581ed3ca06eb7282dc7a353b46eSean Callanan                TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(QualType::getFromOpaquePtr(class_type.GetOpaqueQualType()));
946dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
947dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                if (!type_source_info)
948dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                    return;
949dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
950dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                TypedefDecl *typedef_decl = TypedefDecl::Create(*m_ast_context,
951dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                                                                m_ast_context->getTranslationUnitDecl(),
952dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                                                                SourceLocation(),
953dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                                                                SourceLocation(),
954dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                                                                context.m_decl_name.getAsIdentifierInfo(),
955dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                                                                type_source_info);
956dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
957dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
958dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                if (!typedef_decl)
959dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                    return;
960dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
961dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                context.AddNamedDecl(typedef_decl);
962c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
963c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (method_decl->isInstance())
964c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
965c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    // self is a pointer to the object
966c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
967c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
968c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
969c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
970c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                &method_decl->getASTContext());
971c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
972c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    m_struct_vars->m_object_pointer_type = self_user_type;
973c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
974c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham            }
975c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham            else
976bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan            {
977c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // This branch will get hit if we are executing code in the context of a function that
978c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
979c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // method of the class.  In that case, just look up the "this" variable in the the current
980c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // scope and use its type.
981c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer
982c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // for C++ so it hasn't actually been tested.
983bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
984c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                VariableList *vars = frame->GetVariableList(false);
985bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
986c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
987bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
988c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (this_var &&
989c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    this_var->IsInScope(frame) &&
990c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    this_var->LocationIsValidForFrame (frame))
991c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
992c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    Type *this_type = this_var->GetType();
993c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
994c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    if (!this_type)
995c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        return;
996c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
99752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType pointee_type = this_type->GetClangForwardType().GetPointeeType();
998c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
99952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (pointee_type.IsValid())
1000c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    {
1001c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        if (log)
1002c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        {
1003c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                            ASTDumper ast_dumper(this_type->GetClangFullType());
1004c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                            log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1005c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        }
1006c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
100752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        TypeFromUser class_user_type(pointee_type);
1008dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                        AddOneType(context, class_user_type, current_id);
1009c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1010c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
101152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        TypeFromUser this_user_type(this_type->GetClangFullType());
1012c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        m_struct_vars->m_object_pointer_type = this_user_type;
1013c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        return;
1014c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    }
1015c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
1016bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan            }
1017bd61877f4485326924063bfc40cc1f60c4b73659Sean Callanan
101857452832fdce249dd673710c5603a9b44c672d1bGreg Clayton            return;
101957452832fdce249dd673710c5603a9b44c672d1bGreg Clayton        }
102057452832fdce249dd673710c5603a9b44c672d1bGreg Clayton
10213aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
10223aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        if (name == g_lldb_objc_class_name)
10233aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        {
10243aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            // Clang is looking for the type of "*self"
10253aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan
1026567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!frame)
102747dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                return;
1028e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
1029e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
103047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1031e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!sym_ctx.function)
1032e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan                return;
103303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
1034b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // Get the block that defines the function
1035b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            Block *function_block = sym_ctx.GetFunctionBlock();
1036e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
1037b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (!function_block)
1038b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                return;
1039b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
1040b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            clang::DeclContext *decl_context = function_block->GetClangDeclContext();
1041e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
1042e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            if (!decl_context)
10433aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan                return;
104403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
1045e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
1046e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan
1047c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham            if (method_decl)
1048e6ea5fe8e76b028a0565bc01543bc15f8c120e8aSean Callanan            {
1049c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
105075ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
1051c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (!self_interface)
105275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan                    return;
105375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
1054c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                const clang::Type *interface_type = self_interface->getTypeForDecl();
105573e6eecb1038137738d129b116d2bb22ce5f7368Sean Callanan
105673e6eecb1038137738d129b116d2bb22ce5f7368Sean Callanan                if (!interface_type)
105773e6eecb1038137738d129b116d2bb22ce5f7368Sean Callanan                    return; // This is unlikely, but we have seen crashes where this occurred
1058c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1059c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
1060c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                             &method_decl->getASTContext());
106175ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
1062c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (log)
1063c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
1064c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    ASTDumper ast_dumper(interface_type);
1065c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1066c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
1067c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1068dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                AddOneType(context, class_user_type, current_id);
1069c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1070c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (method_decl->isInstanceMethod())
1071c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
1072c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    // self is a pointer to the object
1073c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1074c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
1075c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1076c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
1077c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                &method_decl->getASTContext());
1078c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1079c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    m_struct_vars->m_object_pointer_type = self_user_type;
1080c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
1081c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                else
1082c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
1083c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    // self is a Class pointer
1084c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    QualType class_type = method_decl->getASTContext().getObjCClassType();
1085c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1086c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
1087c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                                                &method_decl->getASTContext());
1088c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1089c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    m_struct_vars->m_object_pointer_type = self_user_type;
1090c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
1091c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1092c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                return;
109375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            }
109475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            else
109575ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            {
1096c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // This branch will get hit if we are executing code in the context of a function that
1097c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
1098c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // method of the class.  In that case, just look up the "self" variable in the the current
1099c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                // scope and use its type.
1100c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1101c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                VariableList *vars = frame->GetVariableList(false);
110275ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
1103c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
110475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
1105c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                if (self_var &&
1106c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    self_var->IsInScope(frame) &&
1107c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    self_var->LocationIsValidForFrame (frame))
1108c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                {
1109c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    Type *self_type = self_var->GetType();
1110c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1111c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    if (!self_type)
1112c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        return;
1113c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
111452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType self_clang_type = self_type->GetClangFullType();
1115c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
111652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (self_clang_type.IsObjCClassType())
1117288ddfedeb1946d68e467f342f600e9325060e51Sean Callanan                    {
1118288ddfedeb1946d68e467f342f600e9325060e51Sean Callanan                        return;
1119288ddfedeb1946d68e467f342f600e9325060e51Sean Callanan                    }
112052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    else if (self_clang_type.IsObjCObjectPointerType())
1121c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    {
112252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        self_clang_type = self_clang_type.GetPointeeType();
112352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
112452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        if (!self_clang_type)
11255d2dab4f7dc12ca210390c6e691a05f3a69ec4b1Sean Callanan                            return;
11265d2dab4f7dc12ca210390c6e691a05f3a69ec4b1Sean Callanan
1127c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        if (log)
1128c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        {
1129c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                            ASTDumper ast_dumper(self_type->GetClangFullType());
1130c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                            log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1131c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        }
1132c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
113352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        TypeFromUser class_user_type (self_clang_type);
1134288ddfedeb1946d68e467f342f600e9325060e51Sean Callanan
1135dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                        AddOneType(context, class_user_type, current_id);
1136c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
113752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        TypeFromUser self_user_type(self_type->GetClangFullType());
1138c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham
1139c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        m_struct_vars->m_object_pointer_type = self_user_type;
1140c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                        return;
1141c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                    }
1142c7f17c030eb0632a0bb1cd0ebf29900d6d97a902Jim Ingham                }
114375ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan            }
114475ed99e36cf4ac4bdfa14cc24c12a6d84b8b1cdcSean Callanan
11453aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan            return;
11463aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan        }
1147c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
1148c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        // any other $__lldb names should be weeded out now
1149c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
1150c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan            return;
115103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
11522431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        do
11532431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        {
1154567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (!target)
11552431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
11562431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
1157567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
11582431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11592431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_clang_ast_context)
11602431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
11612431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11622431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
11632431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11642431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!scratch_ast_context)
11652431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
11662431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11672431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
116803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
11692431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!ptype_type_decl)
11702431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
11712431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
1172e1301a62783cf0d5457350b90830917841cbf6fcSean Callanan            Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
11732431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11742431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_decl)
11752431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
11762431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11772431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
11782431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11792431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (!parser_ptype_type_decl)
11802431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan                break;
11812431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11822431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            if (log)
11839394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                log->Printf("  CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
11842431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
11852431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan            context.AddNamedDecl(parser_ptype_type_decl);
11862431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan        } while (0);
11872431244f929e269c6ecd51aa3eb606b6a2474f19Sean Callanan
1188427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
118903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
1190427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton        if (pvar_sp)
11911ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
119267bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            AddOneVariable(context, pvar_sp, current_id);
11931ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            return;
11941ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
11951ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
11961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        const char *reg_name(&name.GetCString()[1]);
11971ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1198dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan        if (m_parser_vars->m_exe_ctx.GetRegisterContext())
11991ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        {
1200dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan            const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
12019394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan
12021ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan            if (reg_info)
1203e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            {
1204e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan                if (log)
12059394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan                    log->Printf("  CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
1206e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan
120767bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                AddOneRegister(context, reg_info, current_id);
1208e3737fdca55be5c078534cc49fb38db409d12e32Sean Callanan            }
12091ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        }
12108de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
121103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    else
121203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan    {
121303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        ValueObjectSP valobj;
121403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        VariableSP var;
121503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        Error err;
121603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
121703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        if (frame && !namespace_decl)
121803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
121903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
122003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              eNoDynamicValues,
1221edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember ||
1222edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan                                                              StackFrame::eExpressionPathOptionsAllowDirectIVarAccess ||
1223edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan                                                              StackFrame::eExpressionPathOptionsNoFragileObjcIvar ||
1224edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan                                                              StackFrame::eExpressionPathOptionsNoSyntheticChildren ||
1225edfbe45b66ee21e6fe35f8a6d76879e94705d123Sean Callanan                                                              StackFrame::eExpressionPathOptionsNoSyntheticArrayRange,
122603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              var,
122703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                                              err);
122803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
122903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            // If we found a variable in scope, no need to pull up function names
1230b386d82334b65fb984348f2027b1cb7714de993fSean Callanan            if (err.Success() && var)
123103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
123289e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                AddOneVariable(context, var, valobj, current_id);
123316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
12343a5467639d75d993ab0cb0d8c5ae5cc48ceb44e4Sean Callanan                return;
123503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
123603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
12371c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan
12381c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan        if (target)
123903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
124094cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan            var = FindGlobalVariable (*target,
124138d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                      module_sp,
124294cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      name,
124394cd0cac9117f12cf05bab3e836029f15a62024bSean Callanan                                      &namespace_decl,
124403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                                      NULL);
124503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
124603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (var)
124703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
1248f48de6de78706bb1d87aa8d54ab6c25c7832ada1Sean Callanan                valobj = ValueObjectVariable::Create(target, var);
124989e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan                AddOneVariable(context, var, valobj, current_id);
125016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                context.m_found.variable = true;
12511c226272ea1441707d0427b780cf0e73e9d8fd8bSean Callanan                return;
125203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
125303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
125403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
125516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan        if (!context.m_found.variable)
125603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        {
1257302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan            const bool include_inlines = false;
125803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            const bool append = false;
1259a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
126038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan            if (namespace_decl && module_sp)
1261a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
126251cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan                const bool include_symbols = false;
126351cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan
126438d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                module_sp->FindFunctions(name,
126538d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         &namespace_decl,
126638d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         eFunctionNameTypeBase,
126738d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         include_symbols,
1268302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                                         include_inlines,
126938d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         append,
127038d084f75fef8dbaccf828a14834473a4c6b26dbSean Callanan                                         sc_list);
1271a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
12726f01c93497df194b6f2194630a81e87d806ce0e0Jim Ingham            else if (target && !namespace_decl)
1273a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            {
127451cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan                const bool include_symbols = true;
127551cd6f6026368c46d29180034bfcdc1426d93fb4Sean Callanan
12762975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                // TODO Fix FindFunctions so that it doesn't return
12772975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                //   instance methods for eFunctionNameTypeBase.
12782975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
1279a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                target->GetImages().FindFunctions(name,
1280296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                                  eFunctionNameTypeFull,
1281a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  include_symbols,
1282302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                                                  include_inlines,
1283a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  append,
1284a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan                                                  sc_list);
1285a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan            }
1286a5ec5a3b8f9aa1268330c93578694a103dcd65a0Sean Callanan
128703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            if (sc_list.GetSize())
128803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
128903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *generic_symbol = NULL;
129003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                Symbol *non_extern_symbol = NULL;
129103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
129203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                for (uint32_t index = 0, num_indices = sc_list.GetSize();
129303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     index < num_indices;
129403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                     ++index)
129503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
129603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    SymbolContext sym_ctx;
129703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    sc_list.GetContextAtIndex(index, sym_ctx);
129803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
129903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (sym_ctx.function)
130003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
13012975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
13022975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
130398e61d33e675ac085518e1cd758a8a324886035aSean Callanan                        if (!decl_ctx)
130498e61d33e675ac085518e1cd758a8a324886035aSean Callanan                            continue;
130598e61d33e675ac085518e1cd758a8a324886035aSean Callanan
13062975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        // Filter out class/instance methods.
13072975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
13082975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                            continue;
13092975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                        if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
13102975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                            continue;
13112975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
131279e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan                        AddOneFunction(context, sym_ctx.function, NULL, current_id);
131316c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function_with_type_info = true;
131416c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
131503f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
131603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (sym_ctx.symbol)
131703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
131803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        if (sym_ctx.symbol->IsExternal())
131903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            generic_symbol = sym_ctx.symbol;
132003f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                        else
132103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                            non_extern_symbol = sym_ctx.symbol;
132203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
132303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
132403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
132516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                if (!context.m_found.function_with_type_info)
132603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
132703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    if (generic_symbol)
132803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
132967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, generic_symbol, current_id);
133016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
133103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
133203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    else if (non_extern_symbol)
133303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    {
133467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                        AddOneFunction (context, NULL, non_extern_symbol, current_id);
133516c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                        context.m_found.function = true;
133603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                    }
133703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
133803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
133903f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
13400c2921f5b9dab2ca1832bb746ab3aa3f66fdd0b5Jim Ingham            if (target && !context.m_found.variable && !namespace_decl)
134103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            {
134216c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
134303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                // data symbol, and -- if it is found -- treat it as a variable.
134403f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
134501e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
134603f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan
134703f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                if (data_symbol)
134803f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                {
134967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    AddOneGenericVariable(context, *data_symbol, current_id);
135016c4ec3c4cb8c68b9813dd7d199471a794da4523Sean Callanan                    context.m_found.variable = true;
135103f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan                }
135203f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan            }
135303f64ca626d4dc0488e6acfe7023e4e376b4df30Sean Callanan        }
1354b549b0a14298f5d5074073543453a984b0c34fd0Sean Callanan    }
135524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
1356e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
135769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callananstatic clang_type_t
135869716a233f3240978bdbd7a8b682b31e7e07e498Sean CallananMaybePromoteToBlockPointerType
135969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan(
136069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    ASTContext *ast_context,
136169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    clang_type_t candidate_type
136269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan)
136369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan{
136469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!candidate_type)
136569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
136669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
136769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
136869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
136969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
137069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
137169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!candidate_pointer_type)
137269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
137369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
137469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
137569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
137669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
137769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
137869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_type)
137969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
138069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
138169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
138269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
138369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_decl->isRecord())
138469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
138569716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
138669716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
138769716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan        return candidate_type;
138869716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
138969716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
139069716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
139169716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
139269716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan    return block_pointer_type.getAsOpaquePtr();
139369716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan}
139469716a233f3240978bdbd7a8b682b31e7e07e498Sean Callanan
139552f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
139652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangExpressionDeclMap::GetVariableValue (VariableSP &var,
139752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          lldb_private::Value &var_location,
139852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          TypeFromUser *user_type,
139952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          TypeFromParser *parser_type)
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1401952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
14026184dfef225efc9b99d7e7f9de65f04b73a959d0Sean Callanan
140324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Type *var_type = var->GetType();
140424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
140524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!var_type)
140624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1407810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1408810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no type");
140952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
141024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType var_clang_type = var_type->GetClangFullType();
141324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!var_clang_type)
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1416810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1417810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("Skipped a definition because it has no Clang type");
141852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
142152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // commented out because of <rdar://problem/11024417>
14229b6898f3ec1dedbe1dfc8bd7cd1d82a5b10e1bb0Sean Callanan    ASTContext *ast = var_type->GetClangASTContext().getASTContext();
142352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
1424b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1426810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
1427810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan            log->PutCString("There is no AST context for the current execution context");
142852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
143052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type);
143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1432336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan    DWARFExpression &var_location_expr = var->LocationExpression();
1433336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1434178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
1435178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton
1436dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1437567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1438178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    if (var_location_expr.IsLocationList())
1439178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    {
1440178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        SymbolContext var_sc;
1441178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton        var->CalculateSymbolContext (&var_sc);
1442567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
1443178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton    }
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error err;
144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1446c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan    if (var->GetLocationIsConstantValueData())
1447c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan    {
1448c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan        DataExtractor const_value_extractor;
1449c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan
1450c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan        if (var_location_expr.GetExpressionData(const_value_extractor))
1451c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan        {
145252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            var_location = Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize());
145352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            var_location.SetValueType(Value::eValueTypeHostAddress);
1454c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan        }
1455c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan        else
1456c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan        {
1457c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan            if (log)
1458c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan                log->Printf("Error evaluating constant variable: %s", err.AsCString());
145952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return false;
1460c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan        }
1461c6bdc75b993e8e16c0c035e3c6a59891568f03a4Sean Callanan    }
1462668010966e95642360fd12094b28755e5dda5343Greg Clayton
146352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType type_to_use = GuardedCopyType(var_clang_type);
1464336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
146552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!type_to_use)
1466f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    {
146752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (log)
146852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            log->Printf("Couldn't copy a variable's type into the parser's AST context");
14694b5eec60abf8ac40781b2247898d9147a3996af1Sean Callanan
147052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
1471f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    }
147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
147352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (parser_type)
147452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        *parser_type = TypeFromParser(type_to_use);
147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
147652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (var_location.GetContextType() == Value::eContextTypeInvalid)
147752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        var_location.SetClangType(type_to_use);
147852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
147952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (var_location.GetValueType() == Value::eValueTypeFileAddress)
148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext var_sc;
148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        var->CalculateSymbolContext(&var_sc);
1483336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!var_sc.module_sp)
14853160832f026e60e832da55f90993a40ad132e360Michael Sartain            return false;
14867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton
148752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        Address so_addr(var_location.GetScalar().ULongLong(), var_sc.module_sp->GetSectionList());
148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1489567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        if (load_addr != LLDB_INVALID_ADDRESS)
149247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        {
149352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            var_location.GetScalar() = load_addr;
149452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            var_location.SetValueType(Value::eValueTypeLoadAddress);
149547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan        }
149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1498f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    if (user_type)
149952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        *user_type = TypeFromUser(var_clang_type);
1500336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
150152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return true;
1502336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan}
1503336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1504336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callananvoid
150589e7df3ebb2591e93a92913be4d483c30df777a3Sean CallananClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
1506336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan{
1507aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1508aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1509952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
151047dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan
1511f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromUser ut;
1512f328c9ffe0bb00f48601027ec86dbdf238b42c2aSean Callanan    TypeFromParser pt;
151352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    Value var_location;
1514336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
151552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!GetVariableValue (var, var_location, &ut, &pt))
151652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return;
1517336a0002b94c7f23573ec613c4d4ac89a67fd299Sean Callanan
1518e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
1519e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan
152030a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan    if (parser_opaque_type.isNull())
152130a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan        return;
152230a5dd5ae4ec13f07c788a488f2999e70cb75451Sean Callanan
1523e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
1524e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    {
1525e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan        if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1526e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan            CompleteType(tag_type->getDecl());
1527e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan    }
1528e94783960b4d80520b5ce5bb65f45828d84b1d79Sean Callanan
15296f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
153052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    bool is_reference = pt.IsReferenceType();
15316f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
153252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    NamedDecl *var_decl = NULL;
15336f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
153452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        var_decl = context.AddVarDecl(pt);
15356f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    else
153652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
15376f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
15388de27c761a22187ef63fb60000894be163e7285fGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
1539427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    ConstString entity_name(decl_name.c_str());
154089e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
154189e7df3ebb2591e93a92913be4d483c30df777a3Sean Callanan
1542427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
154331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    entity->EnableParserVars(GetParserID());
154431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
154531903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = pt;
154631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl  = var_decl;
154731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value  = NULL;
154831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_value  = var_location;
154931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_var    = var;
155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15516f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan    if (is_reference)
15526f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan        entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
15536f3bde75715fc2e1da483570c0c9241227c14c84Sean Callanan
1554810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
15558de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
1556aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan        ASTDumper orig_dumper(ut.GetOpaqueQualType());
1557a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
1558aa56141b061ca23a447d48c27bf1f35017405376Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString());
15598de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
15608f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan}
15618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
15628f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callananvoid
1563a48fe1637ec6a381e500633c087f76662e364c20Sean CallananClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
156467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       ClangExpressionVariableSP &pvar_sp,
156567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                       unsigned int current_id)
1566a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan{
1567952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
156845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
1569427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    TypeFromUser user_type (pvar_sp->GetTypeFromUser());
1570a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
157152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    TypeFromParser parser_type (GuardedCopyType(user_type));
1572a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
1573dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    if (!parser_type.GetOpaqueQualType())
1574dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
1575dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
1576dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            log->Printf("  CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
1577dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        return;
1578dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
1579dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
158052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType());
15818c12720c108cd5e7ed792596749218d8400f647eSean Callanan
158231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    pvar_sp->EnableParserVars(GetParserID());
158331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID());
158431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = parser_type;
158552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_named_decl = var_decl;
158652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_llvm_value = NULL;
158752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_lldb_value.Clear();
158845690fe3b8b4efb101dd31085413381021a69c2fSean Callanan
158945690fe3b8b4efb101dd31085413381021a69c2fSean Callanan    if (log)
1590a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    {
1591a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
15929394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
1593a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan    }
1594a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan}
1595a48fe1637ec6a381e500633c087f76662e364c20Sean Callanan
15961ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callananvoid
1597819749647b1605f75753f625050cb240292c08b0Sean CallananClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
159801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton                                              const Symbol &symbol,
159967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                              unsigned int current_id)
1600819749647b1605f75753f625050cb240292c08b0Sean Callanan{
1601819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert(m_parser_vars.get());
1602819749647b1605f75753f625050cb240292c08b0Sean Callanan
1603952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1604819749647b1605f75753f625050cb240292c08b0Sean Callanan
1605dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1606567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1607567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (target == NULL)
1608567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        return;
1609567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1610567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
1611819749647b1605f75753f625050cb240292c08b0Sean Callanan
161252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
161352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
161452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    NamedDecl *var_decl = context.AddVarDecl(parser_type);
1615819749647b1605f75753f625050cb240292c08b0Sean Callanan
1616819749647b1605f75753f625050cb240292c08b0Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
1617819749647b1605f75753f625050cb240292c08b0Sean Callanan    ConstString entity_name(decl_name.c_str());
1618dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
1619819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      entity_name,
1620819749647b1605f75753f625050cb240292c08b0Sean Callanan                                                                      user_type,
162147dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
162247dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
1623819749647b1605f75753f625050cb240292c08b0Sean Callanan    assert (entity.get());
1624819749647b1605f75753f625050cb240292c08b0Sean Callanan
162552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    entity->EnableParserVars(GetParserID());
162652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
162752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
162801e6a58b057676d5dc434876dbb2d54871bb962eGreg Clayton    const Address &symbol_address = symbol.GetAddress();
1629567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
1630819749647b1605f75753f625050cb240292c08b0Sean Callanan
163152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    //parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
163252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_lldb_value.SetClangType(user_type);
163352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
163452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
1635819749647b1605f75753f625050cb240292c08b0Sean Callanan
163631903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_parser_type = parser_type;
163731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_named_decl  = var_decl;
163831903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value  = NULL;
163931903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_lldb_sym    = &symbol;
1640819749647b1605f75753f625050cb240292c08b0Sean Callanan
1641819749647b1605f75753f625050cb240292c08b0Sean Callanan    if (log)
1642819749647b1605f75753f625050cb240292c08b0Sean Callanan    {
1643a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
1644819749647b1605f75753f625050cb240292c08b0Sean Callanan
16459394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
1646819749647b1605f75753f625050cb240292c08b0Sean Callanan    }
1647819749647b1605f75753f625050cb240292c08b0Sean Callanan}
1648819749647b1605f75753f625050cb240292c08b0Sean Callanan
1649fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callananbool
1650fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangExpressionDeclMap::ResolveUnknownTypes()
1651fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
1652952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1653dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1654567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
1655567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
1656fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1657fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    for (size_t index = 0, num_entities = m_found_entities.GetSize();
1658fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         index < num_entities;
1659fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan         ++index)
1660fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    {
1661fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
1662fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
166331903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan        ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
166431903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan
1665fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
1666fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        {
166731903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            const NamedDecl *named_decl = parser_vars->m_named_decl;
1668fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
1669fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1670fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (!var_decl)
1671fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
1672fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                if (log)
1673fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                    log->Printf("Entity of unknown type does not have a VarDecl");
1674fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan                return false;
1675fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
1676fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1677fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            if (log)
1678fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            {
1679a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
1680a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
1681fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            }
1682fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1683fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            QualType var_type = var_decl->getType();
1684fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
1685fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
16865a55c7a90100e2ed832c35955645bf146e8a66b7Sean Callanan            lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
1687fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1688dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            if (!copied_type)
1689dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            {
1690dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                if (log)
1691dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan                    log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
1692dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
16939880efacdd3a5e855b405d89433a01170422a889Jim Ingham                return (bool) lldb::ClangExpressionVariableSP();
1694dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan            }
1695dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
1696fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            TypeFromUser user_type(copied_type, scratch_ast_context);
1697fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
169852f792329be5db8e38961350589e97e8f2823acdGreg Clayton//            parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
169952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            parser_vars->m_lldb_value.SetClangType(user_type);
170031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan            parser_vars->m_parser_type = parser_type;
1701fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
170252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            entity->SetClangType(user_type);
1703fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1704fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan            entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
1705fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan        }
1706fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    }
1707fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1708fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan    return true;
1709fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
1710fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
1711819749647b1605f75753f625050cb240292c08b0Sean Callananvoid
1712427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg ClaytonClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
171367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        const RegisterInfo *reg_info,
171467bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
17151ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan{
1716952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
17171ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
171852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType clang_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (m_ast_context,
171952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                    reg_info->encoding,
172052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                    reg_info->byte_size * 8);
17211ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
172252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!clang_type)
17231ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
1724122204dc87589828ad39c1199ebc913ef7b40d88Johnny Chen        if (log)
172567bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
17261ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan        return;
17271ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
17281ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
172952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    TypeFromParser parser_clang_type (clang_type);
17301ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
173152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
17321ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1733dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
173447dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.byte_order,
173547dc457387b690c5e4df1c0c7dd8c4337b92e630Sean Callanan                                                                      m_parser_vars->m_target_info.address_byte_size));
1736427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    assert (entity.get());
17373b16eb9d424068446fea9cd0e0fe5e7d435f5b6eSean Callanan
17381ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    std::string decl_name(context.m_decl_name.getAsString());
1739427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetName (ConstString (decl_name.c_str()));
1740427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    entity->SetRegisterInfo (reg_info);
174131903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    entity->EnableParserVars(GetParserID());
174231903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
174352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_parser_type = parser_clang_type;
174452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_named_decl = var_decl;
174552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_llvm_value = NULL;
174652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_lldb_value.Clear();
174752d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan    entity->m_flags |= ClangExpressionVariable::EVBareRegister;
17481ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
174952d0d027dd38518e4b0cfb135a5d50a6652c5dafSean Callanan    if (log)
17501ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    {
1751a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        ASTDumper ast_dumper(var_decl);
17529394b5aaa5aafcf95d21d27371fa0a6548790a57Sean Callanan        log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
17531ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan    }
17541ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan}
17551ddd9fe72bd9e22f40ad28f25b3a139a9326ae98Sean Callanan
1756a48fe1637ec6a381e500633c087f76662e364c20Sean Callananvoid
1757da7af84c427c5c3a7b18e550c665c2f538670a34Greg ClaytonClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
175852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                        Function* function,
175967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        Symbol* symbol,
176067bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                                        unsigned int current_id)
17618f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan{
1762aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan    assert (m_parser_vars.get());
1763aa301c49e8b31f01c551cffbaa74c8ba82851a79Sean Callanan
1764952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
17658f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
176652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    NamedDecl *function_decl = NULL;
176758baaada202ea16e928f0c76e9124d42fd3655cdSean Callanan    const Address *fun_address = NULL;
176852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType function_clang_type;
17694f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
17704f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    bool is_indirect_function = false;
17714f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec
177252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (function)
17730fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
177452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        Type *function_type = function->GetType();
17750fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
177652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (!function_type)
17770fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
17780fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
177967bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no type");
17800fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
17810fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
17820fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
178352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        function_clang_type = function_type->GetClangFullType();
17840fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
178552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (!function_clang_type)
17860fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        {
17870fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            if (log)
178867bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                log->PutCString("  Skipped a function because it has no Clang type");
17890fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan            return;
17900fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan        }
17910fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
179252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        fun_address = &function->GetAddressRange().GetBaseAddress();
17930fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan
179452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType copied_function_type = GuardedCopyType(function_clang_type);
179552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (copied_function_type)
1796a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
179752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            function_decl = context.AddFunDecl(copied_function_type);
179879e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan
179952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (!function_decl)
180079e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan            {
180179e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan                if (log)
180279e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan                {
180379e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan                    log->Printf ("  Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}",
180452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                 function_type->GetName().GetCString(),
180552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                 function_type->GetID());
180679e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan                }
180779e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan
180879e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan                return;
180979e7ad84e2b31baf22e05ab24aaa11b5e0f566a5Sean Callanan            }
1810a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
1811a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        else
1812a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        {
1813a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            // We failed to copy the type we found
1814a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            if (log)
1815a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            {
18165f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                log->Printf ("  Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt",
181752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             function_type->GetName().GetCString(),
181852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                             function_type->GetID());
1819a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton            }
182016089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan
182116089547657e78bbc7198a9ce1d2b24b353a380fSean Callanan            return;
1822a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton        }
18230fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
18240fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else if (symbol)
18250fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    {
18260c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        fun_address = &symbol->GetAddress();
182752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        function_decl = context.AddGenericFunDecl();
18284f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec        is_indirect_function = symbol->IsIndirect();
18290fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    }
18300fc7358d61218ba5d5abb5c2ea489a9ef936bbf7Sean Callanan    else
18318f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    {
1832810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan        if (log)
183367bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan            log->PutCString("  AddOneFunction called with no function and no symbol");
18348f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan        return;
18358f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan    }
18368f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
1837dd1dcfdbad297562951169ad621f895daf32b382Sean Callanan    Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1838567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton
18394f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec    lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target, is_indirect_function);
1840583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan
184152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
184252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      m_parser_vars->m_target_info.byte_order,
184352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                      m_parser_vars->m_target_info.address_byte_size));
184452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    assert (entity.get());
184552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
184652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::string decl_name(context.m_decl_name.getAsString());
184752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    entity->SetName(ConstString(decl_name.c_str()));
184852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    entity->SetClangType (function_clang_type);
184952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    entity->EnableParserVars(GetParserID());
185052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
185152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
185252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
1853583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan    if (load_addr != LLDB_INVALID_ADDRESS)
1854583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan    {
185552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
185652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        parser_vars->m_lldb_value.GetScalar() = load_addr;
1857583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan    }
1858583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan    else
1859583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan    {
1860583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan        // We have to try finding a file address.
1861583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan
1862583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan        lldb::addr_t file_addr = fun_address->GetFileAddress();
1863583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan
186452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress);
186552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        parser_vars->m_lldb_value.GetScalar() = file_addr;
1866583f15dfb8f680cee0c499bcd876c5eb3b173136Sean Callanan    }
18678f0dc34f45576dfb719f879b6d3ea5f61de0e918Sean Callanan
186852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
186952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    parser_vars->m_named_decl  = function_decl;
187031903318116cbd66801cd2a526cc5e5873d20e4cSean Callanan    parser_vars->m_llvm_value  = NULL;
187152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
1872810f22d18ca8f9d31f49d79bb4b51a9f2fd96deaSean Callanan    if (log)
18738de27c761a22187ef63fb60000894be163e7285fGreg Clayton    {
187452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ASTDumper ast_dumper(function_decl);
1875a0744827698c8009397e6ad11dc299b990f8ded0Sean Callanan
18762975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        StreamString ss;
18772975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
18782975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
18792975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan
18802975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan        log->Printf("  CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
188167bbb1103c5a49b7c994750e90ae7ed130daa3aeSean Callanan                    current_id,
188252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    (function ? "specific" : "generic"),
18832975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                    decl_name.c_str(),
18842975adab355110bfeff9e429a97f0eaca6ea32d5Sean Callanan                    ss.GetData(),
1885a23ca4249f28a56ef1d1959ea3ac1cd8aabbfae2Greg Clayton                    ast_dumper.GetCString());
18868de27c761a22187ef63fb60000894be163e7285fGreg Clayton    }
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
188893a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
1889dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean CallananTypeFromParser
1890dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean CallananClangExpressionDeclMap::CopyClassType(TypeFromUser &ut,
1891dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                                      unsigned int current_id)
189293a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan{
189352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType copied_clang_type = GuardedCopyType(ut);
1894dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
189552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!copied_clang_type)
1896dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    {
1897952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1898dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
1899dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan        if (log)
1900dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan            log->Printf("ClangExpressionDeclMap::CopyClassType - Couldn't import the type");
1901dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan
1902dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan        return TypeFromParser();
1903dc5fce1270790d57d7ed4a2354980fbc03fdfd5cSean Callanan    }
1904dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
190552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (copied_clang_type.IsAggregateType() && copied_clang_type.GetCompleteType ())
19063c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    {
190752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType void_clang_type = ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid);
190852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType void_ptr_clang_type = void_clang_type.GetPointerType();
19093c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
191052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType method_type = ClangASTContext::CreateFunctionType (m_ast_context,
191152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        void_clang_type,
191252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        &void_ptr_clang_type,
1913716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        1,
1914716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan                                                                        false,
191552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                        copied_clang_type.GetTypeQualifiers());
1916716e3f07f6c41436b2845b172975fd45b456c8f0Sean Callanan
19171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_virtual = false;
19181d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_static = false;
19191d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        const bool is_inline = false;
192030449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton        const bool is_explicit = false;
192128ebe88ad7fdaf6756c140ceabb7098a0325c87cSean Callanan        const bool is_attr_used = true;
19222581dbf7292c6272bb771fe396ab30921385d669Sean Callanan        const bool is_artificial = false;
192330449d50f5328ca745d09d943b7e3b1ba41bff08Greg Clayton
192452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        copied_clang_type.AddMethodToCXXRecordType ("$__lldb_expr",
192552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    method_type,
192652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    lldb::eAccessPublic,
192752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_virtual,
192852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_static,
192952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_inline,
193052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_explicit,
193152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_attr_used,
193252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    is_artificial);
19333c9c5eb466869ede185e879d14a47335fb43194dSean Callanan    }
193493a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan
193552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return TypeFromParser(copied_clang_type);
1936dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan}
1937dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
1938dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callananvoid
1939dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean CallananClangExpressionDeclMap::AddOneType(NameSearchContext &context,
1940dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                                   TypeFromUser &ut,
1941dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan                                   unsigned int current_id)
1942dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan{
194352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ClangASTType copied_clang_type = GuardedCopyType(ut);
1944dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
194552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (!copied_clang_type)
1946dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    {
1947952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1948dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
1949dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan        if (log)
1950dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan            log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
1951dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
1952dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan        return;
1953dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    }
1954dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
195552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    context.AddTypeDecl(copied_clang_type);
195693a4b1a8d6ad9a5d1e18a38b5ec55de5b7f6e724Sean Callanan}
1957