Home | History | Annotate | Download | only in Expression
      1 //===-- ClangExpressionDeclMap.cpp -----------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "lldb/Expression/ClangExpressionDeclMap.h"
     11 
     12 // C Includes
     13 // C++ Includes
     14 // Other libraries and framework includes
     15 // Project includes
     16 #include "clang/AST/ASTContext.h"
     17 #include "clang/AST/DeclarationName.h"
     18 #include "clang/AST/Decl.h"
     19 #include "lldb/lldb-private.h"
     20 #include "lldb/Core/Address.h"
     21 #include "lldb/Core/Error.h"
     22 #include "lldb/Core/Log.h"
     23 #include "lldb/Core/Module.h"
     24 #include "lldb/Core/RegisterValue.h"
     25 #include "lldb/Core/ValueObjectConstResult.h"
     26 #include "lldb/Core/ValueObjectVariable.h"
     27 #include "lldb/Expression/ASTDumper.h"
     28 #include "lldb/Expression/ClangASTSource.h"
     29 #include "lldb/Expression/ClangPersistentVariables.h"
     30 #include "lldb/Expression/Materializer.h"
     31 #include "lldb/Host/Endian.h"
     32 #include "lldb/Symbol/ClangASTContext.h"
     33 #include "lldb/Symbol/ClangNamespaceDecl.h"
     34 #include "lldb/Symbol/CompileUnit.h"
     35 #include "lldb/Symbol/Function.h"
     36 #include "lldb/Symbol/ObjectFile.h"
     37 #include "lldb/Symbol/SymbolContext.h"
     38 #include "lldb/Symbol/SymbolVendor.h"
     39 #include "lldb/Symbol/Type.h"
     40 #include "lldb/Symbol/TypeList.h"
     41 #include "lldb/Symbol/Variable.h"
     42 #include "lldb/Symbol/VariableList.h"
     43 #include "lldb/Target/ExecutionContext.h"
     44 #include "lldb/Target/ObjCLanguageRuntime.h"
     45 #include "lldb/Target/Process.h"
     46 #include "lldb/Target/RegisterContext.h"
     47 #include "lldb/Target/StackFrame.h"
     48 #include "lldb/Target/Target.h"
     49 #include "lldb/Target/Thread.h"
     50 
     51 using namespace lldb;
     52 using namespace lldb_private;
     53 using namespace clang;
     54 
     55 ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory, ExecutionContext &exe_ctx) :
     56     ClangASTSource (exe_ctx.GetTargetSP()),
     57     m_found_entities (),
     58     m_struct_members (),
     59     m_keep_result_in_memory (keep_result_in_memory),
     60     m_parser_vars (),
     61     m_struct_vars ()
     62 {
     63     EnableStructVars();
     64 }
     65 
     66 ClangExpressionDeclMap::~ClangExpressionDeclMap()
     67 {
     68     // Note: The model is now that the parser's AST context and all associated
     69     //   data does not vanish until the expression has been executed.  This means
     70     //   that valuable lookup data (like namespaces) doesn't vanish, but
     71 
     72     DidParse();
     73     DisableStructVars();
     74 }
     75 
     76 bool
     77 ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx,
     78                                   Materializer *materializer)
     79 {
     80     ClangASTMetrics::ClearLocalCounters();
     81 
     82     EnableParserVars();
     83     m_parser_vars->m_exe_ctx = exe_ctx;
     84 
     85     Target *target = exe_ctx.GetTargetPtr();
     86     if (exe_ctx.GetFramePtr())
     87         m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
     88     else if (exe_ctx.GetThreadPtr() && exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0))
     89         m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
     90     else if (exe_ctx.GetProcessPtr())
     91     {
     92         m_parser_vars->m_sym_ctx.Clear(true);
     93         m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
     94     }
     95     else if (target)
     96     {
     97         m_parser_vars->m_sym_ctx.Clear(true);
     98         m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
     99     }
    100 
    101     if (target)
    102     {
    103         m_parser_vars->m_persistent_vars = &target->GetPersistentVariables();
    104 
    105         if (!target->GetScratchClangASTContext())
    106             return false;
    107     }
    108 
    109     m_parser_vars->m_target_info = GetTargetInfo();
    110     m_parser_vars->m_materializer = materializer;
    111 
    112     return true;
    113 }
    114 
    115 void
    116 ClangExpressionDeclMap::DidParse()
    117 {
    118     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
    119 
    120     if (log)
    121         ClangASTMetrics::DumpCounters(log);
    122 
    123     if (m_parser_vars.get())
    124     {
    125         for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
    126              entity_index < num_entities;
    127              ++entity_index)
    128         {
    129             ClangExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
    130             if (var_sp)
    131                 var_sp->DisableParserVars(GetParserID());
    132         }
    133 
    134         for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
    135              pvar_index < num_pvars;
    136              ++pvar_index)
    137         {
    138             ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
    139             if (pvar_sp)
    140                 pvar_sp->DisableParserVars(GetParserID());
    141         }
    142 
    143         DisableParserVars();
    144     }
    145 }
    146 
    147 // Interface for IRForTarget
    148 
    149 ClangExpressionDeclMap::TargetInfo
    150 ClangExpressionDeclMap::GetTargetInfo()
    151 {
    152     assert (m_parser_vars.get());
    153 
    154     TargetInfo ret;
    155 
    156     ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
    157 
    158     Process *process = exe_ctx.GetProcessPtr();
    159     if (process)
    160     {
    161         ret.byte_order = process->GetByteOrder();
    162         ret.address_byte_size = process->GetAddressByteSize();
    163     }
    164     else
    165     {
    166         Target *target = exe_ctx.GetTargetPtr();
    167         if (target)
    168         {
    169             ret.byte_order = target->GetArchitecture().GetByteOrder();
    170             ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
    171         }
    172     }
    173 
    174     return ret;
    175 }
    176 
    177 bool
    178 ClangExpressionDeclMap::AddPersistentVariable
    179 (
    180     const NamedDecl *decl,
    181     const ConstString &name,
    182     TypeFromParser parser_type,
    183     bool is_result,
    184     bool is_lvalue
    185 )
    186 {
    187     assert (m_parser_vars.get());
    188 
    189     if (m_parser_vars->m_materializer && is_result)
    190     {
    191         Error err;
    192 
    193         ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
    194         Target *target = exe_ctx.GetTargetPtr();
    195         if (target == NULL)
    196             return false;
    197 
    198         ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
    199 
    200         TypeFromUser user_type(m_ast_importer->DeportType(context,
    201                                                           parser_type.GetASTContext(),
    202                                                           parser_type.GetOpaqueQualType()),
    203                                context);
    204 
    205         uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(user_type, is_lvalue, m_keep_result_in_memory, err);
    206 
    207         ClangExpressionVariableSP var_sp = m_found_entities.CreateVariable(exe_ctx.GetBestExecutionContextScope(),
    208                                                                            name,
    209                                                                            user_type,
    210                                                                            m_parser_vars->m_target_info.byte_order,
    211                                                                            m_parser_vars->m_target_info.address_byte_size);
    212 
    213         if (!var_sp)
    214             return false;
    215 
    216         var_sp->EnableParserVars(GetParserID());
    217 
    218         ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
    219 
    220         parser_vars->m_named_decl = decl;
    221         parser_vars->m_parser_type = parser_type;
    222 
    223         var_sp->EnableJITVars(GetParserID());
    224 
    225         ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
    226 
    227         jit_vars->m_offset = offset;
    228 
    229         return true;
    230     }
    231 
    232     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
    233     ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
    234     Target *target = exe_ctx.GetTargetPtr();
    235     if (target == NULL)
    236         return false;
    237 
    238     ASTContext *context(target->GetScratchClangASTContext()->getASTContext());
    239 
    240     TypeFromUser user_type(m_ast_importer->DeportType(context,
    241                                                       parser_type.GetASTContext(),
    242                                                       parser_type.GetOpaqueQualType()),
    243                            context);
    244 
    245     if (!user_type.GetOpaqueQualType())
    246     {
    247         if (log)
    248             log->Printf("Persistent variable's type wasn't copied successfully");
    249         return false;
    250     }
    251 
    252     if (!m_parser_vars->m_target_info.IsValid())
    253         return false;
    254 
    255     ClangExpressionVariableSP var_sp = m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
    256                                                                                                    name,
    257                                                                                                    user_type,
    258                                                                                                    m_parser_vars->m_target_info.byte_order,
    259                                                                                                    m_parser_vars->m_target_info.address_byte_size);
    260 
    261     if (!var_sp)
    262         return false;
    263 
    264     var_sp->m_frozen_sp->SetHasCompleteType();
    265 
    266     if (is_result)
    267         var_sp->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
    268     else
    269         var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
    270 
    271     if (is_lvalue)
    272     {
    273         var_sp->m_flags |= ClangExpressionVariable::EVIsProgramReference;
    274     }
    275     else
    276     {
    277         var_sp->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
    278         var_sp->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
    279     }
    280 
    281     if (m_keep_result_in_memory)
    282     {
    283         var_sp->m_flags |= ClangExpressionVariable::EVKeepInTarget;
    284     }
    285 
    286     if (log)
    287         log->Printf("Created persistent variable with flags 0x%hx", var_sp->m_flags);
    288 
    289     var_sp->EnableParserVars(GetParserID());
    290 
    291     ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
    292 
    293     parser_vars->m_named_decl = decl;
    294     parser_vars->m_parser_type = parser_type;
    295 
    296     return true;
    297 }
    298 
    299 bool
    300 ClangExpressionDeclMap::AddValueToStruct
    301 (
    302     const NamedDecl *decl,
    303     const ConstString &name,
    304     llvm::Value *value,
    305     size_t size,
    306     off_t alignment
    307 )
    308 {
    309     assert (m_struct_vars.get());
    310     assert (m_parser_vars.get());
    311 
    312     bool is_persistent_variable = false;
    313 
    314     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
    315 
    316     m_struct_vars->m_struct_laid_out = false;
    317 
    318     if (m_struct_members.GetVariable(decl, GetParserID()))
    319         return true;
    320 
    321     ClangExpressionVariableSP var_sp (m_found_entities.GetVariable(decl, GetParserID()));
    322 
    323     if (!var_sp)
    324     {
    325         var_sp = m_parser_vars->m_persistent_vars->GetVariable(decl, GetParserID());
    326         is_persistent_variable = true;
    327     }
    328 
    329     if (!var_sp)
    330         return false;
    331 
    332     if (log)
    333         log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
    334                     decl,
    335                     name.GetCString(),
    336                     var_sp->GetName().GetCString());
    337 
    338     // We know entity->m_parser_vars is valid because we used a parser variable
    339     // to find it
    340 
    341     ClangExpressionVariable::ParserVars *parser_vars = var_sp->GetParserVars(GetParserID());
    342 
    343     parser_vars->m_llvm_value = value;
    344 
    345     if (ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID()))
    346     {
    347         // We already laid this out; do not touch
    348 
    349         if (log)
    350             log->Printf("Already placed at 0x%llx", (unsigned long long)jit_vars->m_offset);
    351     }
    352 
    353     var_sp->EnableJITVars(GetParserID());
    354 
    355     ClangExpressionVariable::JITVars *jit_vars = var_sp->GetJITVars(GetParserID());
    356 
    357     jit_vars->m_alignment = alignment;
    358     jit_vars->m_size = size;
    359 
    360     m_struct_members.AddVariable(var_sp);
    361 
    362     if (m_parser_vars->m_materializer)
    363     {
    364         uint32_t offset = 0;
    365 
    366         Error err;
    367 
    368         if (is_persistent_variable)
    369         {
    370             offset = m_parser_vars->m_materializer->AddPersistentVariable(var_sp, err);
    371         }
    372         else
    373         {
    374             if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym)
    375                 offset = m_parser_vars->m_materializer->AddSymbol(*sym, err);
    376             else if (const RegisterInfo *reg_info = var_sp->GetRegisterInfo())
    377                 offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err);
    378             else if (parser_vars->m_lldb_var)
    379                 offset = m_parser_vars->m_materializer->AddVariable(parser_vars->m_lldb_var, err);
    380         }
    381 
    382         if (!err.Success())
    383             return false;
    384 
    385         if (log)
    386             log->Printf("Placed at 0x%llx", (unsigned long long)offset);
    387 
    388         jit_vars->m_offset = offset; // TODO DoStructLayout() should not change this.
    389     }
    390 
    391     return true;
    392 }
    393 
    394 bool
    395 ClangExpressionDeclMap::DoStructLayout ()
    396 {
    397     assert (m_struct_vars.get());
    398 
    399     if (m_struct_vars->m_struct_laid_out)
    400         return true;
    401 
    402     if (!m_parser_vars->m_materializer)
    403         return false;
    404 
    405     m_struct_vars->m_struct_alignment = m_parser_vars->m_materializer->GetStructAlignment();
    406     m_struct_vars->m_struct_size = m_parser_vars->m_materializer->GetStructByteSize();
    407     m_struct_vars->m_struct_laid_out = true;
    408     return true;
    409 }
    410 
    411 bool ClangExpressionDeclMap::GetStructInfo
    412 (
    413     uint32_t &num_elements,
    414     size_t &size,
    415     off_t &alignment
    416 )
    417 {
    418     assert (m_struct_vars.get());
    419 
    420     if (!m_struct_vars->m_struct_laid_out)
    421         return false;
    422 
    423     num_elements = m_struct_members.GetSize();
    424     size = m_struct_vars->m_struct_size;
    425     alignment = m_struct_vars->m_struct_alignment;
    426 
    427     return true;
    428 }
    429 
    430 bool
    431 ClangExpressionDeclMap::GetStructElement
    432 (
    433     const NamedDecl *&decl,
    434     llvm::Value *&value,
    435     off_t &offset,
    436     ConstString &name,
    437     uint32_t index
    438 )
    439 {
    440     assert (m_struct_vars.get());
    441 
    442     if (!m_struct_vars->m_struct_laid_out)
    443         return false;
    444 
    445     if (index >= m_struct_members.GetSize())
    446         return false;
    447 
    448     ClangExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
    449 
    450     if (!member_sp)
    451         return false;
    452 
    453     ClangExpressionVariable::ParserVars *parser_vars = member_sp->GetParserVars(GetParserID());
    454     ClangExpressionVariable::JITVars *jit_vars = member_sp->GetJITVars(GetParserID());
    455 
    456     if (!parser_vars ||
    457         !jit_vars ||
    458         !member_sp->GetValueObject())
    459         return false;
    460 
    461     decl = parser_vars->m_named_decl;
    462     value = parser_vars->m_llvm_value;
    463     offset = jit_vars->m_offset;
    464     name = member_sp->GetName();
    465 
    466     return true;
    467 }
    468 
    469 bool
    470 ClangExpressionDeclMap::GetFunctionInfo
    471 (
    472     const NamedDecl *decl,
    473     uint64_t &ptr
    474 )
    475 {
    476     ClangExpressionVariableSP entity_sp(m_found_entities.GetVariable(decl, GetParserID()));
    477 
    478     if (!entity_sp)
    479         return false;
    480 
    481     // We know m_parser_vars is valid since we searched for the variable by
    482     // its NamedDecl
    483 
    484     ClangExpressionVariable::ParserVars *parser_vars = entity_sp->GetParserVars(GetParserID());
    485 
    486     ptr = parser_vars->m_lldb_value.GetScalar().ULongLong();
    487 
    488     return true;
    489 }
    490 
    491 static void
    492 FindCodeSymbolInContext
    493 (
    494     const ConstString &name,
    495     SymbolContext &sym_ctx,
    496     SymbolContextList &sc_list
    497 )
    498 {
    499     SymbolContextList temp_sc_list;
    500     if (sym_ctx.module_sp)
    501         sym_ctx.module_sp->FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
    502 
    503     if (!sc_list.GetSize() && sym_ctx.target_sp)
    504         sym_ctx.target_sp->GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, temp_sc_list);
    505 
    506     unsigned temp_sc_list_size = temp_sc_list.GetSize();
    507     for (unsigned i = 0; i < temp_sc_list_size; i++)
    508     {
    509         SymbolContext sym_ctx;
    510         temp_sc_list.GetContextAtIndex(i, sym_ctx);
    511         if (sym_ctx.symbol)
    512         {
    513             switch (sym_ctx.symbol->GetType())
    514             {
    515                 case eSymbolTypeCode:
    516                 case eSymbolTypeResolver:
    517                     sc_list.Append(sym_ctx);
    518                     break;
    519 
    520                 default:
    521                     break;
    522             }
    523         }
    524     }
    525 }
    526 
    527 bool
    528 ClangExpressionDeclMap::GetFunctionAddress
    529 (
    530     const ConstString &name,
    531     uint64_t &func_addr
    532 )
    533 {
    534     assert (m_parser_vars.get());
    535 
    536     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
    537     ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
    538     Target *target = exe_ctx.GetTargetPtr();
    539     // Back out in all cases where we're not fully initialized
    540     if (target == NULL)
    541         return false;
    542     if (!m_parser_vars->m_sym_ctx.target_sp)
    543         return false;
    544 
    545     SymbolContextList sc_list;
    546 
    547     FindCodeSymbolInContext(name, m_parser_vars->m_sym_ctx, sc_list);
    548 
    549     if (!sc_list.GetSize())
    550     {
    551         // We occasionally get debug information in which a const function is reported
    552         // as non-const, so the mangled name is wrong.  This is a hack to compensate.
    553 
    554         if (!strncmp(name.GetCString(), "_ZN", 3) &&
    555             strncmp(name.GetCString(), "_ZNK", 4))
    556         {
    557             std::string fixed_scratch("_ZNK");
    558             fixed_scratch.append(name.GetCString() + 3);
    559             ConstString fixed_name(fixed_scratch.c_str());
    560 
    561             if (log)
    562                 log->Printf("Failed to find symbols given non-const name %s; trying %s", name.GetCString(), fixed_name.GetCString());
    563 
    564             FindCodeSymbolInContext(fixed_name, m_parser_vars->m_sym_ctx, sc_list);
    565         }
    566     }
    567 
    568     if (!sc_list.GetSize())
    569         return false;
    570 
    571     SymbolContext sym_ctx;
    572     sc_list.GetContextAtIndex(0, sym_ctx);
    573 
    574     const Address *func_so_addr = NULL;
    575     bool is_indirect_function = false;
    576 
    577     if (sym_ctx.function)
    578         func_so_addr = &sym_ctx.function->GetAddressRange().GetBaseAddress();
    579     else if (sym_ctx.symbol) {
    580         func_so_addr = &sym_ctx.symbol->GetAddress();
    581         is_indirect_function = sym_ctx.symbol->IsIndirect();
    582     } else
    583         return false;
    584 
    585     if (!func_so_addr || !func_so_addr->IsValid())
    586         return false;
    587 
    588     func_addr = func_so_addr->GetCallableLoadAddress (target, is_indirect_function);
    589 
    590     return true;
    591 }
    592 
    593 addr_t
    594 ClangExpressionDeclMap::GetSymbolAddress (Target &target, Process *process, const ConstString &name, lldb::SymbolType symbol_type)
    595 {
    596     SymbolContextList sc_list;
    597 
    598     target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
    599 
    600     const uint32_t num_matches = sc_list.GetSize();
    601     addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
    602 
    603     for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++)
    604     {
    605         SymbolContext sym_ctx;
    606         sc_list.GetContextAtIndex(i, sym_ctx);
    607 
    608         const Address *sym_address = &sym_ctx.symbol->GetAddress();
    609 
    610         if (!sym_address || !sym_address->IsValid())
    611             continue;
    612 
    613         if (sym_address)
    614         {
    615             switch (sym_ctx.symbol->GetType())
    616             {
    617                 case eSymbolTypeCode:
    618                 case eSymbolTypeTrampoline:
    619                     symbol_load_addr = sym_address->GetCallableLoadAddress (&target);
    620                     break;
    621 
    622                 case eSymbolTypeResolver:
    623                     symbol_load_addr = sym_address->GetCallableLoadAddress (&target, true);
    624                     break;
    625 
    626                 case eSymbolTypeData:
    627                 case eSymbolTypeRuntime:
    628                 case eSymbolTypeVariable:
    629                 case eSymbolTypeLocal:
    630                 case eSymbolTypeParam:
    631                 case eSymbolTypeInvalid:
    632                 case eSymbolTypeAbsolute:
    633                 case eSymbolTypeException:
    634                 case eSymbolTypeSourceFile:
    635                 case eSymbolTypeHeaderFile:
    636                 case eSymbolTypeObjectFile:
    637                 case eSymbolTypeCommonBlock:
    638                 case eSymbolTypeBlock:
    639                 case eSymbolTypeVariableType:
    640                 case eSymbolTypeLineEntry:
    641                 case eSymbolTypeLineHeader:
    642                 case eSymbolTypeScopeBegin:
    643                 case eSymbolTypeScopeEnd:
    644                 case eSymbolTypeAdditional:
    645                 case eSymbolTypeCompiler:
    646                 case eSymbolTypeInstrumentation:
    647                 case eSymbolTypeUndefined:
    648                 case eSymbolTypeObjCClass:
    649                 case eSymbolTypeObjCMetaClass:
    650                 case eSymbolTypeObjCIVar:
    651                     symbol_load_addr = sym_address->GetLoadAddress (&target);
    652                     break;
    653             }
    654         }
    655     }
    656 
    657     if (symbol_load_addr == LLDB_INVALID_ADDRESS && process)
    658     {
    659         ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
    660 
    661         if (runtime)
    662         {
    663             symbol_load_addr = runtime->LookupRuntimeSymbol(name);
    664         }
    665     }
    666 
    667     return symbol_load_addr;
    668 }
    669 
    670 addr_t
    671 ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
    672 {
    673     assert (m_parser_vars.get());
    674 
    675     if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
    676         return false;
    677 
    678     return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), m_parser_vars->m_exe_ctx.GetProcessPtr(), name, symbol_type);
    679 }
    680 
    681 const Symbol *
    682 ClangExpressionDeclMap::FindGlobalDataSymbol (Target &target,
    683                                               const ConstString &name)
    684 {
    685     SymbolContextList sc_list;
    686 
    687     target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
    688 
    689     const uint32_t matches = sc_list.GetSize();
    690     for (uint32_t i=0; i<matches; ++i)
    691     {
    692         SymbolContext sym_ctx;
    693         sc_list.GetContextAtIndex(i, sym_ctx);
    694         if (sym_ctx.symbol)
    695         {
    696             const Symbol *symbol = sym_ctx.symbol;
    697             const Address *sym_address = &symbol->GetAddress();
    698 
    699             if (sym_address && sym_address->IsValid())
    700             {
    701                 switch (symbol->GetType())
    702                 {
    703                     case eSymbolTypeData:
    704                     case eSymbolTypeRuntime:
    705                     case eSymbolTypeAbsolute:
    706                     case eSymbolTypeObjCClass:
    707                     case eSymbolTypeObjCMetaClass:
    708                     case eSymbolTypeObjCIVar:
    709                         if (symbol->GetDemangledNameIsSynthesized())
    710                         {
    711                             // If the demangled name was synthesized, then don't use it
    712                             // for expressions. Only let the symbol match if the mangled
    713                             // named matches for these symbols.
    714                             if (symbol->GetMangled().GetMangledName() != name)
    715                                 break;
    716                         }
    717                         return symbol;
    718 
    719                     case eSymbolTypeCode: // We already lookup functions elsewhere
    720                     case eSymbolTypeVariable:
    721                     case eSymbolTypeLocal:
    722                     case eSymbolTypeParam:
    723                     case eSymbolTypeTrampoline:
    724                     case eSymbolTypeInvalid:
    725                     case eSymbolTypeException:
    726                     case eSymbolTypeSourceFile:
    727                     case eSymbolTypeHeaderFile:
    728                     case eSymbolTypeObjectFile:
    729                     case eSymbolTypeCommonBlock:
    730                     case eSymbolTypeBlock:
    731                     case eSymbolTypeVariableType:
    732                     case eSymbolTypeLineEntry:
    733                     case eSymbolTypeLineHeader:
    734                     case eSymbolTypeScopeBegin:
    735                     case eSymbolTypeScopeEnd:
    736                     case eSymbolTypeAdditional:
    737                     case eSymbolTypeCompiler:
    738                     case eSymbolTypeInstrumentation:
    739                     case eSymbolTypeUndefined:
    740                     case eSymbolTypeResolver:
    741                         break;
    742                 }
    743             }
    744         }
    745     }
    746 
    747     return NULL;
    748 }
    749 
    750 lldb::VariableSP
    751 ClangExpressionDeclMap::FindGlobalVariable
    752 (
    753     Target &target,
    754     ModuleSP &module,
    755     const ConstString &name,
    756     ClangNamespaceDecl *namespace_decl,
    757     TypeFromUser *type
    758 )
    759 {
    760     VariableList vars;
    761 
    762     if (module && namespace_decl)
    763         module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
    764     else
    765         target.GetImages().FindGlobalVariables(name, true, -1, vars);
    766 
    767     if (vars.GetSize())
    768     {
    769         if (type)
    770         {
    771             for (size_t i = 0; i < vars.GetSize(); ++i)
    772             {
    773                 VariableSP var_sp = vars.GetVariableAtIndex(i);
    774 
    775                 if (ClangASTContext::AreTypesSame(*type, var_sp->GetType()->GetClangFullType()))
    776                     return var_sp;
    777             }
    778         }
    779         else
    780         {
    781             return vars.GetVariableAtIndex(0);
    782         }
    783     }
    784 
    785     return VariableSP();
    786 }
    787 
    788 // Interface for ClangASTSource
    789 
    790 void
    791 ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context)
    792 {
    793     assert (m_ast_context);
    794 
    795     ClangASTMetrics::RegisterVisibleQuery();
    796 
    797     const ConstString name(context.m_decl_name.getAsString().c_str());
    798 
    799     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
    800 
    801     if (GetImportInProgress())
    802     {
    803         if (log && log->GetVerbose())
    804             log->Printf("Ignoring a query during an import");
    805         return;
    806     }
    807 
    808     static unsigned int invocation_id = 0;
    809     unsigned int current_id = invocation_id++;
    810 
    811     if (log)
    812     {
    813         if (!context.m_decl_context)
    814             log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a NULL DeclContext", current_id, name.GetCString());
    815         else if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context.m_decl_context))
    816             log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in '%s'", current_id, name.GetCString(), context_named_decl->getNameAsString().c_str());
    817         else
    818             log->Printf("ClangExpressionDeclMap::FindExternalVisibleDecls[%u] for '%s' in a '%s'", current_id, name.GetCString(), context.m_decl_context->getDeclKindName());
    819     }
    820 
    821     if (const NamespaceDecl *namespace_context = dyn_cast<NamespaceDecl>(context.m_decl_context))
    822     {
    823         ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer->GetNamespaceMap(namespace_context);
    824 
    825         if (log && log->GetVerbose())
    826             log->Printf("  CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
    827                         current_id,
    828                         namespace_map.get(),
    829                         (int)namespace_map->size());
    830 
    831         if (!namespace_map)
    832             return;
    833 
    834         for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
    835              i != e;
    836              ++i)
    837         {
    838             if (log)
    839                 log->Printf("  CEDM::FEVD[%u] Searching namespace %s in module %s",
    840                             current_id,
    841                             i->second.GetNamespaceDecl()->getNameAsString().c_str(),
    842                             i->first->GetFileSpec().GetFilename().GetCString());
    843 
    844             FindExternalVisibleDecls(context,
    845                                      i->first,
    846                                      i->second,
    847                                      current_id);
    848         }
    849     }
    850     else if (isa<TranslationUnitDecl>(context.m_decl_context))
    851     {
    852         ClangNamespaceDecl namespace_decl;
    853 
    854         if (log)
    855             log->Printf("  CEDM::FEVD[%u] Searching the root namespace", current_id);
    856 
    857         FindExternalVisibleDecls(context,
    858                                  lldb::ModuleSP(),
    859                                  namespace_decl,
    860                                  current_id);
    861     }
    862 
    863     if (!context.m_found.variable)
    864         ClangASTSource::FindExternalVisibleDecls(context);
    865 }
    866 
    867 void
    868 ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
    869                                                   lldb::ModuleSP module_sp,
    870                                                   ClangNamespaceDecl &namespace_decl,
    871                                                   unsigned int current_id)
    872 {
    873     assert (m_ast_context);
    874 
    875     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
    876 
    877     SymbolContextList sc_list;
    878 
    879     const ConstString name(context.m_decl_name.getAsString().c_str());
    880 
    881     const char *name_unique_cstr = name.GetCString();
    882 
    883     if (name_unique_cstr == NULL)
    884         return;
    885 
    886     static ConstString id_name("id");
    887     static ConstString Class_name("Class");
    888 
    889     if (name == id_name || name == Class_name)
    890         return;
    891 
    892     // Only look for functions by name out in our symbols if the function
    893     // doesn't start with our phony prefix of '$'
    894     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
    895     StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
    896     if (name_unique_cstr[0] == '$' && !namespace_decl)
    897     {
    898         static ConstString g_lldb_class_name ("$__lldb_class");
    899 
    900         if (name == g_lldb_class_name)
    901         {
    902             // Clang is looking for the type of "this"
    903 
    904             if (frame == NULL)
    905                 return;
    906 
    907             SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
    908 
    909             if (!sym_ctx.function)
    910                 return;
    911 
    912             // Get the block that defines the function
    913             Block *function_block = sym_ctx.GetFunctionBlock();
    914 
    915             if (!function_block)
    916                 return;
    917 
    918             clang::DeclContext *decl_context = function_block->GetClangDeclContext();
    919 
    920             if (!decl_context)
    921                 return;
    922 
    923             clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_context);
    924 
    925             if (method_decl)
    926             {
    927                 clang::CXXRecordDecl *class_decl = method_decl->getParent();
    928 
    929                 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
    930 
    931                 TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
    932                                               &class_decl->getASTContext());
    933 
    934                 if (log)
    935                 {
    936                     ASTDumper ast_dumper(class_qual_type);
    937                     log->Printf("  CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
    938                 }
    939 
    940                 TypeFromParser class_type = CopyClassType(class_user_type, current_id);
    941 
    942                 if (!class_type.IsValid())
    943                     return;
    944 
    945                 TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(QualType::getFromOpaquePtr(class_type.GetOpaqueQualType()));
    946 
    947                 if (!type_source_info)
    948                     return;
    949 
    950                 TypedefDecl *typedef_decl = TypedefDecl::Create(*m_ast_context,
    951                                                                 m_ast_context->getTranslationUnitDecl(),
    952                                                                 SourceLocation(),
    953                                                                 SourceLocation(),
    954                                                                 context.m_decl_name.getAsIdentifierInfo(),
    955                                                                 type_source_info);
    956 
    957 
    958                 if (!typedef_decl)
    959                     return;
    960 
    961                 context.AddNamedDecl(typedef_decl);
    962 
    963                 if (method_decl->isInstance())
    964                 {
    965                     // self is a pointer to the object
    966 
    967                     QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
    968 
    969                     TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
    970                                                 &method_decl->getASTContext());
    971 
    972                     m_struct_vars->m_object_pointer_type = self_user_type;
    973                 }
    974             }
    975             else
    976             {
    977                 // This branch will get hit if we are executing code in the context of a function that
    978                 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
    979                 // method of the class.  In that case, just look up the "this" variable in the the current
    980                 // scope and use its type.
    981                 // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer
    982                 // for C++ so it hasn't actually been tested.
    983 
    984                 VariableList *vars = frame->GetVariableList(false);
    985 
    986                 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
    987 
    988                 if (this_var &&
    989                     this_var->IsInScope(frame) &&
    990                     this_var->LocationIsValidForFrame (frame))
    991                 {
    992                     Type *this_type = this_var->GetType();
    993 
    994                     if (!this_type)
    995                         return;
    996 
    997                     ClangASTType pointee_type = this_type->GetClangForwardType().GetPointeeType();
    998 
    999                     if (pointee_type.IsValid())
   1000                     {
   1001                         if (log)
   1002                         {
   1003                             ASTDumper ast_dumper(this_type->GetClangFullType());
   1004                             log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
   1005                         }
   1006 
   1007                         TypeFromUser class_user_type(pointee_type);
   1008                         AddOneType(context, class_user_type, current_id);
   1009 
   1010 
   1011                         TypeFromUser this_user_type(this_type->GetClangFullType());
   1012                         m_struct_vars->m_object_pointer_type = this_user_type;
   1013                         return;
   1014                     }
   1015                 }
   1016             }
   1017 
   1018             return;
   1019         }
   1020 
   1021         static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
   1022         if (name == g_lldb_objc_class_name)
   1023         {
   1024             // Clang is looking for the type of "*self"
   1025 
   1026             if (!frame)
   1027                 return;
   1028 
   1029             SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction);
   1030 
   1031             if (!sym_ctx.function)
   1032                 return;
   1033 
   1034             // Get the block that defines the function
   1035             Block *function_block = sym_ctx.GetFunctionBlock();
   1036 
   1037             if (!function_block)
   1038                 return;
   1039 
   1040             clang::DeclContext *decl_context = function_block->GetClangDeclContext();
   1041 
   1042             if (!decl_context)
   1043                 return;
   1044 
   1045             clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_context);
   1046 
   1047             if (method_decl)
   1048             {
   1049                 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
   1050 
   1051                 if (!self_interface)
   1052                     return;
   1053 
   1054                 const clang::Type *interface_type = self_interface->getTypeForDecl();
   1055 
   1056                 if (!interface_type)
   1057                     return; // This is unlikely, but we have seen crashes where this occurred
   1058 
   1059                 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
   1060                                              &method_decl->getASTContext());
   1061 
   1062                 if (log)
   1063                 {
   1064                     ASTDumper ast_dumper(interface_type);
   1065                     log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
   1066                 }
   1067 
   1068                 AddOneType(context, class_user_type, current_id);
   1069 
   1070                 if (method_decl->isInstanceMethod())
   1071                 {
   1072                     // self is a pointer to the object
   1073 
   1074                     QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
   1075 
   1076                     TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
   1077                                                 &method_decl->getASTContext());
   1078 
   1079                     m_struct_vars->m_object_pointer_type = self_user_type;
   1080                 }
   1081                 else
   1082                 {
   1083                     // self is a Class pointer
   1084                     QualType class_type = method_decl->getASTContext().getObjCClassType();
   1085 
   1086                     TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
   1087                                                 &method_decl->getASTContext());
   1088 
   1089                     m_struct_vars->m_object_pointer_type = self_user_type;
   1090                 }
   1091 
   1092                 return;
   1093             }
   1094             else
   1095             {
   1096                 // This branch will get hit if we are executing code in the context of a function that
   1097                 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
   1098                 // method of the class.  In that case, just look up the "self" variable in the the current
   1099                 // scope and use its type.
   1100 
   1101                 VariableList *vars = frame->GetVariableList(false);
   1102 
   1103                 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
   1104 
   1105                 if (self_var &&
   1106                     self_var->IsInScope(frame) &&
   1107                     self_var->LocationIsValidForFrame (frame))
   1108                 {
   1109                     Type *self_type = self_var->GetType();
   1110 
   1111                     if (!self_type)
   1112                         return;
   1113 
   1114                     ClangASTType self_clang_type = self_type->GetClangFullType();
   1115 
   1116                     if (self_clang_type.IsObjCClassType())
   1117                     {
   1118                         return;
   1119                     }
   1120                     else if (self_clang_type.IsObjCObjectPointerType())
   1121                     {
   1122                         self_clang_type = self_clang_type.GetPointeeType();
   1123 
   1124                         if (!self_clang_type)
   1125                             return;
   1126 
   1127                         if (log)
   1128                         {
   1129                             ASTDumper ast_dumper(self_type->GetClangFullType());
   1130                             log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
   1131                         }
   1132 
   1133                         TypeFromUser class_user_type (self_clang_type);
   1134 
   1135                         AddOneType(context, class_user_type, current_id);
   1136 
   1137                         TypeFromUser self_user_type(self_type->GetClangFullType());
   1138 
   1139                         m_struct_vars->m_object_pointer_type = self_user_type;
   1140                         return;
   1141                     }
   1142                 }
   1143             }
   1144 
   1145             return;
   1146         }
   1147 
   1148         // any other $__lldb names should be weeded out now
   1149         if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
   1150             return;
   1151 
   1152         do
   1153         {
   1154             if (!target)
   1155                 break;
   1156 
   1157             ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
   1158 
   1159             if (!scratch_clang_ast_context)
   1160                 break;
   1161 
   1162             ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
   1163 
   1164             if (!scratch_ast_context)
   1165                 break;
   1166 
   1167             TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
   1168 
   1169             if (!ptype_type_decl)
   1170                 break;
   1171 
   1172             Decl *parser_ptype_decl = m_ast_importer->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
   1173 
   1174             if (!parser_ptype_decl)
   1175                 break;
   1176 
   1177             TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
   1178 
   1179             if (!parser_ptype_type_decl)
   1180                 break;
   1181 
   1182             if (log)
   1183                 log->Printf("  CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
   1184 
   1185             context.AddNamedDecl(parser_ptype_type_decl);
   1186         } while (0);
   1187 
   1188         ClangExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
   1189 
   1190         if (pvar_sp)
   1191         {
   1192             AddOneVariable(context, pvar_sp, current_id);
   1193             return;
   1194         }
   1195 
   1196         const char *reg_name(&name.GetCString()[1]);
   1197 
   1198         if (m_parser_vars->m_exe_ctx.GetRegisterContext())
   1199         {
   1200             const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
   1201 
   1202             if (reg_info)
   1203             {
   1204                 if (log)
   1205                     log->Printf("  CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
   1206 
   1207                 AddOneRegister(context, reg_info, current_id);
   1208             }
   1209         }
   1210     }
   1211     else
   1212     {
   1213         ValueObjectSP valobj;
   1214         VariableSP var;
   1215         Error err;
   1216 
   1217         if (frame && !namespace_decl)
   1218         {
   1219             valobj = frame->GetValueForVariableExpressionPath(name_unique_cstr,
   1220                                                               eNoDynamicValues,
   1221                                                               StackFrame::eExpressionPathOptionCheckPtrVsMember ||
   1222                                                               StackFrame::eExpressionPathOptionsAllowDirectIVarAccess ||
   1223                                                               StackFrame::eExpressionPathOptionsNoFragileObjcIvar ||
   1224                                                               StackFrame::eExpressionPathOptionsNoSyntheticChildren ||
   1225                                                               StackFrame::eExpressionPathOptionsNoSyntheticArrayRange,
   1226                                                               var,
   1227                                                               err);
   1228 
   1229             // If we found a variable in scope, no need to pull up function names
   1230             if (err.Success() && var)
   1231             {
   1232                 AddOneVariable(context, var, valobj, current_id);
   1233                 context.m_found.variable = true;
   1234                 return;
   1235             }
   1236         }
   1237 
   1238         if (target)
   1239         {
   1240             var = FindGlobalVariable (*target,
   1241                                       module_sp,
   1242                                       name,
   1243                                       &namespace_decl,
   1244                                       NULL);
   1245 
   1246             if (var)
   1247             {
   1248                 valobj = ValueObjectVariable::Create(target, var);
   1249                 AddOneVariable(context, var, valobj, current_id);
   1250                 context.m_found.variable = true;
   1251                 return;
   1252             }
   1253         }
   1254 
   1255         if (!context.m_found.variable)
   1256         {
   1257             const bool include_inlines = false;
   1258             const bool append = false;
   1259 
   1260             if (namespace_decl && module_sp)
   1261             {
   1262                 const bool include_symbols = false;
   1263 
   1264                 module_sp->FindFunctions(name,
   1265                                          &namespace_decl,
   1266                                          eFunctionNameTypeBase,
   1267                                          include_symbols,
   1268                                          include_inlines,
   1269                                          append,
   1270                                          sc_list);
   1271             }
   1272             else if (target && !namespace_decl)
   1273             {
   1274                 const bool include_symbols = true;
   1275 
   1276                 // TODO Fix FindFunctions so that it doesn't return
   1277                 //   instance methods for eFunctionNameTypeBase.
   1278 
   1279                 target->GetImages().FindFunctions(name,
   1280                                                   eFunctionNameTypeFull,
   1281                                                   include_symbols,
   1282                                                   include_inlines,
   1283                                                   append,
   1284                                                   sc_list);
   1285             }
   1286 
   1287             if (sc_list.GetSize())
   1288             {
   1289                 Symbol *generic_symbol = NULL;
   1290                 Symbol *non_extern_symbol = NULL;
   1291 
   1292                 for (uint32_t index = 0, num_indices = sc_list.GetSize();
   1293                      index < num_indices;
   1294                      ++index)
   1295                 {
   1296                     SymbolContext sym_ctx;
   1297                     sc_list.GetContextAtIndex(index, sym_ctx);
   1298 
   1299                     if (sym_ctx.function)
   1300                     {
   1301                         clang::DeclContext *decl_ctx = sym_ctx.function->GetClangDeclContext();
   1302 
   1303                         if (!decl_ctx)
   1304                             continue;
   1305 
   1306                         // Filter out class/instance methods.
   1307                         if (dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
   1308                             continue;
   1309                         if (dyn_cast<clang::CXXMethodDecl>(decl_ctx))
   1310                             continue;
   1311 
   1312                         AddOneFunction(context, sym_ctx.function, NULL, current_id);
   1313                         context.m_found.function_with_type_info = true;
   1314                         context.m_found.function = true;
   1315                     }
   1316                     else if (sym_ctx.symbol)
   1317                     {
   1318                         if (sym_ctx.symbol->IsExternal())
   1319                             generic_symbol = sym_ctx.symbol;
   1320                         else
   1321                             non_extern_symbol = sym_ctx.symbol;
   1322                     }
   1323                 }
   1324 
   1325                 if (!context.m_found.function_with_type_info)
   1326                 {
   1327                     if (generic_symbol)
   1328                     {
   1329                         AddOneFunction (context, NULL, generic_symbol, current_id);
   1330                         context.m_found.function = true;
   1331                     }
   1332                     else if (non_extern_symbol)
   1333                     {
   1334                         AddOneFunction (context, NULL, non_extern_symbol, current_id);
   1335                         context.m_found.function = true;
   1336                     }
   1337                 }
   1338             }
   1339 
   1340             if (target && !context.m_found.variable && !namespace_decl)
   1341             {
   1342                 // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
   1343                 // data symbol, and -- if it is found -- treat it as a variable.
   1344 
   1345                 const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
   1346 
   1347                 if (data_symbol)
   1348                 {
   1349                     AddOneGenericVariable(context, *data_symbol, current_id);
   1350                     context.m_found.variable = true;
   1351                 }
   1352             }
   1353         }
   1354     }
   1355 }
   1356 
   1357 static clang_type_t
   1358 MaybePromoteToBlockPointerType
   1359 (
   1360     ASTContext *ast_context,
   1361     clang_type_t candidate_type
   1362 )
   1363 {
   1364     if (!candidate_type)
   1365         return candidate_type;
   1366 
   1367     QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
   1368 
   1369     const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
   1370 
   1371     if (!candidate_pointer_type)
   1372         return candidate_type;
   1373 
   1374     QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
   1375 
   1376     const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
   1377 
   1378     if (!pointee_record_type)
   1379         return candidate_type;
   1380 
   1381     RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
   1382 
   1383     if (!pointee_record_decl->isRecord())
   1384         return candidate_type;
   1385 
   1386     if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
   1387         return candidate_type;
   1388 
   1389     QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
   1390     QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
   1391 
   1392     return block_pointer_type.getAsOpaquePtr();
   1393 }
   1394 
   1395 bool
   1396 ClangExpressionDeclMap::GetVariableValue (VariableSP &var,
   1397                                           lldb_private::Value &var_location,
   1398                                           TypeFromUser *user_type,
   1399                                           TypeFromParser *parser_type)
   1400 {
   1401     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1402 
   1403     Type *var_type = var->GetType();
   1404 
   1405     if (!var_type)
   1406     {
   1407         if (log)
   1408             log->PutCString("Skipped a definition because it has no type");
   1409         return false;
   1410     }
   1411 
   1412     ClangASTType var_clang_type = var_type->GetClangFullType();
   1413 
   1414     if (!var_clang_type)
   1415     {
   1416         if (log)
   1417             log->PutCString("Skipped a definition because it has no Clang type");
   1418         return false;
   1419     }
   1420 
   1421     // commented out because of <rdar://problem/11024417>
   1422     ASTContext *ast = var_type->GetClangASTContext().getASTContext();
   1423 
   1424     if (!ast)
   1425     {
   1426         if (log)
   1427             log->PutCString("There is no AST context for the current execution context");
   1428         return false;
   1429     }
   1430     //var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type);
   1431 
   1432     DWARFExpression &var_location_expr = var->LocationExpression();
   1433 
   1434     lldb::addr_t loclist_base_load_addr = LLDB_INVALID_ADDRESS;
   1435 
   1436     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
   1437 
   1438     if (var_location_expr.IsLocationList())
   1439     {
   1440         SymbolContext var_sc;
   1441         var->CalculateSymbolContext (&var_sc);
   1442         loclist_base_load_addr = var_sc.function->GetAddressRange().GetBaseAddress().GetLoadAddress (target);
   1443     }
   1444     Error err;
   1445 
   1446     if (var->GetLocationIsConstantValueData())
   1447     {
   1448         DataExtractor const_value_extractor;
   1449 
   1450         if (var_location_expr.GetExpressionData(const_value_extractor))
   1451         {
   1452             var_location = Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize());
   1453             var_location.SetValueType(Value::eValueTypeHostAddress);
   1454         }
   1455         else
   1456         {
   1457             if (log)
   1458                 log->Printf("Error evaluating constant variable: %s", err.AsCString());
   1459             return false;
   1460         }
   1461     }
   1462 
   1463     ClangASTType type_to_use = GuardedCopyType(var_clang_type);
   1464 
   1465     if (!type_to_use)
   1466     {
   1467         if (log)
   1468             log->Printf("Couldn't copy a variable's type into the parser's AST context");
   1469 
   1470         return false;
   1471     }
   1472 
   1473     if (parser_type)
   1474         *parser_type = TypeFromParser(type_to_use);
   1475 
   1476     if (var_location.GetContextType() == Value::eContextTypeInvalid)
   1477         var_location.SetClangType(type_to_use);
   1478 
   1479     if (var_location.GetValueType() == Value::eValueTypeFileAddress)
   1480     {
   1481         SymbolContext var_sc;
   1482         var->CalculateSymbolContext(&var_sc);
   1483 
   1484         if (!var_sc.module_sp)
   1485             return false;
   1486 
   1487         Address so_addr(var_location.GetScalar().ULongLong(), var_sc.module_sp->GetSectionList());
   1488 
   1489         lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
   1490 
   1491         if (load_addr != LLDB_INVALID_ADDRESS)
   1492         {
   1493             var_location.GetScalar() = load_addr;
   1494             var_location.SetValueType(Value::eValueTypeLoadAddress);
   1495         }
   1496     }
   1497 
   1498     if (user_type)
   1499         *user_type = TypeFromUser(var_clang_type);
   1500 
   1501     return true;
   1502 }
   1503 
   1504 void
   1505 ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
   1506 {
   1507     assert (m_parser_vars.get());
   1508 
   1509     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1510 
   1511     TypeFromUser ut;
   1512     TypeFromParser pt;
   1513     Value var_location;
   1514 
   1515     if (!GetVariableValue (var, var_location, &ut, &pt))
   1516         return;
   1517 
   1518     clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
   1519 
   1520     if (parser_opaque_type.isNull())
   1521         return;
   1522 
   1523     if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
   1524     {
   1525         if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
   1526             CompleteType(tag_type->getDecl());
   1527     }
   1528 
   1529 
   1530     bool is_reference = pt.IsReferenceType();
   1531 
   1532     NamedDecl *var_decl = NULL;
   1533     if (is_reference)
   1534         var_decl = context.AddVarDecl(pt);
   1535     else
   1536         var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
   1537 
   1538     std::string decl_name(context.m_decl_name.getAsString());
   1539     ConstString entity_name(decl_name.c_str());
   1540     ClangExpressionVariableSP entity(m_found_entities.CreateVariable (valobj));
   1541 
   1542     assert (entity.get());
   1543     entity->EnableParserVars(GetParserID());
   1544     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
   1545     parser_vars->m_parser_type = pt;
   1546     parser_vars->m_named_decl  = var_decl;
   1547     parser_vars->m_llvm_value  = NULL;
   1548     parser_vars->m_lldb_value  = var_location;
   1549     parser_vars->m_lldb_var    = var;
   1550 
   1551     if (is_reference)
   1552         entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
   1553 
   1554     if (log)
   1555     {
   1556         ASTDumper orig_dumper(ut.GetOpaqueQualType());
   1557         ASTDumper ast_dumper(var_decl);
   1558         log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString());
   1559     }
   1560 }
   1561 
   1562 void
   1563 ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
   1564                                        ClangExpressionVariableSP &pvar_sp,
   1565                                        unsigned int current_id)
   1566 {
   1567     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1568 
   1569     TypeFromUser user_type (pvar_sp->GetTypeFromUser());
   1570 
   1571     TypeFromParser parser_type (GuardedCopyType(user_type));
   1572 
   1573     if (!parser_type.GetOpaqueQualType())
   1574     {
   1575         if (log)
   1576             log->Printf("  CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
   1577         return;
   1578     }
   1579 
   1580     NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType());
   1581 
   1582     pvar_sp->EnableParserVars(GetParserID());
   1583     ClangExpressionVariable::ParserVars *parser_vars = pvar_sp->GetParserVars(GetParserID());
   1584     parser_vars->m_parser_type = parser_type;
   1585     parser_vars->m_named_decl = var_decl;
   1586     parser_vars->m_llvm_value = NULL;
   1587     parser_vars->m_lldb_value.Clear();
   1588 
   1589     if (log)
   1590     {
   1591         ASTDumper ast_dumper(var_decl);
   1592         log->Printf("  CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
   1593     }
   1594 }
   1595 
   1596 void
   1597 ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
   1598                                               const Symbol &symbol,
   1599                                               unsigned int current_id)
   1600 {
   1601     assert(m_parser_vars.get());
   1602 
   1603     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1604 
   1605     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
   1606 
   1607     if (target == NULL)
   1608         return;
   1609 
   1610     ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
   1611 
   1612     TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
   1613     TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
   1614     NamedDecl *var_decl = context.AddVarDecl(parser_type);
   1615 
   1616     std::string decl_name(context.m_decl_name.getAsString());
   1617     ConstString entity_name(decl_name.c_str());
   1618     ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
   1619                                                                       entity_name,
   1620                                                                       user_type,
   1621                                                                       m_parser_vars->m_target_info.byte_order,
   1622                                                                       m_parser_vars->m_target_info.address_byte_size));
   1623     assert (entity.get());
   1624 
   1625     entity->EnableParserVars(GetParserID());
   1626     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
   1627 
   1628     const Address &symbol_address = symbol.GetAddress();
   1629     lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
   1630 
   1631     //parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
   1632     parser_vars->m_lldb_value.SetClangType(user_type);
   1633     parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
   1634     parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
   1635 
   1636     parser_vars->m_parser_type = parser_type;
   1637     parser_vars->m_named_decl  = var_decl;
   1638     parser_vars->m_llvm_value  = NULL;
   1639     parser_vars->m_lldb_sym    = &symbol;
   1640 
   1641     if (log)
   1642     {
   1643         ASTDumper ast_dumper(var_decl);
   1644 
   1645         log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
   1646     }
   1647 }
   1648 
   1649 bool
   1650 ClangExpressionDeclMap::ResolveUnknownTypes()
   1651 {
   1652     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1653     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
   1654 
   1655     ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
   1656 
   1657     for (size_t index = 0, num_entities = m_found_entities.GetSize();
   1658          index < num_entities;
   1659          ++index)
   1660     {
   1661         ClangExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
   1662 
   1663         ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
   1664 
   1665         if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
   1666         {
   1667             const NamedDecl *named_decl = parser_vars->m_named_decl;
   1668             const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
   1669 
   1670             if (!var_decl)
   1671             {
   1672                 if (log)
   1673                     log->Printf("Entity of unknown type does not have a VarDecl");
   1674                 return false;
   1675             }
   1676 
   1677             if (log)
   1678             {
   1679                 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
   1680                 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
   1681             }
   1682 
   1683             QualType var_type = var_decl->getType();
   1684             TypeFromParser parser_type(var_type.getAsOpaquePtr(), &var_decl->getASTContext());
   1685 
   1686             lldb::clang_type_t copied_type = m_ast_importer->CopyType(scratch_ast_context, &var_decl->getASTContext(), var_type.getAsOpaquePtr());
   1687 
   1688             if (!copied_type)
   1689             {
   1690                 if (log)
   1691                     log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
   1692 
   1693                 return (bool) lldb::ClangExpressionVariableSP();
   1694             }
   1695 
   1696             TypeFromUser user_type(copied_type, scratch_ast_context);
   1697 
   1698 //            parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
   1699             parser_vars->m_lldb_value.SetClangType(user_type);
   1700             parser_vars->m_parser_type = parser_type;
   1701 
   1702             entity->SetClangType(user_type);
   1703 
   1704             entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
   1705         }
   1706     }
   1707 
   1708     return true;
   1709 }
   1710 
   1711 void
   1712 ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
   1713                                         const RegisterInfo *reg_info,
   1714                                         unsigned int current_id)
   1715 {
   1716     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1717 
   1718     ClangASTType clang_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (m_ast_context,
   1719                                                                                     reg_info->encoding,
   1720                                                                                     reg_info->byte_size * 8);
   1721 
   1722     if (!clang_type)
   1723     {
   1724         if (log)
   1725             log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
   1726         return;
   1727     }
   1728 
   1729     TypeFromParser parser_clang_type (clang_type);
   1730 
   1731     NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
   1732 
   1733     ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
   1734                                                                       m_parser_vars->m_target_info.byte_order,
   1735                                                                       m_parser_vars->m_target_info.address_byte_size));
   1736     assert (entity.get());
   1737 
   1738     std::string decl_name(context.m_decl_name.getAsString());
   1739     entity->SetName (ConstString (decl_name.c_str()));
   1740     entity->SetRegisterInfo (reg_info);
   1741     entity->EnableParserVars(GetParserID());
   1742     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
   1743     parser_vars->m_parser_type = parser_clang_type;
   1744     parser_vars->m_named_decl = var_decl;
   1745     parser_vars->m_llvm_value = NULL;
   1746     parser_vars->m_lldb_value.Clear();
   1747     entity->m_flags |= ClangExpressionVariable::EVBareRegister;
   1748 
   1749     if (log)
   1750     {
   1751         ASTDumper ast_dumper(var_decl);
   1752         log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
   1753     }
   1754 }
   1755 
   1756 void
   1757 ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
   1758                                         Function* function,
   1759                                         Symbol* symbol,
   1760                                         unsigned int current_id)
   1761 {
   1762     assert (m_parser_vars.get());
   1763 
   1764     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1765 
   1766     NamedDecl *function_decl = NULL;
   1767     const Address *fun_address = NULL;
   1768     ClangASTType function_clang_type;
   1769 
   1770     bool is_indirect_function = false;
   1771 
   1772     if (function)
   1773     {
   1774         Type *function_type = function->GetType();
   1775 
   1776         if (!function_type)
   1777         {
   1778             if (log)
   1779                 log->PutCString("  Skipped a function because it has no type");
   1780             return;
   1781         }
   1782 
   1783         function_clang_type = function_type->GetClangFullType();
   1784 
   1785         if (!function_clang_type)
   1786         {
   1787             if (log)
   1788                 log->PutCString("  Skipped a function because it has no Clang type");
   1789             return;
   1790         }
   1791 
   1792         fun_address = &function->GetAddressRange().GetBaseAddress();
   1793 
   1794         ClangASTType copied_function_type = GuardedCopyType(function_clang_type);
   1795         if (copied_function_type)
   1796         {
   1797             function_decl = context.AddFunDecl(copied_function_type);
   1798 
   1799             if (!function_decl)
   1800             {
   1801                 if (log)
   1802                 {
   1803                     log->Printf ("  Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}",
   1804                                  function_type->GetName().GetCString(),
   1805                                  function_type->GetID());
   1806                 }
   1807 
   1808                 return;
   1809             }
   1810         }
   1811         else
   1812         {
   1813             // We failed to copy the type we found
   1814             if (log)
   1815             {
   1816                 log->Printf ("  Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt",
   1817                              function_type->GetName().GetCString(),
   1818                              function_type->GetID());
   1819             }
   1820 
   1821             return;
   1822         }
   1823     }
   1824     else if (symbol)
   1825     {
   1826         fun_address = &symbol->GetAddress();
   1827         function_decl = context.AddGenericFunDecl();
   1828         is_indirect_function = symbol->IsIndirect();
   1829     }
   1830     else
   1831     {
   1832         if (log)
   1833             log->PutCString("  AddOneFunction called with no function and no symbol");
   1834         return;
   1835     }
   1836 
   1837     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
   1838 
   1839     lldb::addr_t load_addr = fun_address->GetCallableLoadAddress(target, is_indirect_function);
   1840 
   1841     ClangExpressionVariableSP entity(m_found_entities.CreateVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
   1842                                                                       m_parser_vars->m_target_info.byte_order,
   1843                                                                       m_parser_vars->m_target_info.address_byte_size));
   1844     assert (entity.get());
   1845 
   1846     std::string decl_name(context.m_decl_name.getAsString());
   1847     entity->SetName(ConstString(decl_name.c_str()));
   1848     entity->SetClangType (function_clang_type);
   1849     entity->EnableParserVars(GetParserID());
   1850 
   1851     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
   1852 
   1853     if (load_addr != LLDB_INVALID_ADDRESS)
   1854     {
   1855         parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
   1856         parser_vars->m_lldb_value.GetScalar() = load_addr;
   1857     }
   1858     else
   1859     {
   1860         // We have to try finding a file address.
   1861 
   1862         lldb::addr_t file_addr = fun_address->GetFileAddress();
   1863 
   1864         parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress);
   1865         parser_vars->m_lldb_value.GetScalar() = file_addr;
   1866     }
   1867 
   1868 
   1869     parser_vars->m_named_decl  = function_decl;
   1870     parser_vars->m_llvm_value  = NULL;
   1871 
   1872     if (log)
   1873     {
   1874         ASTDumper ast_dumper(function_decl);
   1875 
   1876         StreamString ss;
   1877 
   1878         fun_address->Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
   1879 
   1880         log->Printf("  CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
   1881                     current_id,
   1882                     (function ? "specific" : "generic"),
   1883                     decl_name.c_str(),
   1884                     ss.GetData(),
   1885                     ast_dumper.GetCString());
   1886     }
   1887 }
   1888 
   1889 TypeFromParser
   1890 ClangExpressionDeclMap::CopyClassType(TypeFromUser &ut,
   1891                                       unsigned int current_id)
   1892 {
   1893     ClangASTType copied_clang_type = GuardedCopyType(ut);
   1894 
   1895     if (!copied_clang_type)
   1896     {
   1897         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1898 
   1899         if (log)
   1900             log->Printf("ClangExpressionDeclMap::CopyClassType - Couldn't import the type");
   1901 
   1902         return TypeFromParser();
   1903     }
   1904 
   1905     if (copied_clang_type.IsAggregateType() && copied_clang_type.GetCompleteType ())
   1906     {
   1907         ClangASTType void_clang_type = ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid);
   1908         ClangASTType void_ptr_clang_type = void_clang_type.GetPointerType();
   1909 
   1910         ClangASTType method_type = ClangASTContext::CreateFunctionType (m_ast_context,
   1911                                                                         void_clang_type,
   1912                                                                         &void_ptr_clang_type,
   1913                                                                         1,
   1914                                                                         false,
   1915                                                                         copied_clang_type.GetTypeQualifiers());
   1916 
   1917         const bool is_virtual = false;
   1918         const bool is_static = false;
   1919         const bool is_inline = false;
   1920         const bool is_explicit = false;
   1921         const bool is_attr_used = true;
   1922         const bool is_artificial = false;
   1923 
   1924         copied_clang_type.AddMethodToCXXRecordType ("$__lldb_expr",
   1925                                                     method_type,
   1926                                                     lldb::eAccessPublic,
   1927                                                     is_virtual,
   1928                                                     is_static,
   1929                                                     is_inline,
   1930                                                     is_explicit,
   1931                                                     is_attr_used,
   1932                                                     is_artificial);
   1933     }
   1934 
   1935     return TypeFromParser(copied_clang_type);
   1936 }
   1937 
   1938 void
   1939 ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
   1940                                    TypeFromUser &ut,
   1941                                    unsigned int current_id)
   1942 {
   1943     ClangASTType copied_clang_type = GuardedCopyType(ut);
   1944 
   1945     if (!copied_clang_type)
   1946     {
   1947         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
   1948 
   1949         if (log)
   1950             log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
   1951 
   1952         return;
   1953     }
   1954 
   1955     context.AddTypeDecl(copied_clang_type);
   1956 }
   1957