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 "ClangExpressionDeclMap.h"
11 
12 #include "ASTDumper.h"
13 #include "ClangASTSource.h"
14 #include "ClangModulesDeclVendor.h"
15 #include "ClangPersistentVariables.h"
16 
17 #include "clang/AST/ASTConsumer.h"
18 #include "clang/AST/ASTContext.h"
19 #include "clang/AST/DeclarationName.h"
20 #include "clang/AST/Decl.h"
21 #include "lldb/lldb-private.h"
22 #include "lldb/Core/Address.h"
23 #include "lldb/Core/Error.h"
24 #include "lldb/Core/Log.h"
25 #include "lldb/Core/Module.h"
26 #include "lldb/Core/ModuleSpec.h"
27 #include "lldb/Core/RegisterValue.h"
28 #include "lldb/Core/ValueObjectConstResult.h"
29 #include "lldb/Core/ValueObjectVariable.h"
30 #include "lldb/Expression/Materializer.h"
31 #include "lldb/Host/Endian.h"
32 #include "lldb/Symbol/ClangASTContext.h"
33 #include "lldb/Symbol/CompilerDecl.h"
34 #include "lldb/Symbol/CompilerDeclContext.h"
35 #include "lldb/Symbol/CompileUnit.h"
36 #include "lldb/Symbol/Function.h"
37 #include "lldb/Symbol/ObjectFile.h"
38 #include "lldb/Symbol/SymbolContext.h"
39 #include "lldb/Symbol/SymbolFile.h"
40 #include "lldb/Symbol/SymbolVendor.h"
41 #include "lldb/Symbol/Type.h"
42 #include "lldb/Symbol/TypeList.h"
43 #include "lldb/Symbol/Variable.h"
44 #include "lldb/Symbol/VariableList.h"
45 #include "lldb/Target/CPPLanguageRuntime.h"
46 #include "lldb/Target/ExecutionContext.h"
47 #include "lldb/Target/ObjCLanguageRuntime.h"
48 #include "lldb/Target/Process.h"
49 #include "lldb/Target/RegisterContext.h"
50 #include "lldb/Target/StackFrame.h"
51 #include "lldb/Target/Target.h"
52 #include "lldb/Target/Thread.h"
53 
54 #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
55 
56 using namespace lldb;
57 using namespace lldb_private;
58 using namespace clang;
59 
60 namespace
61 {
62     const char *g_lldb_local_vars_namespace_cstr = "$__lldb_local_vars";
63 } // anonymous namespace
64 
65 ClangExpressionDeclMap::ClangExpressionDeclMap (bool keep_result_in_memory,
66                                                 Materializer::PersistentVariableDelegate *result_delegate,
67                                                 ExecutionContext &exe_ctx) :
68     ClangASTSource (exe_ctx.GetTargetSP()),
69     m_found_entities (),
70     m_struct_members (),
71     m_keep_result_in_memory (keep_result_in_memory),
72     m_result_delegate (result_delegate),
73     m_parser_vars (),
74     m_struct_vars ()
75 {
76     EnableStructVars();
77 }
78 
79 ClangExpressionDeclMap::~ClangExpressionDeclMap()
80 {
81     // Note: The model is now that the parser's AST context and all associated
82     //   data does not vanish until the expression has been executed.  This means
83     //   that valuable lookup data (like namespaces) doesn't vanish, but
84 
85     DidParse();
86     DisableStructVars();
87 }
88 
89 bool
90 ClangExpressionDeclMap::WillParse(ExecutionContext &exe_ctx,
91                                   Materializer *materializer)
92 {
93     ClangASTMetrics::ClearLocalCounters();
94 
95     EnableParserVars();
96     m_parser_vars->m_exe_ctx = exe_ctx;
97 
98     Target *target = exe_ctx.GetTargetPtr();
99     if (exe_ctx.GetFramePtr())
100         m_parser_vars->m_sym_ctx = exe_ctx.GetFramePtr()->GetSymbolContext(lldb::eSymbolContextEverything);
101     else if (exe_ctx.GetThreadPtr() && exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0))
102         m_parser_vars->m_sym_ctx = exe_ctx.GetThreadPtr()->GetStackFrameAtIndex(0)->GetSymbolContext(lldb::eSymbolContextEverything);
103     else if (exe_ctx.GetProcessPtr())
104     {
105         m_parser_vars->m_sym_ctx.Clear(true);
106         m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
107     }
108     else if (target)
109     {
110         m_parser_vars->m_sym_ctx.Clear(true);
111         m_parser_vars->m_sym_ctx.target_sp = exe_ctx.GetTargetSP();
112     }
113 
114     if (target)
115     {
116         m_parser_vars->m_persistent_vars = llvm::cast<ClangPersistentVariables>(target->GetPersistentExpressionStateForLanguage(eLanguageTypeC));
117 
118         if (!target->GetScratchClangASTContext())
119             return false;
120     }
121 
122     m_parser_vars->m_target_info = GetTargetInfo();
123     m_parser_vars->m_materializer = materializer;
124 
125     return true;
126 }
127 
128 void
129 ClangExpressionDeclMap::InstallCodeGenerator (clang::ASTConsumer *code_gen)
130 {
131     assert(m_parser_vars);
132     m_parser_vars->m_code_gen = code_gen;
133 }
134 
135 void
136 ClangExpressionDeclMap::DidParse()
137 {
138     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
139 
140     if (log)
141         ClangASTMetrics::DumpCounters(log);
142 
143     if (m_parser_vars.get())
144     {
145         for (size_t entity_index = 0, num_entities = m_found_entities.GetSize();
146              entity_index < num_entities;
147              ++entity_index)
148         {
149             ExpressionVariableSP var_sp(m_found_entities.GetVariableAtIndex(entity_index));
150             if (var_sp)
151                 llvm::cast<ClangExpressionVariable>(var_sp.get())->DisableParserVars(GetParserID());
152         }
153 
154         for (size_t pvar_index = 0, num_pvars = m_parser_vars->m_persistent_vars->GetSize();
155              pvar_index < num_pvars;
156              ++pvar_index)
157         {
158             ExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariableAtIndex(pvar_index));
159             if (ClangExpressionVariable *clang_var = llvm::dyn_cast<ClangExpressionVariable>(pvar_sp.get()))
160                 clang_var->DisableParserVars(GetParserID());
161         }
162 
163         DisableParserVars();
164     }
165 }
166 
167 // Interface for IRForTarget
168 
169 ClangExpressionDeclMap::TargetInfo
170 ClangExpressionDeclMap::GetTargetInfo()
171 {
172     assert (m_parser_vars.get());
173 
174     TargetInfo ret;
175 
176     ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
177 
178     Process *process = exe_ctx.GetProcessPtr();
179     if (process)
180     {
181         ret.byte_order = process->GetByteOrder();
182         ret.address_byte_size = process->GetAddressByteSize();
183     }
184     else
185     {
186         Target *target = exe_ctx.GetTargetPtr();
187         if (target)
188         {
189             ret.byte_order = target->GetArchitecture().GetByteOrder();
190             ret.address_byte_size = target->GetArchitecture().GetAddressByteSize();
191         }
192     }
193 
194     return ret;
195 }
196 
197 bool
198 ClangExpressionDeclMap::AddPersistentVariable
199 (
200     const NamedDecl *decl,
201     const ConstString &name,
202     TypeFromParser parser_type,
203     bool is_result,
204     bool is_lvalue
205 )
206 {
207     assert (m_parser_vars.get());
208 
209     ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(parser_type.GetTypeSystem());
210     if (ast == nullptr)
211         return false;
212 
213     if (m_parser_vars->m_materializer && is_result)
214     {
215         Error err;
216 
217         ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
218         Target *target = exe_ctx.GetTargetPtr();
219         if (target == nullptr)
220             return false;
221 
222         ClangASTContext *context(target->GetScratchClangASTContext());
223 
224         TypeFromUser user_type(m_ast_importer_sp->DeportType(context->getASTContext(),
225                                                              ast->getASTContext(),
226                                                              parser_type.GetOpaqueQualType()),
227                                context);
228 
229         uint32_t offset = m_parser_vars->m_materializer->AddResultVariable(user_type,
230                                                                            is_lvalue,
231                                                                            m_keep_result_in_memory,
232                                                                            m_result_delegate,
233                                                                            err);
234 
235         ClangExpressionVariable *var = new ClangExpressionVariable(exe_ctx.GetBestExecutionContextScope(),
236                                                                    name,
237                                                                    user_type,
238                                                                    m_parser_vars->m_target_info.byte_order,
239                                                                    m_parser_vars->m_target_info.address_byte_size);
240 
241         m_found_entities.AddNewlyConstructedVariable(var);
242 
243         var->EnableParserVars(GetParserID());
244 
245         ClangExpressionVariable::ParserVars *parser_vars = var->GetParserVars(GetParserID());
246 
247         parser_vars->m_named_decl = decl;
248         parser_vars->m_parser_type = parser_type;
249 
250         var->EnableJITVars(GetParserID());
251 
252         ClangExpressionVariable::JITVars *jit_vars = var->GetJITVars(GetParserID());
253 
254         jit_vars->m_offset = offset;
255 
256         return true;
257     }
258 
259     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
260     ExecutionContext &exe_ctx = m_parser_vars->m_exe_ctx;
261     Target *target = exe_ctx.GetTargetPtr();
262     if (target == NULL)
263         return false;
264 
265     ClangASTContext *context(target->GetScratchClangASTContext());
266 
267     TypeFromUser user_type(m_ast_importer_sp->DeportType(context->getASTContext(),
268                                                          ast->getASTContext(),
269                                                          parser_type.GetOpaqueQualType()),
270                            context);
271 
272     if (!user_type.GetOpaqueQualType())
273     {
274         if (log)
275             log->Printf("Persistent variable's type wasn't copied successfully");
276         return false;
277     }
278 
279     if (!m_parser_vars->m_target_info.IsValid())
280         return false;
281 
282     ClangExpressionVariable *var = llvm::cast<ClangExpressionVariable>(m_parser_vars->m_persistent_vars->CreatePersistentVariable (exe_ctx.GetBestExecutionContextScope (),
283                                                                                                                                    name,
284                                                                                                                                    user_type,
285                                                                                                                                    m_parser_vars->m_target_info.byte_order,
286                                                                                                                                    m_parser_vars->m_target_info.address_byte_size).get());
287 
288     if (!var)
289         return false;
290 
291     var->m_frozen_sp->SetHasCompleteType();
292 
293     if (is_result)
294         var->m_flags |= ClangExpressionVariable::EVNeedsFreezeDry;
295     else
296         var->m_flags |= ClangExpressionVariable::EVKeepInTarget; // explicitly-declared persistent variables should persist
297 
298     if (is_lvalue)
299     {
300         var->m_flags |= ClangExpressionVariable::EVIsProgramReference;
301     }
302     else
303     {
304         var->m_flags |= ClangExpressionVariable::EVIsLLDBAllocated;
305         var->m_flags |= ClangExpressionVariable::EVNeedsAllocation;
306     }
307 
308     if (m_keep_result_in_memory)
309     {
310         var->m_flags |= ClangExpressionVariable::EVKeepInTarget;
311     }
312 
313     if (log)
314         log->Printf("Created persistent variable with flags 0x%hx", var->m_flags);
315 
316     var->EnableParserVars(GetParserID());
317 
318     ClangExpressionVariable::ParserVars *parser_vars = var->GetParserVars(GetParserID());
319 
320     parser_vars->m_named_decl = decl;
321     parser_vars->m_parser_type = parser_type;
322 
323     return true;
324 }
325 
326 bool
327 ClangExpressionDeclMap::AddValueToStruct
328 (
329     const NamedDecl *decl,
330     const ConstString &name,
331     llvm::Value *value,
332     size_t size,
333     lldb::offset_t alignment
334 )
335 {
336     assert (m_struct_vars.get());
337     assert (m_parser_vars.get());
338 
339     bool is_persistent_variable = false;
340 
341     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
342 
343     m_struct_vars->m_struct_laid_out = false;
344 
345     if (ClangExpressionVariable::FindVariableInList(m_struct_members, decl, GetParserID()))
346         return true;
347 
348     ClangExpressionVariable *var(ClangExpressionVariable::FindVariableInList(m_found_entities, decl, GetParserID()));
349 
350     if (!var)
351     {
352         var = ClangExpressionVariable::FindVariableInList(*m_parser_vars->m_persistent_vars, decl, GetParserID());
353         is_persistent_variable = true;
354     }
355 
356     if (!var)
357         return false;
358 
359     if (log)
360         log->Printf("Adding value for (NamedDecl*)%p [%s - %s] to the structure",
361                     static_cast<const void*>(decl), name.GetCString(),
362                     var->GetName().GetCString());
363 
364     // We know entity->m_parser_vars is valid because we used a parser variable
365     // to find it
366 
367     ClangExpressionVariable::ParserVars *parser_vars = llvm::cast<ClangExpressionVariable>(var)->GetParserVars(GetParserID());
368 
369     parser_vars->m_llvm_value = value;
370 
371     if (ClangExpressionVariable::JITVars *jit_vars = llvm::cast<ClangExpressionVariable>(var)->GetJITVars(GetParserID()))
372     {
373         // We already laid this out; do not touch
374 
375         if (log)
376             log->Printf("Already placed at 0x%llx", (unsigned long long)jit_vars->m_offset);
377     }
378 
379     llvm::cast<ClangExpressionVariable>(var)->EnableJITVars(GetParserID());
380 
381     ClangExpressionVariable::JITVars *jit_vars = llvm::cast<ClangExpressionVariable>(var)->GetJITVars(GetParserID());
382 
383     jit_vars->m_alignment = alignment;
384     jit_vars->m_size = size;
385 
386     m_struct_members.AddVariable(var->shared_from_this());
387 
388     if (m_parser_vars->m_materializer)
389     {
390         uint32_t offset = 0;
391 
392         Error err;
393 
394         if (is_persistent_variable)
395         {
396             ExpressionVariableSP var_sp(var->shared_from_this());
397             offset = m_parser_vars->m_materializer->AddPersistentVariable(var_sp, nullptr, err);
398         }
399         else
400         {
401             if (const lldb_private::Symbol *sym = parser_vars->m_lldb_sym)
402                 offset = m_parser_vars->m_materializer->AddSymbol(*sym, err);
403             else if (const RegisterInfo *reg_info = var->GetRegisterInfo())
404                 offset = m_parser_vars->m_materializer->AddRegister(*reg_info, err);
405             else if (parser_vars->m_lldb_var)
406                 offset = m_parser_vars->m_materializer->AddVariable(parser_vars->m_lldb_var, err);
407         }
408 
409         if (!err.Success())
410             return false;
411 
412         if (log)
413             log->Printf("Placed at 0x%llx", (unsigned long long)offset);
414 
415         jit_vars->m_offset = offset; // TODO DoStructLayout() should not change this.
416     }
417 
418     return true;
419 }
420 
421 bool
422 ClangExpressionDeclMap::DoStructLayout ()
423 {
424     assert (m_struct_vars.get());
425 
426     if (m_struct_vars->m_struct_laid_out)
427         return true;
428 
429     if (!m_parser_vars->m_materializer)
430         return false;
431 
432     m_struct_vars->m_struct_alignment = m_parser_vars->m_materializer->GetStructAlignment();
433     m_struct_vars->m_struct_size = m_parser_vars->m_materializer->GetStructByteSize();
434     m_struct_vars->m_struct_laid_out = true;
435     return true;
436 }
437 
438 bool ClangExpressionDeclMap::GetStructInfo
439 (
440     uint32_t &num_elements,
441     size_t &size,
442     lldb::offset_t &alignment
443 )
444 {
445     assert (m_struct_vars.get());
446 
447     if (!m_struct_vars->m_struct_laid_out)
448         return false;
449 
450     num_elements = m_struct_members.GetSize();
451     size = m_struct_vars->m_struct_size;
452     alignment = m_struct_vars->m_struct_alignment;
453 
454     return true;
455 }
456 
457 bool
458 ClangExpressionDeclMap::GetStructElement
459 (
460     const NamedDecl *&decl,
461     llvm::Value *&value,
462     lldb::offset_t &offset,
463     ConstString &name,
464     uint32_t index
465 )
466 {
467     assert (m_struct_vars.get());
468 
469     if (!m_struct_vars->m_struct_laid_out)
470         return false;
471 
472     if (index >= m_struct_members.GetSize())
473         return false;
474 
475     ExpressionVariableSP member_sp(m_struct_members.GetVariableAtIndex(index));
476 
477     if (!member_sp)
478         return false;
479 
480     ClangExpressionVariable::ParserVars *parser_vars = llvm::cast<ClangExpressionVariable>(member_sp.get())->GetParserVars(GetParserID());
481     ClangExpressionVariable::JITVars *jit_vars = llvm::cast<ClangExpressionVariable>(member_sp.get())->GetJITVars(GetParserID());
482 
483     if (!parser_vars ||
484         !jit_vars ||
485         !member_sp->GetValueObject())
486         return false;
487 
488     decl = parser_vars->m_named_decl;
489     value = parser_vars->m_llvm_value;
490     offset = jit_vars->m_offset;
491     name = member_sp->GetName();
492 
493     return true;
494 }
495 
496 bool
497 ClangExpressionDeclMap::GetFunctionInfo
498 (
499     const NamedDecl *decl,
500     uint64_t &ptr
501 )
502 {
503     ClangExpressionVariable *entity(ClangExpressionVariable::FindVariableInList(m_found_entities, decl, GetParserID()));
504 
505     if (!entity)
506         return false;
507 
508     // We know m_parser_vars is valid since we searched for the variable by
509     // its NamedDecl
510 
511     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
512 
513     ptr = parser_vars->m_lldb_value.GetScalar().ULongLong();
514 
515     return true;
516 }
517 
518 addr_t
519 ClangExpressionDeclMap::GetSymbolAddress (Target &target,
520                                           Process *process,
521                                           const ConstString &name,
522                                           lldb::SymbolType symbol_type,
523                                           lldb_private::Module *module)
524 {
525     SymbolContextList sc_list;
526 
527     if (module)
528         module->FindSymbolsWithNameAndType(name, symbol_type, sc_list);
529     else
530         target.GetImages().FindSymbolsWithNameAndType(name, symbol_type, sc_list);
531 
532     const uint32_t num_matches = sc_list.GetSize();
533     addr_t symbol_load_addr = LLDB_INVALID_ADDRESS;
534 
535     for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++)
536     {
537         SymbolContext sym_ctx;
538         sc_list.GetContextAtIndex(i, sym_ctx);
539 
540         const Address sym_address = sym_ctx.symbol->GetAddress();
541 
542         if (!sym_address.IsValid())
543             continue;
544 
545         switch (sym_ctx.symbol->GetType())
546         {
547             case eSymbolTypeCode:
548             case eSymbolTypeTrampoline:
549                 symbol_load_addr = sym_address.GetCallableLoadAddress (&target);
550                 break;
551 
552             case eSymbolTypeResolver:
553                 symbol_load_addr = sym_address.GetCallableLoadAddress (&target, true);
554                 break;
555 
556             case eSymbolTypeReExported:
557                 {
558                     ConstString reexport_name = sym_ctx.symbol->GetReExportedSymbolName();
559                     if (reexport_name)
560                     {
561                         ModuleSP reexport_module_sp;
562                         ModuleSpec reexport_module_spec;
563                         reexport_module_spec.GetPlatformFileSpec() = sym_ctx.symbol->GetReExportedSymbolSharedLibrary();
564                         if (reexport_module_spec.GetPlatformFileSpec())
565                         {
566                             reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
567                             if (!reexport_module_sp)
568                             {
569                                 reexport_module_spec.GetPlatformFileSpec().GetDirectory().Clear();
570                                 reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
571                             }
572                         }
573                         symbol_load_addr = GetSymbolAddress(target, process, sym_ctx.symbol->GetReExportedSymbolName(), symbol_type, reexport_module_sp.get());
574                     }
575                 }
576                 break;
577 
578             case eSymbolTypeData:
579             case eSymbolTypeRuntime:
580             case eSymbolTypeVariable:
581             case eSymbolTypeLocal:
582             case eSymbolTypeParam:
583             case eSymbolTypeInvalid:
584             case eSymbolTypeAbsolute:
585             case eSymbolTypeException:
586             case eSymbolTypeSourceFile:
587             case eSymbolTypeHeaderFile:
588             case eSymbolTypeObjectFile:
589             case eSymbolTypeCommonBlock:
590             case eSymbolTypeBlock:
591             case eSymbolTypeVariableType:
592             case eSymbolTypeLineEntry:
593             case eSymbolTypeLineHeader:
594             case eSymbolTypeScopeBegin:
595             case eSymbolTypeScopeEnd:
596             case eSymbolTypeAdditional:
597             case eSymbolTypeCompiler:
598             case eSymbolTypeInstrumentation:
599             case eSymbolTypeUndefined:
600             case eSymbolTypeObjCClass:
601             case eSymbolTypeObjCMetaClass:
602             case eSymbolTypeObjCIVar:
603                 symbol_load_addr = sym_address.GetLoadAddress (&target);
604                 break;
605         }
606     }
607 
608     if (symbol_load_addr == LLDB_INVALID_ADDRESS && process)
609     {
610         ObjCLanguageRuntime *runtime = process->GetObjCLanguageRuntime();
611 
612         if (runtime)
613         {
614             symbol_load_addr = runtime->LookupRuntimeSymbol(name);
615         }
616     }
617 
618     return symbol_load_addr;
619 }
620 
621 addr_t
622 ClangExpressionDeclMap::GetSymbolAddress (const ConstString &name, lldb::SymbolType symbol_type)
623 {
624     assert (m_parser_vars.get());
625 
626     if (!m_parser_vars->m_exe_ctx.GetTargetPtr())
627         return false;
628 
629     return GetSymbolAddress(m_parser_vars->m_exe_ctx.GetTargetRef(), m_parser_vars->m_exe_ctx.GetProcessPtr(), name, symbol_type);
630 }
631 
632 const Symbol *
633 ClangExpressionDeclMap::FindGlobalDataSymbol (Target &target,
634                                               const ConstString &name,
635                                               lldb_private::Module *module)
636 {
637     SymbolContextList sc_list;
638 
639     if (module)
640         module->FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
641     else
642         target.GetImages().FindSymbolsWithNameAndType(name, eSymbolTypeAny, sc_list);
643 
644     const uint32_t matches = sc_list.GetSize();
645     for (uint32_t i=0; i<matches; ++i)
646     {
647         SymbolContext sym_ctx;
648         sc_list.GetContextAtIndex(i, sym_ctx);
649         if (sym_ctx.symbol)
650         {
651             const Symbol *symbol = sym_ctx.symbol;
652             const Address sym_address = symbol->GetAddress();
653 
654             if (sym_address.IsValid())
655             {
656                 switch (symbol->GetType())
657                 {
658                     case eSymbolTypeData:
659                     case eSymbolTypeRuntime:
660                     case eSymbolTypeAbsolute:
661                     case eSymbolTypeObjCClass:
662                     case eSymbolTypeObjCMetaClass:
663                     case eSymbolTypeObjCIVar:
664                         if (symbol->GetDemangledNameIsSynthesized())
665                         {
666                             // If the demangled name was synthesized, then don't use it
667                             // for expressions. Only let the symbol match if the mangled
668                             // named matches for these symbols.
669                             if (symbol->GetMangled().GetMangledName() != name)
670                                 break;
671                         }
672                         return symbol;
673 
674                     case eSymbolTypeReExported:
675                         {
676                             ConstString reexport_name = symbol->GetReExportedSymbolName();
677                             if (reexport_name)
678                             {
679                                 ModuleSP reexport_module_sp;
680                                 ModuleSpec reexport_module_spec;
681                                 reexport_module_spec.GetPlatformFileSpec() = symbol->GetReExportedSymbolSharedLibrary();
682                                 if (reexport_module_spec.GetPlatformFileSpec())
683                                 {
684                                     reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
685                                     if (!reexport_module_sp)
686                                     {
687                                         reexport_module_spec.GetPlatformFileSpec().GetDirectory().Clear();
688                                         reexport_module_sp = target.GetImages().FindFirstModule(reexport_module_spec);
689                                     }
690                                 }
691                                 // Don't allow us to try and resolve a re-exported symbol if it is the same
692                                 // as the current symbol
693                                 if (name == symbol->GetReExportedSymbolName() && module == reexport_module_sp.get())
694                                     return NULL;
695 
696                                 return FindGlobalDataSymbol(target, symbol->GetReExportedSymbolName(), reexport_module_sp.get());
697                             }
698                         }
699                         break;
700 
701                     case eSymbolTypeCode: // We already lookup functions elsewhere
702                     case eSymbolTypeVariable:
703                     case eSymbolTypeLocal:
704                     case eSymbolTypeParam:
705                     case eSymbolTypeTrampoline:
706                     case eSymbolTypeInvalid:
707                     case eSymbolTypeException:
708                     case eSymbolTypeSourceFile:
709                     case eSymbolTypeHeaderFile:
710                     case eSymbolTypeObjectFile:
711                     case eSymbolTypeCommonBlock:
712                     case eSymbolTypeBlock:
713                     case eSymbolTypeVariableType:
714                     case eSymbolTypeLineEntry:
715                     case eSymbolTypeLineHeader:
716                     case eSymbolTypeScopeBegin:
717                     case eSymbolTypeScopeEnd:
718                     case eSymbolTypeAdditional:
719                     case eSymbolTypeCompiler:
720                     case eSymbolTypeInstrumentation:
721                     case eSymbolTypeUndefined:
722                     case eSymbolTypeResolver:
723                         break;
724                 }
725             }
726         }
727     }
728 
729     return NULL;
730 }
731 
732 lldb::VariableSP
733 ClangExpressionDeclMap::FindGlobalVariable
734 (
735     Target &target,
736     ModuleSP &module,
737     const ConstString &name,
738     CompilerDeclContext *namespace_decl,
739     TypeFromUser *type
740 )
741 {
742     VariableList vars;
743 
744     if (module && namespace_decl)
745         module->FindGlobalVariables (name, namespace_decl, true, -1, vars);
746     else
747         target.GetImages().FindGlobalVariables(name, true, -1, vars);
748 
749     if (vars.GetSize())
750     {
751         if (type)
752         {
753             for (size_t i = 0; i < vars.GetSize(); ++i)
754             {
755                 VariableSP var_sp = vars.GetVariableAtIndex(i);
756 
757                 if (ClangASTContext::AreTypesSame(*type, var_sp->GetType()->GetFullCompilerType ()))
758                     return var_sp;
759             }
760         }
761         else
762         {
763             return vars.GetVariableAtIndex(0);
764         }
765     }
766 
767     return VariableSP();
768 }
769 
770 ClangASTContext *
771 ClangExpressionDeclMap::GetClangASTContext ()
772 {
773     StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
774     if (frame == nullptr)
775         return nullptr;
776 
777     SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction|lldb::eSymbolContextBlock);
778     if (sym_ctx.block == nullptr)
779         return nullptr;
780 
781     CompilerDeclContext frame_decl_context = sym_ctx.block->GetDeclContext();
782     if (!frame_decl_context)
783         return nullptr;
784 
785     return llvm::dyn_cast_or_null<ClangASTContext>(frame_decl_context.GetTypeSystem());
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         if (namespace_context->getName().str() == std::string(g_lldb_local_vars_namespace_cstr))
824         {
825             CompilerDeclContext compiler_decl_ctx(GetClangASTContext(), const_cast<void *>(static_cast<const void *>(context.m_decl_context)));
826             FindExternalVisibleDecls(context, lldb::ModuleSP(), compiler_decl_ctx, current_id);
827             return;
828         }
829 
830         ClangASTImporter::NamespaceMapSP namespace_map = m_ast_importer_sp->GetNamespaceMap(namespace_context);
831 
832         if (log && log->GetVerbose())
833             log->Printf("  CEDM::FEVD[%u] Inspecting (NamespaceMap*)%p (%d entries)",
834                         current_id, static_cast<void*>(namespace_map.get()),
835                         (int)namespace_map->size());
836 
837         if (!namespace_map)
838             return;
839 
840         for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), e = namespace_map->end();
841              i != e;
842              ++i)
843         {
844             if (log)
845                 log->Printf("  CEDM::FEVD[%u] Searching namespace %s in module %s",
846                             current_id,
847                             i->second.GetName().AsCString(),
848                             i->first->GetFileSpec().GetFilename().GetCString());
849 
850             FindExternalVisibleDecls(context,
851                                      i->first,
852                                      i->second,
853                                      current_id);
854         }
855     }
856     else if (isa<TranslationUnitDecl>(context.m_decl_context))
857     {
858         CompilerDeclContext namespace_decl;
859 
860         if (log)
861             log->Printf("  CEDM::FEVD[%u] Searching the root namespace", current_id);
862 
863         FindExternalVisibleDecls(context,
864                                  lldb::ModuleSP(),
865                                  namespace_decl,
866                                  current_id);
867     }
868 
869     if (!context.m_found.variable)
870         ClangASTSource::FindExternalVisibleDecls(context);
871 }
872 
873 void
874 ClangExpressionDeclMap::FindExternalVisibleDecls (NameSearchContext &context,
875                                                   lldb::ModuleSP module_sp,
876                                                   CompilerDeclContext &namespace_decl,
877                                                   unsigned int current_id)
878 {
879     assert (m_ast_context);
880 
881     std::function<void (clang::FunctionDecl *)> MaybeRegisterFunctionBody =
882     [this](clang::FunctionDecl *copied_function_decl)
883     {
884         if (copied_function_decl->getBody() && m_parser_vars->m_code_gen)
885         {
886             DeclGroupRef decl_group_ref(copied_function_decl);
887             m_parser_vars->m_code_gen->HandleTopLevelDecl(decl_group_ref);
888         }
889     };
890 
891 
892     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
893 
894     SymbolContextList sc_list;
895 
896     const ConstString name(context.m_decl_name.getAsString().c_str());
897 
898     const char *name_unique_cstr = name.GetCString();
899 
900     if (name_unique_cstr == NULL)
901         return;
902 
903     static ConstString id_name("id");
904     static ConstString Class_name("Class");
905 
906     if (name == id_name || name == Class_name)
907         return;
908 
909     // Only look for functions by name out in our symbols if the function
910     // doesn't start with our phony prefix of '$'
911     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
912     StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
913     SymbolContext sym_ctx;
914     if (frame != nullptr)
915         sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction|lldb::eSymbolContextBlock);
916 
917     // Try the persistent decls, which take precedence over all else.
918     if (!namespace_decl)
919     {
920         do
921         {
922             if (!target)
923                 break;
924 
925             ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
926 
927             if (!scratch_clang_ast_context)
928                 break;
929 
930             ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
931 
932             if (!scratch_ast_context)
933                 break;
934 
935             NamedDecl *persistent_decl = m_parser_vars->m_persistent_vars->GetPersistentDecl(name);
936 
937             if (!persistent_decl)
938                 break;
939 
940             Decl *parser_persistent_decl = m_ast_importer_sp->CopyDecl(m_ast_context, scratch_ast_context, persistent_decl);
941 
942             if (!parser_persistent_decl)
943                 break;
944 
945             NamedDecl *parser_named_decl = dyn_cast<NamedDecl>(parser_persistent_decl);
946 
947             if (!parser_named_decl)
948                 break;
949 
950             if (clang::FunctionDecl *parser_function_decl = llvm::dyn_cast<clang::FunctionDecl>(parser_named_decl))
951             {
952                 MaybeRegisterFunctionBody(parser_function_decl);
953             }
954 
955             if (log)
956                 log->Printf("  CEDM::FEVD[%u] Found persistent decl %s", current_id, name.GetCString());
957 
958             context.AddNamedDecl(parser_named_decl);
959         } while (0);
960     }
961 
962     if (name_unique_cstr[0] == '$' && !namespace_decl)
963     {
964         static ConstString g_lldb_class_name ("$__lldb_class");
965 
966         if (name == g_lldb_class_name)
967         {
968             // Clang is looking for the type of "this"
969 
970             if (frame == NULL)
971                 return;
972 
973 
974             // Find the block that defines the function represented by "sym_ctx"
975             Block *function_block = sym_ctx.GetFunctionBlock();
976 
977             if (!function_block)
978                 return;
979 
980             CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
981 
982             if (!function_decl_ctx)
983                 return;
984 
985             clang::CXXMethodDecl *method_decl = ClangASTContext::DeclContextGetAsCXXMethodDecl(function_decl_ctx);
986 
987             if (method_decl)
988             {
989                 clang::CXXRecordDecl *class_decl = method_decl->getParent();
990 
991                 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
992 
993                 TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
994                                               ClangASTContext::GetASTContext(&class_decl->getASTContext()));
995 
996                 if (log)
997                 {
998                     ASTDumper ast_dumper(class_qual_type);
999                     log->Printf("  CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
1000                 }
1001 
1002                 AddThisType(context, class_user_type, current_id);
1003 
1004                 if (method_decl->isInstance())
1005                 {
1006                     // self is a pointer to the object
1007 
1008                     QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
1009 
1010                     TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
1011                                                 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1012 
1013                     m_struct_vars->m_object_pointer_type = self_user_type;
1014                 }
1015             }
1016             else
1017             {
1018                 // This branch will get hit if we are executing code in the context of a function that
1019                 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
1020                 // method of the class.  In that case, just look up the "this" variable in the current
1021                 // scope and use its type.
1022                 // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer
1023                 // for C++ so it hasn't actually been tested.
1024 
1025                 VariableList *vars = frame->GetVariableList(false);
1026 
1027                 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
1028 
1029                 if (this_var &&
1030                     this_var->IsInScope(frame) &&
1031                     this_var->LocationIsValidForFrame (frame))
1032                 {
1033                     Type *this_type = this_var->GetType();
1034 
1035                     if (!this_type)
1036                         return;
1037 
1038                     TypeFromUser pointee_type = this_type->GetForwardCompilerType ().GetPointeeType();
1039 
1040                     if (pointee_type.IsValid())
1041                     {
1042                         if (log)
1043                         {
1044                             ASTDumper ast_dumper(pointee_type);
1045                             log->Printf("  FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
1046                         }
1047 
1048                         AddThisType(context, pointee_type, current_id);
1049                         TypeFromUser this_user_type(this_type->GetFullCompilerType ());
1050                         m_struct_vars->m_object_pointer_type = this_user_type;
1051                         return;
1052                     }
1053                 }
1054             }
1055 
1056             return;
1057         }
1058 
1059         static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1060         if (name == g_lldb_objc_class_name)
1061         {
1062             // Clang is looking for the type of "*self"
1063 
1064             if (!frame)
1065                 return;
1066 
1067             SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction|lldb::eSymbolContextBlock);
1068 
1069             // Find the block that defines the function represented by "sym_ctx"
1070             Block *function_block = sym_ctx.GetFunctionBlock();
1071 
1072             if (!function_block)
1073                 return;
1074 
1075             CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
1076 
1077             if (!function_decl_ctx)
1078                 return;
1079 
1080             clang::ObjCMethodDecl *method_decl = ClangASTContext::DeclContextGetAsObjCMethodDecl(function_decl_ctx);
1081 
1082             if (method_decl)
1083             {
1084                 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
1085 
1086                 if (!self_interface)
1087                     return;
1088 
1089                 const clang::Type *interface_type = self_interface->getTypeForDecl();
1090 
1091                 if (!interface_type)
1092                     return; // This is unlikely, but we have seen crashes where this occurred
1093 
1094                 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
1095                                              ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1096 
1097                 if (log)
1098                 {
1099                     ASTDumper ast_dumper(interface_type);
1100                     log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1101                 }
1102 
1103                 AddOneType(context, class_user_type, current_id);
1104 
1105                 if (method_decl->isInstanceMethod())
1106                 {
1107                     // self is a pointer to the object
1108 
1109                     QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
1110 
1111                     TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
1112                                                 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1113 
1114                     m_struct_vars->m_object_pointer_type = self_user_type;
1115                 }
1116                 else
1117                 {
1118                     // self is a Class pointer
1119                     QualType class_type = method_decl->getASTContext().getObjCClassType();
1120 
1121                     TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
1122                                                 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1123 
1124                     m_struct_vars->m_object_pointer_type = self_user_type;
1125                 }
1126 
1127                 return;
1128             }
1129             else
1130             {
1131                 // This branch will get hit if we are executing code in the context of a function that
1132                 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
1133                 // method of the class.  In that case, just look up the "self" variable in the current
1134                 // scope and use its type.
1135 
1136                 VariableList *vars = frame->GetVariableList(false);
1137 
1138                 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1139 
1140                 if (self_var &&
1141                     self_var->IsInScope(frame) &&
1142                     self_var->LocationIsValidForFrame (frame))
1143                 {
1144                     Type *self_type = self_var->GetType();
1145 
1146                     if (!self_type)
1147                         return;
1148 
1149                     CompilerType self_clang_type = self_type->GetFullCompilerType ();
1150 
1151                     if (ClangASTContext::IsObjCClassType(self_clang_type))
1152                     {
1153                         return;
1154                     }
1155                     else if (ClangASTContext::IsObjCObjectPointerType(self_clang_type))
1156                     {
1157                         self_clang_type = self_clang_type.GetPointeeType();
1158 
1159                         if (!self_clang_type)
1160                             return;
1161 
1162                         if (log)
1163                         {
1164                             ASTDumper ast_dumper(self_type->GetFullCompilerType ());
1165                             log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1166                         }
1167 
1168                         TypeFromUser class_user_type (self_clang_type);
1169 
1170                         AddOneType(context, class_user_type, current_id);
1171 
1172                         TypeFromUser self_user_type(self_type->GetFullCompilerType ());
1173 
1174                         m_struct_vars->m_object_pointer_type = self_user_type;
1175                         return;
1176                     }
1177                 }
1178             }
1179 
1180             return;
1181         }
1182 
1183         if (name == ConstString(g_lldb_local_vars_namespace_cstr))
1184         {
1185             CompilerDeclContext frame_decl_context = sym_ctx.block != nullptr ?
1186                                                      sym_ctx.block->GetDeclContext() :
1187                                                      CompilerDeclContext();
1188 
1189             if (frame_decl_context)
1190             {
1191                 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(frame_decl_context.GetTypeSystem());
1192 
1193                 if (ast)
1194                 {
1195                     clang::NamespaceDecl *namespace_decl = ClangASTContext::GetUniqueNamespaceDeclaration(
1196                         m_ast_context, name_unique_cstr, nullptr);
1197                     if (namespace_decl)
1198                     {
1199                         context.AddNamedDecl(namespace_decl);
1200                         clang::DeclContext *clang_decl_ctx = clang::Decl::castToDeclContext(namespace_decl);
1201                         clang_decl_ctx->setHasExternalVisibleStorage(true);
1202                     }
1203                 }
1204             }
1205 
1206             return;
1207         }
1208 
1209         // any other $__lldb names should be weeded out now
1210         if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
1211             return;
1212 
1213         ExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
1214 
1215         if (pvar_sp)
1216         {
1217             AddOneVariable(context, pvar_sp, current_id);
1218             return;
1219         }
1220 
1221         const char *reg_name(&name.GetCString()[1]);
1222 
1223         if (m_parser_vars->m_exe_ctx.GetRegisterContext())
1224         {
1225             const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
1226 
1227             if (reg_info)
1228             {
1229                 if (log)
1230                     log->Printf("  CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
1231 
1232                 AddOneRegister(context, reg_info, current_id);
1233             }
1234         }
1235     }
1236     else
1237     {
1238         ValueObjectSP valobj;
1239         VariableSP var;
1240 
1241         bool local_var_lookup = !namespace_decl ||
1242                                 (namespace_decl.GetName() == ConstString(g_lldb_local_vars_namespace_cstr));
1243         if (frame && local_var_lookup)
1244         {
1245             CompilerDeclContext compiler_decl_context = sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext() : CompilerDeclContext();
1246 
1247             if (compiler_decl_context)
1248             {
1249                 // Make sure that the variables are parsed so that we have the declarations.
1250                 VariableListSP vars = frame->GetInScopeVariableList(true);
1251                 for (size_t i = 0; i < vars->GetSize(); i++)
1252                     vars->GetVariableAtIndex(i)->GetDecl();
1253 
1254                 // Search for declarations matching the name. Do not include imported decls
1255                 // in the search if we are looking for decls in the artificial namespace
1256                 // $__lldb_local_vars.
1257                 std::vector<CompilerDecl> found_decls = compiler_decl_context.FindDeclByName(name, namespace_decl.IsValid());
1258 
1259                 bool variable_found = false;
1260                 for (CompilerDecl decl : found_decls)
1261                 {
1262                     var = decl.GetAsVariable();
1263                     if (var)
1264                     {
1265                         variable_found = true;
1266                         valobj = ValueObjectVariable::Create(frame, var);
1267                         AddOneVariable(context, var, valobj, current_id);
1268                         context.m_found.variable = true;
1269                     }
1270                 }
1271                 if (variable_found)
1272                     return;
1273             }
1274         }
1275         if (target)
1276         {
1277             var = FindGlobalVariable (*target,
1278                                       module_sp,
1279                                       name,
1280                                       &namespace_decl,
1281                                       NULL);
1282 
1283             if (var)
1284             {
1285                 valobj = ValueObjectVariable::Create(target, var);
1286                 AddOneVariable(context, var, valobj, current_id);
1287                 context.m_found.variable = true;
1288                 return;
1289             }
1290         }
1291 
1292         std::vector<clang::NamedDecl *> decls_from_modules;
1293 
1294         if (target)
1295         {
1296             if (ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor())
1297             {
1298                 decl_vendor->FindDecls(name, false, UINT32_MAX, decls_from_modules);
1299             }
1300         }
1301 
1302         if (!context.m_found.variable)
1303         {
1304             const bool include_inlines = false;
1305             const bool append = false;
1306 
1307             if (namespace_decl && module_sp)
1308             {
1309                 const bool include_symbols = false;
1310 
1311                 module_sp->FindFunctions(name,
1312                                          &namespace_decl,
1313                                          eFunctionNameTypeBase,
1314                                          include_symbols,
1315                                          include_inlines,
1316                                          append,
1317                                          sc_list);
1318             }
1319             else if (target && !namespace_decl)
1320             {
1321                 const bool include_symbols = true;
1322 
1323                 // TODO Fix FindFunctions so that it doesn't return
1324                 //   instance methods for eFunctionNameTypeBase.
1325 
1326                 target->GetImages().FindFunctions(name,
1327                                                   eFunctionNameTypeFull,
1328                                                   include_symbols,
1329                                                   include_inlines,
1330                                                   append,
1331                                                   sc_list);
1332             }
1333 
1334             // If we found more than one function, see if we can use the
1335             // frame's decl context to remove functions that are shadowed
1336             // by other functions which match in type but are nearer in scope.
1337             //
1338             // AddOneFunction will not add a function whose type has already been
1339             // added, so if there's another function in the list with a matching
1340             // type, check to see if their decl context is a parent of the current
1341             // frame's or was imported via a and using statement, and pick the
1342             // best match according to lookup rules.
1343             if (sc_list.GetSize() > 1)
1344             {
1345                 // Collect some info about our frame's context.
1346                 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1347                 SymbolContext frame_sym_ctx;
1348                 if (frame != nullptr)
1349                     frame_sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction|lldb::eSymbolContextBlock);
1350                 CompilerDeclContext frame_decl_context = frame_sym_ctx.block != nullptr ? frame_sym_ctx.block->GetDeclContext() : CompilerDeclContext();
1351 
1352                 // We can't do this without a compiler decl context for our frame.
1353                 if (frame_decl_context)
1354                 {
1355                     clang::DeclContext *frame_decl_ctx = (clang::DeclContext *)frame_decl_context.GetOpaqueDeclContext();
1356                     ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(frame_decl_context.GetTypeSystem());
1357 
1358                     // Structure to hold the info needed when comparing function
1359                     // declarations.
1360                     struct FuncDeclInfo
1361                     {
1362                         ConstString m_name;
1363                         CompilerType m_copied_type;
1364                         uint32_t m_decl_lvl;
1365                         SymbolContext m_sym_ctx;
1366                     };
1367 
1368                     // First, symplify things by looping through the symbol contexts
1369                     // to remove unwanted functions and separate out the functions we
1370                     // want to compare and prune into a separate list.
1371                     // Cache the info needed about the function declarations in a
1372                     // vector for efficiency.
1373                     SymbolContextList sc_sym_list;
1374                     uint32_t num_indices = sc_list.GetSize();
1375                     std::vector<FuncDeclInfo> fdi_cache;
1376                     fdi_cache.reserve(num_indices);
1377                     for (uint32_t index = 0; index < num_indices; ++index)
1378                     {
1379                         FuncDeclInfo fdi;
1380                         SymbolContext sym_ctx;
1381                         sc_list.GetContextAtIndex(index, sym_ctx);
1382 
1383                         // We don't know enough about symbols to compare them,
1384                         // but we should keep them in the list.
1385                         Function *function = sym_ctx.function;
1386                         if (!function)
1387                         {
1388                             sc_sym_list.Append(sym_ctx);
1389                             continue;
1390                         }
1391                         // Filter out functions without declaration contexts, as well as
1392                         // class/instance methods, since they'll be skipped in the
1393                         // code that follows anyway.
1394                         CompilerDeclContext func_decl_context = function->GetDeclContext();
1395                         if (!func_decl_context || func_decl_context.IsClassMethod(nullptr, nullptr, nullptr))
1396                             continue;
1397                         // We can only prune functions for which we can copy the type.
1398                         CompilerType func_clang_type = function->GetType()->GetFullCompilerType();
1399                         CompilerType copied_func_type = GuardedCopyType(func_clang_type);
1400                         if (!copied_func_type)
1401                         {
1402                             sc_sym_list.Append(sym_ctx);
1403                             continue;
1404                         }
1405 
1406                         fdi.m_sym_ctx = sym_ctx;
1407                         fdi.m_name = function->GetName();
1408                         fdi.m_copied_type = copied_func_type;
1409                         fdi.m_decl_lvl = LLDB_INVALID_DECL_LEVEL;
1410                         if (fdi.m_copied_type && func_decl_context)
1411                         {
1412                             // Call CountDeclLevels to get the number of parent scopes we
1413                             // have to look through before we find the function declaration.
1414                             // When comparing functions of the same type, the one with a
1415                             // lower count will be closer to us in the lookup scope and
1416                             // shadows the other.
1417                             clang::DeclContext *func_decl_ctx = (clang::DeclContext *)func_decl_context.GetOpaqueDeclContext();
1418                             fdi.m_decl_lvl = ast->CountDeclLevels(frame_decl_ctx,
1419                                                                   func_decl_ctx,
1420                                                                   &fdi.m_name,
1421                                                                   &fdi.m_copied_type);
1422                         }
1423                         fdi_cache.emplace_back(fdi);
1424                     }
1425 
1426                     // Loop through the functions in our cache looking for matching types,
1427                     // then compare their scope levels to see which is closer.
1428                     std::multimap<CompilerType, const FuncDeclInfo*> matches;
1429                     for (const FuncDeclInfo &fdi : fdi_cache)
1430                     {
1431                         const CompilerType t = fdi.m_copied_type;
1432                         auto q = matches.find(t);
1433                         if (q != matches.end())
1434                         {
1435                             if (q->second->m_decl_lvl > fdi.m_decl_lvl)
1436                                 // This function is closer; remove the old set.
1437                                 matches.erase(t);
1438                             else if (q->second->m_decl_lvl < fdi.m_decl_lvl)
1439                                 // The functions in our set are closer - skip this one.
1440                                 continue;
1441                         }
1442                         matches.insert(std::make_pair(t, &fdi));
1443                     }
1444 
1445                     // Loop through our matches and add their symbol contexts to our list.
1446                     SymbolContextList sc_func_list;
1447                     for (const auto &q : matches)
1448                         sc_func_list.Append(q.second->m_sym_ctx);
1449 
1450                     // Rejoin the lists with the functions in front.
1451                     sc_list = sc_func_list;
1452                     sc_list.Append(sc_sym_list);
1453                 }
1454             }
1455 
1456             if (sc_list.GetSize())
1457             {
1458                 Symbol *extern_symbol = NULL;
1459                 Symbol *non_extern_symbol = NULL;
1460 
1461                 for (uint32_t index = 0, num_indices = sc_list.GetSize();
1462                      index < num_indices;
1463                      ++index)
1464                 {
1465                     SymbolContext sym_ctx;
1466                     sc_list.GetContextAtIndex(index, sym_ctx);
1467 
1468                     if (sym_ctx.function)
1469                     {
1470                         CompilerDeclContext decl_ctx = sym_ctx.function->GetDeclContext();
1471 
1472                         if (!decl_ctx)
1473                             continue;
1474 
1475                         // Filter out class/instance methods.
1476                         if (decl_ctx.IsClassMethod(nullptr, nullptr, nullptr))
1477                             continue;
1478 
1479                         AddOneFunction(context, sym_ctx.function, NULL, current_id);
1480                         context.m_found.function_with_type_info = true;
1481                         context.m_found.function = true;
1482                     }
1483                     else if (sym_ctx.symbol)
1484                     {
1485                         if (sym_ctx.symbol->GetType() == eSymbolTypeReExported && target)
1486                         {
1487                             sym_ctx.symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target);
1488                             if (sym_ctx.symbol == NULL)
1489                                 continue;
1490                         }
1491 
1492                         if (sym_ctx.symbol->IsExternal())
1493                             extern_symbol = sym_ctx.symbol;
1494                         else
1495                             non_extern_symbol = sym_ctx.symbol;
1496                     }
1497                 }
1498 
1499                 if (!context.m_found.function_with_type_info)
1500                 {
1501                     for (clang::NamedDecl *decl : decls_from_modules)
1502                     {
1503                         if (llvm::isa<clang::FunctionDecl>(decl))
1504                         {
1505                             clang::NamedDecl *copied_decl = llvm::cast<FunctionDecl>(m_ast_importer_sp->CopyDecl(m_ast_context, &decl->getASTContext(), decl));
1506                             context.AddNamedDecl(copied_decl);
1507                             context.m_found.function_with_type_info = true;
1508                         }
1509                     }
1510                 }
1511 
1512                 if (!context.m_found.function_with_type_info)
1513                 {
1514                     if (extern_symbol)
1515                     {
1516                         AddOneFunction (context, NULL, extern_symbol, current_id);
1517                         context.m_found.function = true;
1518                     }
1519                     else if (non_extern_symbol)
1520                     {
1521                         AddOneFunction (context, NULL, non_extern_symbol, current_id);
1522                         context.m_found.function = true;
1523                     }
1524                 }
1525             }
1526 
1527             if (!context.m_found.function_with_type_info)
1528             {
1529                 // Try the modules next.
1530 
1531                 do
1532                 {
1533                     if (ClangModulesDeclVendor *modules_decl_vendor = m_target->GetClangModulesDeclVendor())
1534                     {
1535                         bool append = false;
1536                         uint32_t max_matches = 1;
1537                         std::vector <clang::NamedDecl *> decls;
1538 
1539                         if (!modules_decl_vendor->FindDecls(name,
1540                                                             append,
1541                                                             max_matches,
1542                                                             decls))
1543                             break;
1544 
1545                         clang::NamedDecl *const decl_from_modules = decls[0];
1546 
1547                         if (llvm::isa<clang::FunctionDecl>(decl_from_modules))
1548                         {
1549                             if (log)
1550                             {
1551                                 log->Printf("  CAS::FEVD[%u] Matching function found for \"%s\" in the modules",
1552                                             current_id,
1553                                             name.GetCString());
1554                             }
1555 
1556                             clang::Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
1557                             clang::FunctionDecl *copied_function_decl = copied_decl ? dyn_cast<clang::FunctionDecl>(copied_decl) : nullptr;
1558 
1559                             if (!copied_function_decl)
1560                             {
1561                                 if (log)
1562                                     log->Printf("  CAS::FEVD[%u] - Couldn't export a function declaration from the modules",
1563                                                 current_id);
1564 
1565                                 break;
1566                             }
1567 
1568                             MaybeRegisterFunctionBody(copied_function_decl);
1569 
1570                             context.AddNamedDecl(copied_function_decl);
1571 
1572                             context.m_found.function_with_type_info = true;
1573                             context.m_found.function = true;
1574                         }
1575                         else if (llvm::isa<clang::VarDecl>(decl_from_modules))
1576                         {
1577                             if (log)
1578                             {
1579                                 log->Printf("  CAS::FEVD[%u] Matching variable found for \"%s\" in the modules",
1580                                             current_id,
1581                                             name.GetCString());
1582                             }
1583 
1584                             clang::Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
1585                             clang::VarDecl *copied_var_decl = copied_decl ? dyn_cast_or_null<clang::VarDecl>(copied_decl) : nullptr;
1586 
1587                             if (!copied_var_decl)
1588                             {
1589                                 if (log)
1590                                     log->Printf("  CAS::FEVD[%u] - Couldn't export a variable declaration from the modules",
1591                                                 current_id);
1592 
1593                                 break;
1594                             }
1595 
1596                             context.AddNamedDecl(copied_var_decl);
1597 
1598                             context.m_found.variable = true;
1599                         }
1600                     }
1601                 } while (0);
1602             }
1603 
1604             if (target && !context.m_found.variable && !namespace_decl)
1605             {
1606                 // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
1607                 // data symbol, and -- if it is found -- treat it as a variable.
1608 
1609                 const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
1610 
1611                 if (data_symbol)
1612                 {
1613                     std::string warning("got name from symbols: ");
1614                     warning.append(name.AsCString());
1615                     const unsigned diag_id = m_ast_context->getDiagnostics().getCustomDiagID(clang::DiagnosticsEngine::Level::Warning, "%0");
1616                     m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str();
1617                     AddOneGenericVariable(context, *data_symbol, current_id);
1618                     context.m_found.variable = true;
1619                 }
1620             }
1621         }
1622     }
1623 }
1624 
1625 //static opaque_compiler_type_t
1626 //MaybePromoteToBlockPointerType
1627 //(
1628 //    ASTContext *ast_context,
1629 //    opaque_compiler_type_t candidate_type
1630 //)
1631 //{
1632 //    if (!candidate_type)
1633 //        return candidate_type;
1634 //
1635 //    QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
1636 //
1637 //    const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
1638 //
1639 //    if (!candidate_pointer_type)
1640 //        return candidate_type;
1641 //
1642 //    QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
1643 //
1644 //    const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
1645 //
1646 //    if (!pointee_record_type)
1647 //        return candidate_type;
1648 //
1649 //    RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
1650 //
1651 //    if (!pointee_record_decl->isRecord())
1652 //        return candidate_type;
1653 //
1654 //    if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
1655 //        return candidate_type;
1656 //
1657 //    QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
1658 //    QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
1659 //
1660 //    return block_pointer_type.getAsOpaquePtr();
1661 //}
1662 
1663 bool
1664 ClangExpressionDeclMap::GetVariableValue (VariableSP &var,
1665                                           lldb_private::Value &var_location,
1666                                           TypeFromUser *user_type,
1667                                           TypeFromParser *parser_type)
1668 {
1669     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1670 
1671     Type *var_type = var->GetType();
1672 
1673     if (!var_type)
1674     {
1675         if (log)
1676             log->PutCString("Skipped a definition because it has no type");
1677         return false;
1678     }
1679 
1680     CompilerType var_clang_type = var_type->GetFullCompilerType ();
1681 
1682     if (!var_clang_type)
1683     {
1684         if (log)
1685             log->PutCString("Skipped a definition because it has no Clang type");
1686         return false;
1687     }
1688 
1689     ClangASTContext *clang_ast = llvm::dyn_cast_or_null<ClangASTContext>(var_type->GetForwardCompilerType().GetTypeSystem());
1690 
1691     if (!clang_ast)
1692     {
1693         if (log)
1694             log->PutCString("Skipped a definition because it has no Clang AST");
1695         return false;
1696     }
1697 
1698 
1699     ASTContext *ast = clang_ast->getASTContext();
1700 
1701     if (!ast)
1702     {
1703         if (log)
1704             log->PutCString("There is no AST context for the current execution context");
1705         return false;
1706     }
1707     //var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type);
1708 
1709     DWARFExpression &var_location_expr = var->LocationExpression();
1710 
1711     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1712     Error err;
1713 
1714     if (var->GetLocationIsConstantValueData())
1715     {
1716         DataExtractor const_value_extractor;
1717 
1718         if (var_location_expr.GetExpressionData(const_value_extractor))
1719         {
1720             var_location = Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize());
1721             var_location.SetValueType(Value::eValueTypeHostAddress);
1722         }
1723         else
1724         {
1725             if (log)
1726                 log->Printf("Error evaluating constant variable: %s", err.AsCString());
1727             return false;
1728         }
1729     }
1730 
1731     CompilerType type_to_use = GuardedCopyType(var_clang_type);
1732 
1733     if (!type_to_use)
1734     {
1735         if (log)
1736             log->Printf("Couldn't copy a variable's type into the parser's AST context");
1737 
1738         return false;
1739     }
1740 
1741     if (parser_type)
1742         *parser_type = TypeFromParser(type_to_use);
1743 
1744     if (var_location.GetContextType() == Value::eContextTypeInvalid)
1745         var_location.SetCompilerType(type_to_use);
1746 
1747     if (var_location.GetValueType() == Value::eValueTypeFileAddress)
1748     {
1749         SymbolContext var_sc;
1750         var->CalculateSymbolContext(&var_sc);
1751 
1752         if (!var_sc.module_sp)
1753             return false;
1754 
1755         Address so_addr(var_location.GetScalar().ULongLong(), var_sc.module_sp->GetSectionList());
1756 
1757         lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
1758 
1759         if (load_addr != LLDB_INVALID_ADDRESS)
1760         {
1761             var_location.GetScalar() = load_addr;
1762             var_location.SetValueType(Value::eValueTypeLoadAddress);
1763         }
1764     }
1765 
1766     if (user_type)
1767         *user_type = TypeFromUser(var_clang_type);
1768 
1769     return true;
1770 }
1771 
1772 void
1773 ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
1774 {
1775     assert (m_parser_vars.get());
1776 
1777     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1778 
1779     TypeFromUser ut;
1780     TypeFromParser pt;
1781     Value var_location;
1782 
1783     if (!GetVariableValue (var, var_location, &ut, &pt))
1784         return;
1785 
1786     clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
1787 
1788     if (parser_opaque_type.isNull())
1789         return;
1790 
1791     if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
1792     {
1793         if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1794             CompleteType(tag_type->getDecl());
1795         if (const ObjCObjectPointerType *objc_object_ptr_type = dyn_cast<ObjCObjectPointerType>(parser_type))
1796             CompleteType(objc_object_ptr_type->getInterfaceDecl());
1797     }
1798 
1799 
1800     bool is_reference = pt.IsReferenceType();
1801 
1802     NamedDecl *var_decl = NULL;
1803     if (is_reference)
1804         var_decl = context.AddVarDecl(pt);
1805     else
1806         var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
1807 
1808     std::string decl_name(context.m_decl_name.getAsString());
1809     ConstString entity_name(decl_name.c_str());
1810     ClangExpressionVariable *entity(new ClangExpressionVariable(valobj));
1811     m_found_entities.AddNewlyConstructedVariable(entity);
1812 
1813     assert (entity);
1814     entity->EnableParserVars(GetParserID());
1815     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1816     parser_vars->m_parser_type = pt;
1817     parser_vars->m_named_decl  = var_decl;
1818     parser_vars->m_llvm_value  = NULL;
1819     parser_vars->m_lldb_value  = var_location;
1820     parser_vars->m_lldb_var    = var;
1821 
1822     if (is_reference)
1823         entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
1824 
1825     if (log)
1826     {
1827         ASTDumper orig_dumper(ut.GetOpaqueQualType());
1828         ASTDumper ast_dumper(var_decl);
1829         log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString());
1830     }
1831 }
1832 
1833 void
1834 ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
1835                                        ExpressionVariableSP &pvar_sp,
1836                                        unsigned int current_id)
1837 {
1838     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1839 
1840     TypeFromUser user_type (llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetTypeFromUser());
1841 
1842     TypeFromParser parser_type (GuardedCopyType(user_type));
1843 
1844     if (!parser_type.GetOpaqueQualType())
1845     {
1846         if (log)
1847             log->Printf("  CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
1848         return;
1849     }
1850 
1851     NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType());
1852 
1853     llvm::cast<ClangExpressionVariable>(pvar_sp.get())->EnableParserVars(GetParserID());
1854     ClangExpressionVariable::ParserVars *parser_vars = llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetParserVars(GetParserID());
1855     parser_vars->m_parser_type = parser_type;
1856     parser_vars->m_named_decl = var_decl;
1857     parser_vars->m_llvm_value = NULL;
1858     parser_vars->m_lldb_value.Clear();
1859 
1860     if (log)
1861     {
1862         ASTDumper ast_dumper(var_decl);
1863         log->Printf("  CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
1864     }
1865 }
1866 
1867 void
1868 ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
1869                                               const Symbol &symbol,
1870                                               unsigned int current_id)
1871 {
1872     assert(m_parser_vars.get());
1873 
1874     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1875 
1876     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1877 
1878     if (target == NULL)
1879         return;
1880 
1881     ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
1882 
1883     TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1884     TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1885     NamedDecl *var_decl = context.AddVarDecl(parser_type);
1886 
1887     std::string decl_name(context.m_decl_name.getAsString());
1888     ConstString entity_name(decl_name.c_str());
1889     ClangExpressionVariable *entity(new ClangExpressionVariable(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
1890                                                                 entity_name,
1891                                                                 user_type,
1892                                                                 m_parser_vars->m_target_info.byte_order,
1893                                                                 m_parser_vars->m_target_info.address_byte_size));
1894     m_found_entities.AddNewlyConstructedVariable(entity);
1895 
1896     entity->EnableParserVars(GetParserID());
1897     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1898 
1899     const Address symbol_address = symbol.GetAddress();
1900     lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
1901 
1902     //parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1903     parser_vars->m_lldb_value.SetCompilerType(user_type);
1904     parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
1905     parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
1906 
1907     parser_vars->m_parser_type = parser_type;
1908     parser_vars->m_named_decl  = var_decl;
1909     parser_vars->m_llvm_value  = NULL;
1910     parser_vars->m_lldb_sym    = &symbol;
1911 
1912     if (log)
1913     {
1914         ASTDumper ast_dumper(var_decl);
1915 
1916         log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
1917     }
1918 }
1919 
1920 bool
1921 ClangExpressionDeclMap::ResolveUnknownTypes()
1922 {
1923     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1924     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1925 
1926     ClangASTContext *scratch_ast_context = target->GetScratchClangASTContext();
1927 
1928     for (size_t index = 0, num_entities = m_found_entities.GetSize();
1929          index < num_entities;
1930          ++index)
1931     {
1932         ExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
1933 
1934         ClangExpressionVariable::ParserVars *parser_vars = llvm::cast<ClangExpressionVariable>(entity.get())->GetParserVars(GetParserID());
1935 
1936         if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
1937         {
1938             const NamedDecl *named_decl = parser_vars->m_named_decl;
1939             const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
1940 
1941             if (!var_decl)
1942             {
1943                 if (log)
1944                     log->Printf("Entity of unknown type does not have a VarDecl");
1945                 return false;
1946             }
1947 
1948             if (log)
1949             {
1950                 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
1951                 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
1952             }
1953 
1954             QualType var_type = var_decl->getType();
1955             TypeFromParser parser_type(var_type.getAsOpaquePtr(), ClangASTContext::GetASTContext(&var_decl->getASTContext()));
1956 
1957             lldb::opaque_compiler_type_t copied_type = m_ast_importer_sp->CopyType(scratch_ast_context->getASTContext(), &var_decl->getASTContext(), var_type.getAsOpaquePtr());
1958 
1959             if (!copied_type)
1960             {
1961                 if (log)
1962                     log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
1963 
1964                 return (bool) lldb::ExpressionVariableSP();
1965             }
1966 
1967             TypeFromUser user_type(copied_type, scratch_ast_context);
1968 
1969 //            parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1970             parser_vars->m_lldb_value.SetCompilerType(user_type);
1971             parser_vars->m_parser_type = parser_type;
1972 
1973             entity->SetCompilerType(user_type);
1974 
1975             entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
1976         }
1977     }
1978 
1979     return true;
1980 }
1981 
1982 void
1983 ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
1984                                         const RegisterInfo *reg_info,
1985                                         unsigned int current_id)
1986 {
1987     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1988 
1989     CompilerType clang_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (m_ast_context,
1990                                                                                     reg_info->encoding,
1991                                                                                     reg_info->byte_size * 8);
1992 
1993     if (!clang_type)
1994     {
1995         if (log)
1996             log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
1997         return;
1998     }
1999 
2000     TypeFromParser parser_clang_type (clang_type);
2001 
2002     NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
2003 
2004     ClangExpressionVariable *entity(new ClangExpressionVariable(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
2005                                                                 m_parser_vars->m_target_info.byte_order,
2006                                                                 m_parser_vars->m_target_info.address_byte_size));
2007     m_found_entities.AddNewlyConstructedVariable(entity);
2008 
2009     std::string decl_name(context.m_decl_name.getAsString());
2010     entity->SetName (ConstString (decl_name.c_str()));
2011     entity->SetRegisterInfo (reg_info);
2012     entity->EnableParserVars(GetParserID());
2013     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
2014     parser_vars->m_parser_type = parser_clang_type;
2015     parser_vars->m_named_decl = var_decl;
2016     parser_vars->m_llvm_value = NULL;
2017     parser_vars->m_lldb_value.Clear();
2018     entity->m_flags |= ClangExpressionVariable::EVBareRegister;
2019 
2020     if (log)
2021     {
2022         ASTDumper ast_dumper(var_decl);
2023         log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
2024     }
2025 }
2026 
2027 void
2028 ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
2029                                         Function* function,
2030                                         Symbol* symbol,
2031                                         unsigned int current_id)
2032 {
2033     assert (m_parser_vars.get());
2034 
2035     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2036 
2037     NamedDecl *function_decl = NULL;
2038     Address fun_address;
2039     CompilerType function_clang_type;
2040 
2041     bool is_indirect_function = false;
2042 
2043     if (function)
2044     {
2045         Type *function_type = function->GetType();
2046 
2047         const lldb::LanguageType comp_unit_language = function->GetCompileUnit()->GetLanguage();
2048         const bool extern_c = Language::LanguageIsC(comp_unit_language) ||
2049                               (Language::LanguageIsObjC(comp_unit_language) &&
2050                                !Language::LanguageIsCPlusPlus(comp_unit_language));
2051 
2052         if (!extern_c)
2053         {
2054             TypeSystem *type_system = function->GetDeclContext().GetTypeSystem();
2055             if (ClangASTContext *src_ast = llvm::dyn_cast<ClangASTContext>(type_system))
2056             {
2057                 clang::DeclContext *src_decl_context = (clang::DeclContext*)function->GetDeclContext().GetOpaqueDeclContext();
2058                 clang::FunctionDecl *src_function_decl = llvm::dyn_cast_or_null<clang::FunctionDecl>(src_decl_context);
2059 
2060                 if (src_function_decl)
2061                 {
2062                     if (clang::FunctionDecl *copied_function_decl = llvm::dyn_cast_or_null<clang::FunctionDecl>(m_ast_importer_sp->CopyDecl(m_ast_context, src_ast->getASTContext(), src_function_decl)))
2063                     {
2064                         if (log)
2065                         {
2066                             ASTDumper ast_dumper((clang::Decl*)copied_function_decl);
2067 
2068                             StreamString ss;
2069 
2070                             function->DumpSymbolContext(&ss);
2071 
2072                             log->Printf("  CEDM::FEVD[%u] Imported decl for function %s (description %s), returned %s",
2073                                         current_id,
2074                                         copied_function_decl->getName().str().c_str(),
2075                                         ss.GetData(),
2076                                         ast_dumper.GetCString());
2077 
2078                         }
2079 
2080                         context.AddNamedDecl(copied_function_decl);
2081                         return;
2082                     }
2083                     else
2084                     {
2085                         if (log)
2086                         {
2087                             log->Printf ("  Failed to import the function decl for '%s'",
2088                                          src_function_decl->getName().str().c_str());
2089                         }
2090                     }
2091                 }
2092             }
2093         }
2094 
2095         if (!function_type)
2096         {
2097             if (log)
2098                 log->PutCString("  Skipped a function because it has no type");
2099             return;
2100         }
2101 
2102         function_clang_type = function_type->GetFullCompilerType ();
2103 
2104         if (!function_clang_type)
2105         {
2106             if (log)
2107                 log->PutCString("  Skipped a function because it has no Clang type");
2108             return;
2109         }
2110 
2111         fun_address = function->GetAddressRange().GetBaseAddress();
2112 
2113         CompilerType copied_function_type = GuardedCopyType(function_clang_type);
2114         if (copied_function_type)
2115         {
2116             function_decl = context.AddFunDecl(copied_function_type, extern_c);
2117 
2118             if (!function_decl)
2119             {
2120                 if (log)
2121                 {
2122                     log->Printf ("  Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}",
2123                                  function_type->GetName().GetCString(),
2124                                  function_type->GetID());
2125                 }
2126 
2127                 return;
2128             }
2129         }
2130         else
2131         {
2132             // We failed to copy the type we found
2133             if (log)
2134             {
2135                 log->Printf ("  Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt",
2136                              function_type->GetName().GetCString(),
2137                              function_type->GetID());
2138             }
2139 
2140             return;
2141         }
2142     }
2143     else if (symbol)
2144     {
2145         fun_address = symbol->GetAddress();
2146         function_decl = context.AddGenericFunDecl();
2147         is_indirect_function = symbol->IsIndirect();
2148     }
2149     else
2150     {
2151         if (log)
2152             log->PutCString("  AddOneFunction called with no function and no symbol");
2153         return;
2154     }
2155 
2156     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2157 
2158     lldb::addr_t load_addr = fun_address.GetCallableLoadAddress(target, is_indirect_function);
2159 
2160     ClangExpressionVariable *entity(new ClangExpressionVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
2161                                                                  m_parser_vars->m_target_info.byte_order,
2162                                                                  m_parser_vars->m_target_info.address_byte_size));
2163     m_found_entities.AddNewlyConstructedVariable(entity);
2164 
2165     std::string decl_name(context.m_decl_name.getAsString());
2166     entity->SetName(ConstString(decl_name.c_str()));
2167     entity->SetCompilerType (function_clang_type);
2168     entity->EnableParserVars(GetParserID());
2169 
2170     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
2171 
2172     if (load_addr != LLDB_INVALID_ADDRESS)
2173     {
2174         parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
2175         parser_vars->m_lldb_value.GetScalar() = load_addr;
2176     }
2177     else
2178     {
2179         // We have to try finding a file address.
2180 
2181         lldb::addr_t file_addr = fun_address.GetFileAddress();
2182 
2183         parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress);
2184         parser_vars->m_lldb_value.GetScalar() = file_addr;
2185     }
2186 
2187 
2188     parser_vars->m_named_decl  = function_decl;
2189     parser_vars->m_llvm_value  = NULL;
2190 
2191     if (log)
2192     {
2193         ASTDumper ast_dumper(function_decl);
2194 
2195         StreamString ss;
2196 
2197         fun_address.Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
2198 
2199         log->Printf("  CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
2200                     current_id,
2201                     (function ? "specific" : "generic"),
2202                     decl_name.c_str(),
2203                     ss.GetData(),
2204                     ast_dumper.GetCString());
2205     }
2206 }
2207 
2208 void
2209 ClangExpressionDeclMap::AddThisType(NameSearchContext &context,
2210                                     TypeFromUser &ut,
2211                                     unsigned int current_id)
2212 {
2213     CompilerType copied_clang_type = GuardedCopyType(ut);
2214 
2215     if (!copied_clang_type)
2216     {
2217         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2218 
2219         if (log)
2220             log->Printf("ClangExpressionDeclMap::AddThisType - Couldn't import the type");
2221 
2222         return;
2223     }
2224 
2225     if (copied_clang_type.IsAggregateType() && copied_clang_type.GetCompleteType ())
2226     {
2227         CompilerType void_clang_type = ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid);
2228         CompilerType void_ptr_clang_type = void_clang_type.GetPointerType();
2229 
2230         CompilerType method_type = ClangASTContext::CreateFunctionType (m_ast_context,
2231                                                                         void_clang_type,
2232                                                                         &void_ptr_clang_type,
2233                                                                         1,
2234                                                                         false,
2235                                                                         copied_clang_type.GetTypeQualifiers());
2236 
2237         const bool is_virtual = false;
2238         const bool is_static = false;
2239         const bool is_inline = false;
2240         const bool is_explicit = false;
2241         const bool is_attr_used = true;
2242         const bool is_artificial = false;
2243 
2244         ClangASTContext::GetASTContext(m_ast_context)->
2245             AddMethodToCXXRecordType (copied_clang_type.GetOpaqueQualType(),
2246                                       "$__lldb_expr",
2247                                       method_type,
2248                                       lldb::eAccessPublic,
2249                                       is_virtual,
2250                                       is_static,
2251                                       is_inline,
2252                                       is_explicit,
2253                                       is_attr_used,
2254                                       is_artificial);
2255     }
2256 
2257     if (!copied_clang_type.IsValid())
2258         return;
2259 
2260     TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(QualType::getFromOpaquePtr(copied_clang_type.GetOpaqueQualType()));
2261 
2262     if (!type_source_info)
2263         return;
2264 
2265     // Construct a typedef type because if "*this" is a templated type we can't just return ClassTemplateSpecializationDecls in response to name queries.
2266     // Using a typedef makes this much more robust.
2267 
2268     TypedefDecl *typedef_decl = TypedefDecl::Create(*m_ast_context,
2269                                                     m_ast_context->getTranslationUnitDecl(),
2270                                                     SourceLocation(),
2271                                                     SourceLocation(),
2272                                                     context.m_decl_name.getAsIdentifierInfo(),
2273                                                     type_source_info);
2274 
2275 
2276     if (!typedef_decl)
2277         return;
2278 
2279     context.AddNamedDecl(typedef_decl);
2280 
2281     return;
2282 }
2283 
2284 void
2285 ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
2286                                    TypeFromUser &ut,
2287                                    unsigned int current_id)
2288 {
2289     CompilerType copied_clang_type = GuardedCopyType(ut);
2290 
2291     if (!copied_clang_type)
2292     {
2293         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2294 
2295         if (log)
2296             log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
2297 
2298         return;
2299     }
2300 
2301     context.AddTypeDecl(copied_clang_type);
2302 }
2303