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     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
882 
883     SymbolContextList sc_list;
884 
885     const ConstString name(context.m_decl_name.getAsString().c_str());
886 
887     const char *name_unique_cstr = name.GetCString();
888 
889     if (name_unique_cstr == NULL)
890         return;
891 
892     static ConstString id_name("id");
893     static ConstString Class_name("Class");
894 
895     if (name == id_name || name == Class_name)
896         return;
897 
898     // Only look for functions by name out in our symbols if the function
899     // doesn't start with our phony prefix of '$'
900     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
901     StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
902     SymbolContext sym_ctx;
903     if (frame != nullptr)
904         sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction|lldb::eSymbolContextBlock);
905     if (name_unique_cstr[0] == '$' && !namespace_decl)
906     {
907         static ConstString g_lldb_class_name ("$__lldb_class");
908 
909         if (name == g_lldb_class_name)
910         {
911             // Clang is looking for the type of "this"
912 
913             if (frame == NULL)
914                 return;
915 
916 
917             // Find the block that defines the function represented by "sym_ctx"
918             Block *function_block = sym_ctx.GetFunctionBlock();
919 
920             if (!function_block)
921                 return;
922 
923             CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
924 
925             if (!function_decl_ctx)
926                 return;
927 
928             clang::CXXMethodDecl *method_decl = ClangASTContext::DeclContextGetAsCXXMethodDecl(function_decl_ctx);
929 
930             if (method_decl)
931             {
932                 clang::CXXRecordDecl *class_decl = method_decl->getParent();
933 
934                 QualType class_qual_type(class_decl->getTypeForDecl(), 0);
935 
936                 TypeFromUser class_user_type (class_qual_type.getAsOpaquePtr(),
937                                               ClangASTContext::GetASTContext(&class_decl->getASTContext()));
938 
939                 if (log)
940                 {
941                     ASTDumper ast_dumper(class_qual_type);
942                     log->Printf("  CEDM::FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
943                 }
944 
945                 AddThisType(context, class_user_type, current_id);
946 
947                 if (method_decl->isInstance())
948                 {
949                     // self is a pointer to the object
950 
951                     QualType class_pointer_type = method_decl->getASTContext().getPointerType(class_qual_type);
952 
953                     TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
954                                                 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
955 
956                     m_struct_vars->m_object_pointer_type = self_user_type;
957                 }
958             }
959             else
960             {
961                 // This branch will get hit if we are executing code in the context of a function that
962                 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
963                 // method of the class.  In that case, just look up the "this" variable in the current
964                 // scope and use its type.
965                 // FIXME: This code is formally correct, but clang doesn't currently emit DW_AT_object_pointer
966                 // for C++ so it hasn't actually been tested.
967 
968                 VariableList *vars = frame->GetVariableList(false);
969 
970                 lldb::VariableSP this_var = vars->FindVariable(ConstString("this"));
971 
972                 if (this_var &&
973                     this_var->IsInScope(frame) &&
974                     this_var->LocationIsValidForFrame (frame))
975                 {
976                     Type *this_type = this_var->GetType();
977 
978                     if (!this_type)
979                         return;
980 
981                     TypeFromUser pointee_type = this_type->GetForwardCompilerType ().GetPointeeType();
982 
983                     if (pointee_type.IsValid())
984                     {
985                         if (log)
986                         {
987                             ASTDumper ast_dumper(pointee_type);
988                             log->Printf("  FEVD[%u] Adding type for $__lldb_class: %s", current_id, ast_dumper.GetCString());
989                         }
990 
991                         AddThisType(context, pointee_type, current_id);
992                         TypeFromUser this_user_type(this_type->GetFullCompilerType ());
993                         m_struct_vars->m_object_pointer_type = this_user_type;
994                         return;
995                     }
996                 }
997             }
998 
999             return;
1000         }
1001 
1002         static ConstString g_lldb_objc_class_name ("$__lldb_objc_class");
1003         if (name == g_lldb_objc_class_name)
1004         {
1005             // Clang is looking for the type of "*self"
1006 
1007             if (!frame)
1008                 return;
1009 
1010             SymbolContext sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction|lldb::eSymbolContextBlock);
1011 
1012             // Find the block that defines the function represented by "sym_ctx"
1013             Block *function_block = sym_ctx.GetFunctionBlock();
1014 
1015             if (!function_block)
1016                 return;
1017 
1018             CompilerDeclContext function_decl_ctx = function_block->GetDeclContext();
1019 
1020             if (!function_decl_ctx)
1021                 return;
1022 
1023             clang::ObjCMethodDecl *method_decl = ClangASTContext::DeclContextGetAsObjCMethodDecl(function_decl_ctx);
1024 
1025             if (method_decl)
1026             {
1027                 ObjCInterfaceDecl* self_interface = method_decl->getClassInterface();
1028 
1029                 if (!self_interface)
1030                     return;
1031 
1032                 const clang::Type *interface_type = self_interface->getTypeForDecl();
1033 
1034                 if (!interface_type)
1035                     return; // This is unlikely, but we have seen crashes where this occurred
1036 
1037                 TypeFromUser class_user_type(QualType(interface_type, 0).getAsOpaquePtr(),
1038                                              ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1039 
1040                 if (log)
1041                 {
1042                     ASTDumper ast_dumper(interface_type);
1043                     log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1044                 }
1045 
1046                 AddOneType(context, class_user_type, current_id);
1047 
1048                 if (method_decl->isInstanceMethod())
1049                 {
1050                     // self is a pointer to the object
1051 
1052                     QualType class_pointer_type = method_decl->getASTContext().getObjCObjectPointerType(QualType(interface_type, 0));
1053 
1054                     TypeFromUser self_user_type(class_pointer_type.getAsOpaquePtr(),
1055                                                 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1056 
1057                     m_struct_vars->m_object_pointer_type = self_user_type;
1058                 }
1059                 else
1060                 {
1061                     // self is a Class pointer
1062                     QualType class_type = method_decl->getASTContext().getObjCClassType();
1063 
1064                     TypeFromUser self_user_type(class_type.getAsOpaquePtr(),
1065                                                 ClangASTContext::GetASTContext(&method_decl->getASTContext()));
1066 
1067                     m_struct_vars->m_object_pointer_type = self_user_type;
1068                 }
1069 
1070                 return;
1071             }
1072             else
1073             {
1074                 // This branch will get hit if we are executing code in the context of a function that
1075                 // claims to have an object pointer (through DW_AT_object_pointer?) but is not formally a
1076                 // method of the class.  In that case, just look up the "self" variable in the current
1077                 // scope and use its type.
1078 
1079                 VariableList *vars = frame->GetVariableList(false);
1080 
1081                 lldb::VariableSP self_var = vars->FindVariable(ConstString("self"));
1082 
1083                 if (self_var &&
1084                     self_var->IsInScope(frame) &&
1085                     self_var->LocationIsValidForFrame (frame))
1086                 {
1087                     Type *self_type = self_var->GetType();
1088 
1089                     if (!self_type)
1090                         return;
1091 
1092                     CompilerType self_clang_type = self_type->GetFullCompilerType ();
1093 
1094                     if (ClangASTContext::IsObjCClassType(self_clang_type))
1095                     {
1096                         return;
1097                     }
1098                     else if (ClangASTContext::IsObjCObjectPointerType(self_clang_type))
1099                     {
1100                         self_clang_type = self_clang_type.GetPointeeType();
1101 
1102                         if (!self_clang_type)
1103                             return;
1104 
1105                         if (log)
1106                         {
1107                             ASTDumper ast_dumper(self_type->GetFullCompilerType ());
1108                             log->Printf("  FEVD[%u] Adding type for $__lldb_objc_class: %s", current_id, ast_dumper.GetCString());
1109                         }
1110 
1111                         TypeFromUser class_user_type (self_clang_type);
1112 
1113                         AddOneType(context, class_user_type, current_id);
1114 
1115                         TypeFromUser self_user_type(self_type->GetFullCompilerType ());
1116 
1117                         m_struct_vars->m_object_pointer_type = self_user_type;
1118                         return;
1119                     }
1120                 }
1121             }
1122 
1123             return;
1124         }
1125 
1126         if (name == ConstString(g_lldb_local_vars_namespace_cstr))
1127         {
1128             CompilerDeclContext frame_decl_context = sym_ctx.block != nullptr ?
1129                                                      sym_ctx.block->GetDeclContext() :
1130                                                      CompilerDeclContext();
1131 
1132             if (frame_decl_context)
1133             {
1134                 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(frame_decl_context.GetTypeSystem());
1135 
1136                 if (ast)
1137                 {
1138                     clang::NamespaceDecl *namespace_decl = ClangASTContext::GetUniqueNamespaceDeclaration(
1139                         m_ast_context, name_unique_cstr, nullptr);
1140                     if (namespace_decl)
1141                     {
1142                         context.AddNamedDecl(namespace_decl);
1143                         clang::DeclContext *clang_decl_ctx = clang::Decl::castToDeclContext(namespace_decl);
1144                         clang_decl_ctx->setHasExternalVisibleStorage(true);
1145                     }
1146                 }
1147             }
1148 
1149             return;
1150         }
1151 
1152         // any other $__lldb names should be weeded out now
1153         if (!::strncmp(name_unique_cstr, "$__lldb", sizeof("$__lldb") - 1))
1154             return;
1155 
1156         do
1157         {
1158             if (!target)
1159                 break;
1160 
1161             ClangASTContext *scratch_clang_ast_context = target->GetScratchClangASTContext();
1162 
1163             if (!scratch_clang_ast_context)
1164                 break;
1165 
1166             ASTContext *scratch_ast_context = scratch_clang_ast_context->getASTContext();
1167 
1168             if (!scratch_ast_context)
1169                 break;
1170 
1171             TypeDecl *ptype_type_decl = m_parser_vars->m_persistent_vars->GetPersistentType(name);
1172 
1173             if (!ptype_type_decl)
1174                 break;
1175 
1176             Decl *parser_ptype_decl = m_ast_importer_sp->CopyDecl(m_ast_context, scratch_ast_context, ptype_type_decl);
1177 
1178             if (!parser_ptype_decl)
1179                 break;
1180 
1181             TypeDecl *parser_ptype_type_decl = dyn_cast<TypeDecl>(parser_ptype_decl);
1182 
1183             if (!parser_ptype_type_decl)
1184                 break;
1185 
1186             if (log)
1187                 log->Printf("  CEDM::FEVD[%u] Found persistent type %s", current_id, name.GetCString());
1188 
1189             context.AddNamedDecl(parser_ptype_type_decl);
1190         } while (0);
1191 
1192         ExpressionVariableSP pvar_sp(m_parser_vars->m_persistent_vars->GetVariable(name));
1193 
1194         if (pvar_sp)
1195         {
1196             AddOneVariable(context, pvar_sp, current_id);
1197             return;
1198         }
1199 
1200         const char *reg_name(&name.GetCString()[1]);
1201 
1202         if (m_parser_vars->m_exe_ctx.GetRegisterContext())
1203         {
1204             const RegisterInfo *reg_info(m_parser_vars->m_exe_ctx.GetRegisterContext()->GetRegisterInfoByName(reg_name));
1205 
1206             if (reg_info)
1207             {
1208                 if (log)
1209                     log->Printf("  CEDM::FEVD[%u] Found register %s", current_id, reg_info->name);
1210 
1211                 AddOneRegister(context, reg_info, current_id);
1212             }
1213         }
1214     }
1215     else
1216     {
1217         ValueObjectSP valobj;
1218         VariableSP var;
1219 
1220         bool local_var_lookup = !namespace_decl ||
1221                                 (namespace_decl.GetName() == ConstString(g_lldb_local_vars_namespace_cstr));
1222         if (frame && local_var_lookup)
1223         {
1224             CompilerDeclContext compiler_decl_context = sym_ctx.block != nullptr ? sym_ctx.block->GetDeclContext() : CompilerDeclContext();
1225 
1226             if (compiler_decl_context)
1227             {
1228                 // Make sure that the variables are parsed so that we have the declarations.
1229                 VariableListSP vars = frame->GetInScopeVariableList(true);
1230                 for (size_t i = 0; i < vars->GetSize(); i++)
1231                     vars->GetVariableAtIndex(i)->GetDecl();
1232 
1233                 // Search for declarations matching the name. Do not include imported decls
1234                 // in the search if we are looking for decls in the artificial namespace
1235                 // $__lldb_local_vars.
1236                 std::vector<CompilerDecl> found_decls = compiler_decl_context.FindDeclByName(name, namespace_decl.IsValid());
1237 
1238                 bool variable_found = false;
1239                 for (CompilerDecl decl : found_decls)
1240                 {
1241                     var = decl.GetAsVariable();
1242                     if (var)
1243                     {
1244                         variable_found = true;
1245                         valobj = ValueObjectVariable::Create(frame, var);
1246                         AddOneVariable(context, var, valobj, current_id);
1247                         context.m_found.variable = true;
1248                     }
1249                 }
1250                 if (variable_found)
1251                     return;
1252             }
1253         }
1254         if (target)
1255         {
1256             var = FindGlobalVariable (*target,
1257                                       module_sp,
1258                                       name,
1259                                       &namespace_decl,
1260                                       NULL);
1261 
1262             if (var)
1263             {
1264                 valobj = ValueObjectVariable::Create(target, var);
1265                 AddOneVariable(context, var, valobj, current_id);
1266                 context.m_found.variable = true;
1267                 return;
1268             }
1269         }
1270 
1271         std::vector<clang::NamedDecl *> decls_from_modules;
1272 
1273         if (target)
1274         {
1275             if (ClangModulesDeclVendor *decl_vendor = target->GetClangModulesDeclVendor())
1276             {
1277                 decl_vendor->FindDecls(name, false, UINT32_MAX, decls_from_modules);
1278             }
1279         }
1280 
1281         if (!context.m_found.variable)
1282         {
1283             const bool include_inlines = false;
1284             const bool append = false;
1285 
1286             if (namespace_decl && module_sp)
1287             {
1288                 const bool include_symbols = false;
1289 
1290                 module_sp->FindFunctions(name,
1291                                          &namespace_decl,
1292                                          eFunctionNameTypeBase,
1293                                          include_symbols,
1294                                          include_inlines,
1295                                          append,
1296                                          sc_list);
1297             }
1298             else if (target && !namespace_decl)
1299             {
1300                 const bool include_symbols = true;
1301 
1302                 // TODO Fix FindFunctions so that it doesn't return
1303                 //   instance methods for eFunctionNameTypeBase.
1304 
1305                 target->GetImages().FindFunctions(name,
1306                                                   eFunctionNameTypeFull,
1307                                                   include_symbols,
1308                                                   include_inlines,
1309                                                   append,
1310                                                   sc_list);
1311             }
1312 
1313             // If we found more than one function, see if we can use the
1314             // frame's decl context to remove functions that are shadowed
1315             // by other functions which match in type but are nearer in scope.
1316             //
1317             // AddOneFunction will not add a function whose type has already been
1318             // added, so if there's another function in the list with a matching
1319             // type, check to see if their decl context is a parent of the current
1320             // frame's or was imported via a and using statement, and pick the
1321             // best match according to lookup rules.
1322             if (sc_list.GetSize() > 1)
1323             {
1324                 // Collect some info about our frame's context.
1325                 StackFrame *frame = m_parser_vars->m_exe_ctx.GetFramePtr();
1326                 SymbolContext frame_sym_ctx;
1327                 if (frame != nullptr)
1328                     frame_sym_ctx = frame->GetSymbolContext(lldb::eSymbolContextFunction|lldb::eSymbolContextBlock);
1329                 CompilerDeclContext frame_decl_context = frame_sym_ctx.block != nullptr ? frame_sym_ctx.block->GetDeclContext() : CompilerDeclContext();
1330 
1331                 // We can't do this without a compiler decl context for our frame.
1332                 if (frame_decl_context)
1333                 {
1334                     clang::DeclContext *frame_decl_ctx = (clang::DeclContext *)frame_decl_context.GetOpaqueDeclContext();
1335                     ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(frame_decl_context.GetTypeSystem());
1336 
1337                     // Structure to hold the info needed when comparing function
1338                     // declarations.
1339                     struct FuncDeclInfo
1340                     {
1341                         ConstString m_name;
1342                         CompilerType m_copied_type;
1343                         uint32_t m_decl_lvl;
1344                         SymbolContext m_sym_ctx;
1345                     };
1346 
1347                     // First, symplify things by looping through the symbol contexts
1348                     // to remove unwanted functions and separate out the functions we
1349                     // want to compare and prune into a separate list.
1350                     // Cache the info needed about the function declarations in a
1351                     // vector for efficiency.
1352                     SymbolContextList sc_sym_list;
1353                     uint32_t num_indices = sc_list.GetSize();
1354                     std::vector<FuncDeclInfo> fdi_cache;
1355                     fdi_cache.reserve(num_indices);
1356                     for (uint32_t index = 0; index < num_indices; ++index)
1357                     {
1358                         FuncDeclInfo fdi;
1359                         SymbolContext sym_ctx;
1360                         sc_list.GetContextAtIndex(index, sym_ctx);
1361 
1362                         // We don't know enough about symbols to compare them,
1363                         // but we should keep them in the list.
1364                         Function *function = sym_ctx.function;
1365                         if (!function)
1366                         {
1367                             sc_sym_list.Append(sym_ctx);
1368                             continue;
1369                         }
1370                         // Filter out functions without declaration contexts, as well as
1371                         // class/instance methods, since they'll be skipped in the
1372                         // code that follows anyway.
1373                         CompilerDeclContext func_decl_context = function->GetDeclContext();
1374                         if (!func_decl_context || func_decl_context.IsClassMethod(nullptr, nullptr, nullptr))
1375                             continue;
1376                         // We can only prune functions for which we can copy the type.
1377                         CompilerType func_clang_type = function->GetType()->GetFullCompilerType();
1378                         CompilerType copied_func_type = GuardedCopyType(func_clang_type);
1379                         if (!copied_func_type)
1380                         {
1381                             sc_sym_list.Append(sym_ctx);
1382                             continue;
1383                         }
1384 
1385                         fdi.m_sym_ctx = sym_ctx;
1386                         fdi.m_name = function->GetName();
1387                         fdi.m_copied_type = copied_func_type;
1388                         fdi.m_decl_lvl = LLDB_INVALID_DECL_LEVEL;
1389                         if (fdi.m_copied_type && func_decl_context)
1390                         {
1391                             // Call CountDeclLevels to get the number of parent scopes we
1392                             // have to look through before we find the function declaration.
1393                             // When comparing functions of the same type, the one with a
1394                             // lower count will be closer to us in the lookup scope and
1395                             // shadows the other.
1396                             clang::DeclContext *func_decl_ctx = (clang::DeclContext *)func_decl_context.GetOpaqueDeclContext();
1397                             fdi.m_decl_lvl = ast->CountDeclLevels(frame_decl_ctx,
1398                                                                   func_decl_ctx,
1399                                                                   &fdi.m_name,
1400                                                                   &fdi.m_copied_type);
1401                         }
1402                         fdi_cache.emplace_back(fdi);
1403                     }
1404 
1405                     // Loop through the functions in our cache looking for matching types,
1406                     // then compare their scope levels to see which is closer.
1407                     std::multimap<CompilerType, const FuncDeclInfo*> matches;
1408                     for (const FuncDeclInfo &fdi : fdi_cache)
1409                     {
1410                         const CompilerType t = fdi.m_copied_type;
1411                         auto q = matches.find(t);
1412                         if (q != matches.end())
1413                         {
1414                             if (q->second->m_decl_lvl > fdi.m_decl_lvl)
1415                                 // This function is closer; remove the old set.
1416                                 matches.erase(t);
1417                             else if (q->second->m_decl_lvl < fdi.m_decl_lvl)
1418                                 // The functions in our set are closer - skip this one.
1419                                 continue;
1420                         }
1421                         matches.insert(std::make_pair(t, &fdi));
1422                     }
1423 
1424                     // Loop through our matches and add their symbol contexts to our list.
1425                     SymbolContextList sc_func_list;
1426                     for (const auto &q : matches)
1427                         sc_func_list.Append(q.second->m_sym_ctx);
1428 
1429                     // Rejoin the lists with the functions in front.
1430                     sc_list = sc_func_list;
1431                     sc_list.Append(sc_sym_list);
1432                 }
1433             }
1434 
1435             if (sc_list.GetSize())
1436             {
1437                 Symbol *extern_symbol = NULL;
1438                 Symbol *non_extern_symbol = NULL;
1439 
1440                 for (uint32_t index = 0, num_indices = sc_list.GetSize();
1441                      index < num_indices;
1442                      ++index)
1443                 {
1444                     SymbolContext sym_ctx;
1445                     sc_list.GetContextAtIndex(index, sym_ctx);
1446 
1447                     if (sym_ctx.function)
1448                     {
1449                         CompilerDeclContext decl_ctx = sym_ctx.function->GetDeclContext();
1450 
1451                         if (!decl_ctx)
1452                             continue;
1453 
1454                         // Filter out class/instance methods.
1455                         if (decl_ctx.IsClassMethod(nullptr, nullptr, nullptr))
1456                             continue;
1457 
1458                         AddOneFunction(context, sym_ctx.function, NULL, current_id);
1459                         context.m_found.function_with_type_info = true;
1460                         context.m_found.function = true;
1461                     }
1462                     else if (sym_ctx.symbol)
1463                     {
1464                         if (sym_ctx.symbol->GetType() == eSymbolTypeReExported && target)
1465                         {
1466                             sym_ctx.symbol = sym_ctx.symbol->ResolveReExportedSymbol(*target);
1467                             if (sym_ctx.symbol == NULL)
1468                                 continue;
1469                         }
1470 
1471                         if (sym_ctx.symbol->IsExternal())
1472                             extern_symbol = sym_ctx.symbol;
1473                         else
1474                             non_extern_symbol = sym_ctx.symbol;
1475                     }
1476                 }
1477 
1478                 if (!context.m_found.function_with_type_info)
1479                 {
1480                     for (clang::NamedDecl *decl : decls_from_modules)
1481                     {
1482                         if (llvm::isa<clang::FunctionDecl>(decl))
1483                         {
1484                             clang::NamedDecl *copied_decl = llvm::cast<FunctionDecl>(m_ast_importer_sp->CopyDecl(m_ast_context, &decl->getASTContext(), decl));
1485                             context.AddNamedDecl(copied_decl);
1486                             context.m_found.function_with_type_info = true;
1487                         }
1488                     }
1489                 }
1490 
1491                 if (!context.m_found.function_with_type_info)
1492                 {
1493                     if (extern_symbol)
1494                     {
1495                         AddOneFunction (context, NULL, extern_symbol, current_id);
1496                         context.m_found.function = true;
1497                     }
1498                     else if (non_extern_symbol)
1499                     {
1500                         AddOneFunction (context, NULL, non_extern_symbol, current_id);
1501                         context.m_found.function = true;
1502                     }
1503                 }
1504             }
1505 
1506             if (!context.m_found.function_with_type_info)
1507             {
1508                 // Try the modules next.
1509 
1510                 do
1511                 {
1512                     if (ClangModulesDeclVendor *modules_decl_vendor = m_target->GetClangModulesDeclVendor())
1513                     {
1514                         bool append = false;
1515                         uint32_t max_matches = 1;
1516                         std::vector <clang::NamedDecl *> decls;
1517 
1518                         if (!modules_decl_vendor->FindDecls(name,
1519                                                             append,
1520                                                             max_matches,
1521                                                             decls))
1522                             break;
1523 
1524                         clang::NamedDecl *const decl_from_modules = decls[0];
1525 
1526                         if (llvm::isa<clang::FunctionDecl>(decl_from_modules))
1527                         {
1528                             if (log)
1529                             {
1530                                 log->Printf("  CAS::FEVD[%u] Matching function found for \"%s\" in the modules",
1531                                             current_id,
1532                                             name.GetCString());
1533                             }
1534 
1535                             clang::Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
1536                             clang::FunctionDecl *copied_function_decl = copied_decl ? dyn_cast<clang::FunctionDecl>(copied_decl) : nullptr;
1537 
1538                             if (!copied_function_decl)
1539                             {
1540                                 if (log)
1541                                     log->Printf("  CAS::FEVD[%u] - Couldn't export a function declaration from the modules",
1542                                                 current_id);
1543 
1544                                 break;
1545                             }
1546 
1547                             if (copied_function_decl->getBody() && m_parser_vars->m_code_gen)
1548                             {
1549                                 DeclGroupRef decl_group_ref(copied_function_decl);
1550                                 m_parser_vars->m_code_gen->HandleTopLevelDecl(decl_group_ref);
1551                             }
1552 
1553                             context.AddNamedDecl(copied_function_decl);
1554 
1555                             context.m_found.function_with_type_info = true;
1556                             context.m_found.function = true;
1557                         }
1558                         else if (llvm::isa<clang::VarDecl>(decl_from_modules))
1559                         {
1560                             if (log)
1561                             {
1562                                 log->Printf("  CAS::FEVD[%u] Matching variable found for \"%s\" in the modules",
1563                                             current_id,
1564                                             name.GetCString());
1565                             }
1566 
1567                             clang::Decl *copied_decl = m_ast_importer_sp->CopyDecl(m_ast_context, &decl_from_modules->getASTContext(), decl_from_modules);
1568                             clang::VarDecl *copied_var_decl = copied_decl ? dyn_cast_or_null<clang::VarDecl>(copied_decl) : nullptr;
1569 
1570                             if (!copied_var_decl)
1571                             {
1572                                 if (log)
1573                                     log->Printf("  CAS::FEVD[%u] - Couldn't export a variable declaration from the modules",
1574                                                 current_id);
1575 
1576                                 break;
1577                             }
1578 
1579                             context.AddNamedDecl(copied_var_decl);
1580 
1581                             context.m_found.variable = true;
1582                         }
1583                     }
1584                 } while (0);
1585             }
1586 
1587             if (target && !context.m_found.variable && !namespace_decl)
1588             {
1589                 // We couldn't find a non-symbol variable for this.  Now we'll hunt for a generic
1590                 // data symbol, and -- if it is found -- treat it as a variable.
1591 
1592                 const Symbol *data_symbol = FindGlobalDataSymbol(*target, name);
1593 
1594                 if (data_symbol)
1595                 {
1596                     std::string warning("got name from symbols: ");
1597                     warning.append(name.AsCString());
1598                     const unsigned diag_id = m_ast_context->getDiagnostics().getCustomDiagID(clang::DiagnosticsEngine::Level::Warning, "%0");
1599                     m_ast_context->getDiagnostics().Report(diag_id) << warning.c_str();
1600                     AddOneGenericVariable(context, *data_symbol, current_id);
1601                     context.m_found.variable = true;
1602                 }
1603             }
1604         }
1605     }
1606 }
1607 
1608 //static opaque_compiler_type_t
1609 //MaybePromoteToBlockPointerType
1610 //(
1611 //    ASTContext *ast_context,
1612 //    opaque_compiler_type_t candidate_type
1613 //)
1614 //{
1615 //    if (!candidate_type)
1616 //        return candidate_type;
1617 //
1618 //    QualType candidate_qual_type = QualType::getFromOpaquePtr(candidate_type);
1619 //
1620 //    const PointerType *candidate_pointer_type = dyn_cast<PointerType>(candidate_qual_type);
1621 //
1622 //    if (!candidate_pointer_type)
1623 //        return candidate_type;
1624 //
1625 //    QualType pointee_qual_type = candidate_pointer_type->getPointeeType();
1626 //
1627 //    const RecordType *pointee_record_type = dyn_cast<RecordType>(pointee_qual_type);
1628 //
1629 //    if (!pointee_record_type)
1630 //        return candidate_type;
1631 //
1632 //    RecordDecl *pointee_record_decl = pointee_record_type->getDecl();
1633 //
1634 //    if (!pointee_record_decl->isRecord())
1635 //        return candidate_type;
1636 //
1637 //    if (!pointee_record_decl->getName().startswith(llvm::StringRef("__block_literal_")))
1638 //        return candidate_type;
1639 //
1640 //    QualType generic_function_type = ast_context->getFunctionNoProtoType(ast_context->UnknownAnyTy);
1641 //    QualType block_pointer_type = ast_context->getBlockPointerType(generic_function_type);
1642 //
1643 //    return block_pointer_type.getAsOpaquePtr();
1644 //}
1645 
1646 bool
1647 ClangExpressionDeclMap::GetVariableValue (VariableSP &var,
1648                                           lldb_private::Value &var_location,
1649                                           TypeFromUser *user_type,
1650                                           TypeFromParser *parser_type)
1651 {
1652     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1653 
1654     Type *var_type = var->GetType();
1655 
1656     if (!var_type)
1657     {
1658         if (log)
1659             log->PutCString("Skipped a definition because it has no type");
1660         return false;
1661     }
1662 
1663     CompilerType var_clang_type = var_type->GetFullCompilerType ();
1664 
1665     if (!var_clang_type)
1666     {
1667         if (log)
1668             log->PutCString("Skipped a definition because it has no Clang type");
1669         return false;
1670     }
1671 
1672     ClangASTContext *clang_ast = llvm::dyn_cast_or_null<ClangASTContext>(var_type->GetForwardCompilerType().GetTypeSystem());
1673 
1674     if (!clang_ast)
1675     {
1676         if (log)
1677             log->PutCString("Skipped a definition because it has no Clang AST");
1678         return false;
1679     }
1680 
1681 
1682     ASTContext *ast = clang_ast->getASTContext();
1683 
1684     if (!ast)
1685     {
1686         if (log)
1687             log->PutCString("There is no AST context for the current execution context");
1688         return false;
1689     }
1690     //var_clang_type = MaybePromoteToBlockPointerType (ast, var_clang_type);
1691 
1692     DWARFExpression &var_location_expr = var->LocationExpression();
1693 
1694     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1695     Error err;
1696 
1697     if (var->GetLocationIsConstantValueData())
1698     {
1699         DataExtractor const_value_extractor;
1700 
1701         if (var_location_expr.GetExpressionData(const_value_extractor))
1702         {
1703             var_location = Value(const_value_extractor.GetDataStart(), const_value_extractor.GetByteSize());
1704             var_location.SetValueType(Value::eValueTypeHostAddress);
1705         }
1706         else
1707         {
1708             if (log)
1709                 log->Printf("Error evaluating constant variable: %s", err.AsCString());
1710             return false;
1711         }
1712     }
1713 
1714     CompilerType type_to_use = GuardedCopyType(var_clang_type);
1715 
1716     if (!type_to_use)
1717     {
1718         if (log)
1719             log->Printf("Couldn't copy a variable's type into the parser's AST context");
1720 
1721         return false;
1722     }
1723 
1724     if (parser_type)
1725         *parser_type = TypeFromParser(type_to_use);
1726 
1727     if (var_location.GetContextType() == Value::eContextTypeInvalid)
1728         var_location.SetCompilerType(type_to_use);
1729 
1730     if (var_location.GetValueType() == Value::eValueTypeFileAddress)
1731     {
1732         SymbolContext var_sc;
1733         var->CalculateSymbolContext(&var_sc);
1734 
1735         if (!var_sc.module_sp)
1736             return false;
1737 
1738         Address so_addr(var_location.GetScalar().ULongLong(), var_sc.module_sp->GetSectionList());
1739 
1740         lldb::addr_t load_addr = so_addr.GetLoadAddress(target);
1741 
1742         if (load_addr != LLDB_INVALID_ADDRESS)
1743         {
1744             var_location.GetScalar() = load_addr;
1745             var_location.SetValueType(Value::eValueTypeLoadAddress);
1746         }
1747     }
1748 
1749     if (user_type)
1750         *user_type = TypeFromUser(var_clang_type);
1751 
1752     return true;
1753 }
1754 
1755 void
1756 ClangExpressionDeclMap::AddOneVariable (NameSearchContext &context, VariableSP var, ValueObjectSP valobj, unsigned int current_id)
1757 {
1758     assert (m_parser_vars.get());
1759 
1760     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1761 
1762     TypeFromUser ut;
1763     TypeFromParser pt;
1764     Value var_location;
1765 
1766     if (!GetVariableValue (var, var_location, &ut, &pt))
1767         return;
1768 
1769     clang::QualType parser_opaque_type = QualType::getFromOpaquePtr(pt.GetOpaqueQualType());
1770 
1771     if (parser_opaque_type.isNull())
1772         return;
1773 
1774     if (const clang::Type *parser_type = parser_opaque_type.getTypePtr())
1775     {
1776         if (const TagType *tag_type = dyn_cast<TagType>(parser_type))
1777             CompleteType(tag_type->getDecl());
1778         if (const ObjCObjectPointerType *objc_object_ptr_type = dyn_cast<ObjCObjectPointerType>(parser_type))
1779             CompleteType(objc_object_ptr_type->getInterfaceDecl());
1780     }
1781 
1782 
1783     bool is_reference = pt.IsReferenceType();
1784 
1785     NamedDecl *var_decl = NULL;
1786     if (is_reference)
1787         var_decl = context.AddVarDecl(pt);
1788     else
1789         var_decl = context.AddVarDecl(pt.GetLValueReferenceType());
1790 
1791     std::string decl_name(context.m_decl_name.getAsString());
1792     ConstString entity_name(decl_name.c_str());
1793     ClangExpressionVariable *entity(new ClangExpressionVariable(valobj));
1794     m_found_entities.AddNewlyConstructedVariable(entity);
1795 
1796     assert (entity);
1797     entity->EnableParserVars(GetParserID());
1798     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1799     parser_vars->m_parser_type = pt;
1800     parser_vars->m_named_decl  = var_decl;
1801     parser_vars->m_llvm_value  = NULL;
1802     parser_vars->m_lldb_value  = var_location;
1803     parser_vars->m_lldb_var    = var;
1804 
1805     if (is_reference)
1806         entity->m_flags |= ClangExpressionVariable::EVTypeIsReference;
1807 
1808     if (log)
1809     {
1810         ASTDumper orig_dumper(ut.GetOpaqueQualType());
1811         ASTDumper ast_dumper(var_decl);
1812         log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s (original %s)", current_id, decl_name.c_str(), ast_dumper.GetCString(), orig_dumper.GetCString());
1813     }
1814 }
1815 
1816 void
1817 ClangExpressionDeclMap::AddOneVariable(NameSearchContext &context,
1818                                        ExpressionVariableSP &pvar_sp,
1819                                        unsigned int current_id)
1820 {
1821     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1822 
1823     TypeFromUser user_type (llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetTypeFromUser());
1824 
1825     TypeFromParser parser_type (GuardedCopyType(user_type));
1826 
1827     if (!parser_type.GetOpaqueQualType())
1828     {
1829         if (log)
1830             log->Printf("  CEDM::FEVD[%u] Couldn't import type for pvar %s", current_id, pvar_sp->GetName().GetCString());
1831         return;
1832     }
1833 
1834     NamedDecl *var_decl = context.AddVarDecl(parser_type.GetLValueReferenceType());
1835 
1836     llvm::cast<ClangExpressionVariable>(pvar_sp.get())->EnableParserVars(GetParserID());
1837     ClangExpressionVariable::ParserVars *parser_vars = llvm::cast<ClangExpressionVariable>(pvar_sp.get())->GetParserVars(GetParserID());
1838     parser_vars->m_parser_type = parser_type;
1839     parser_vars->m_named_decl = var_decl;
1840     parser_vars->m_llvm_value = NULL;
1841     parser_vars->m_lldb_value.Clear();
1842 
1843     if (log)
1844     {
1845         ASTDumper ast_dumper(var_decl);
1846         log->Printf("  CEDM::FEVD[%u] Added pvar %s, returned %s", current_id, pvar_sp->GetName().GetCString(), ast_dumper.GetCString());
1847     }
1848 }
1849 
1850 void
1851 ClangExpressionDeclMap::AddOneGenericVariable(NameSearchContext &context,
1852                                               const Symbol &symbol,
1853                                               unsigned int current_id)
1854 {
1855     assert(m_parser_vars.get());
1856 
1857     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1858 
1859     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1860 
1861     if (target == NULL)
1862         return;
1863 
1864     ASTContext *scratch_ast_context = target->GetScratchClangASTContext()->getASTContext();
1865 
1866     TypeFromUser user_type (ClangASTContext::GetBasicType(scratch_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1867     TypeFromParser parser_type (ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid).GetPointerType().GetLValueReferenceType());
1868     NamedDecl *var_decl = context.AddVarDecl(parser_type);
1869 
1870     std::string decl_name(context.m_decl_name.getAsString());
1871     ConstString entity_name(decl_name.c_str());
1872     ClangExpressionVariable *entity(new ClangExpressionVariable(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
1873                                                                 entity_name,
1874                                                                 user_type,
1875                                                                 m_parser_vars->m_target_info.byte_order,
1876                                                                 m_parser_vars->m_target_info.address_byte_size));
1877     m_found_entities.AddNewlyConstructedVariable(entity);
1878 
1879     entity->EnableParserVars(GetParserID());
1880     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1881 
1882     const Address symbol_address = symbol.GetAddress();
1883     lldb::addr_t symbol_load_addr = symbol_address.GetLoadAddress(target);
1884 
1885     //parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1886     parser_vars->m_lldb_value.SetCompilerType(user_type);
1887     parser_vars->m_lldb_value.GetScalar() = symbol_load_addr;
1888     parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
1889 
1890     parser_vars->m_parser_type = parser_type;
1891     parser_vars->m_named_decl  = var_decl;
1892     parser_vars->m_llvm_value  = NULL;
1893     parser_vars->m_lldb_sym    = &symbol;
1894 
1895     if (log)
1896     {
1897         ASTDumper ast_dumper(var_decl);
1898 
1899         log->Printf("  CEDM::FEVD[%u] Found variable %s, returned %s", current_id, decl_name.c_str(), ast_dumper.GetCString());
1900     }
1901 }
1902 
1903 bool
1904 ClangExpressionDeclMap::ResolveUnknownTypes()
1905 {
1906     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1907     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
1908 
1909     ClangASTContext *scratch_ast_context = target->GetScratchClangASTContext();
1910 
1911     for (size_t index = 0, num_entities = m_found_entities.GetSize();
1912          index < num_entities;
1913          ++index)
1914     {
1915         ExpressionVariableSP entity = m_found_entities.GetVariableAtIndex(index);
1916 
1917         ClangExpressionVariable::ParserVars *parser_vars = llvm::cast<ClangExpressionVariable>(entity.get())->GetParserVars(GetParserID());
1918 
1919         if (entity->m_flags & ClangExpressionVariable::EVUnknownType)
1920         {
1921             const NamedDecl *named_decl = parser_vars->m_named_decl;
1922             const VarDecl *var_decl = dyn_cast<VarDecl>(named_decl);
1923 
1924             if (!var_decl)
1925             {
1926                 if (log)
1927                     log->Printf("Entity of unknown type does not have a VarDecl");
1928                 return false;
1929             }
1930 
1931             if (log)
1932             {
1933                 ASTDumper ast_dumper(const_cast<VarDecl*>(var_decl));
1934                 log->Printf("Variable of unknown type now has Decl %s", ast_dumper.GetCString());
1935             }
1936 
1937             QualType var_type = var_decl->getType();
1938             TypeFromParser parser_type(var_type.getAsOpaquePtr(), ClangASTContext::GetASTContext(&var_decl->getASTContext()));
1939 
1940             lldb::opaque_compiler_type_t copied_type = m_ast_importer_sp->CopyType(scratch_ast_context->getASTContext(), &var_decl->getASTContext(), var_type.getAsOpaquePtr());
1941 
1942             if (!copied_type)
1943             {
1944                 if (log)
1945                     log->Printf("ClangExpressionDeclMap::ResolveUnknownType - Couldn't import the type for a variable");
1946 
1947                 return (bool) lldb::ExpressionVariableSP();
1948             }
1949 
1950             TypeFromUser user_type(copied_type, scratch_ast_context);
1951 
1952 //            parser_vars->m_lldb_value.SetContext(Value::eContextTypeClangType, user_type.GetOpaqueQualType());
1953             parser_vars->m_lldb_value.SetCompilerType(user_type);
1954             parser_vars->m_parser_type = parser_type;
1955 
1956             entity->SetCompilerType(user_type);
1957 
1958             entity->m_flags &= ~(ClangExpressionVariable::EVUnknownType);
1959         }
1960     }
1961 
1962     return true;
1963 }
1964 
1965 void
1966 ClangExpressionDeclMap::AddOneRegister (NameSearchContext &context,
1967                                         const RegisterInfo *reg_info,
1968                                         unsigned int current_id)
1969 {
1970     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1971 
1972     CompilerType clang_type = ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (m_ast_context,
1973                                                                                     reg_info->encoding,
1974                                                                                     reg_info->byte_size * 8);
1975 
1976     if (!clang_type)
1977     {
1978         if (log)
1979             log->Printf("  Tried to add a type for %s, but couldn't get one", context.m_decl_name.getAsString().c_str());
1980         return;
1981     }
1982 
1983     TypeFromParser parser_clang_type (clang_type);
1984 
1985     NamedDecl *var_decl = context.AddVarDecl(parser_clang_type);
1986 
1987     ClangExpressionVariable *entity(new ClangExpressionVariable(m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(),
1988                                                                 m_parser_vars->m_target_info.byte_order,
1989                                                                 m_parser_vars->m_target_info.address_byte_size));
1990     m_found_entities.AddNewlyConstructedVariable(entity);
1991 
1992     std::string decl_name(context.m_decl_name.getAsString());
1993     entity->SetName (ConstString (decl_name.c_str()));
1994     entity->SetRegisterInfo (reg_info);
1995     entity->EnableParserVars(GetParserID());
1996     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
1997     parser_vars->m_parser_type = parser_clang_type;
1998     parser_vars->m_named_decl = var_decl;
1999     parser_vars->m_llvm_value = NULL;
2000     parser_vars->m_lldb_value.Clear();
2001     entity->m_flags |= ClangExpressionVariable::EVBareRegister;
2002 
2003     if (log)
2004     {
2005         ASTDumper ast_dumper(var_decl);
2006         log->Printf("  CEDM::FEVD[%d] Added register %s, returned %s", current_id, context.m_decl_name.getAsString().c_str(), ast_dumper.GetCString());
2007     }
2008 }
2009 
2010 void
2011 ClangExpressionDeclMap::AddOneFunction (NameSearchContext &context,
2012                                         Function* function,
2013                                         Symbol* symbol,
2014                                         unsigned int current_id)
2015 {
2016     assert (m_parser_vars.get());
2017 
2018     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2019 
2020     NamedDecl *function_decl = NULL;
2021     Address fun_address;
2022     CompilerType function_clang_type;
2023 
2024     bool is_indirect_function = false;
2025 
2026     if (function)
2027     {
2028         Type *function_type = function->GetType();
2029 
2030         const lldb::LanguageType comp_unit_language = function->GetCompileUnit()->GetLanguage();
2031         const bool extern_c = Language::LanguageIsC(comp_unit_language) ||
2032                               (Language::LanguageIsObjC(comp_unit_language) &&
2033                                !Language::LanguageIsCPlusPlus(comp_unit_language));
2034 
2035         if (!extern_c)
2036         {
2037             TypeSystem *type_system = function->GetDeclContext().GetTypeSystem();
2038             if (ClangASTContext *src_ast = llvm::dyn_cast<ClangASTContext>(type_system))
2039             {
2040                 clang::DeclContext *src_decl_context = (clang::DeclContext*)function->GetDeclContext().GetOpaqueDeclContext();
2041                 clang::FunctionDecl *src_function_decl = llvm::dyn_cast_or_null<clang::FunctionDecl>(src_decl_context);
2042 
2043                 if (src_function_decl)
2044                 {
2045                     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)))
2046                     {
2047                         if (log)
2048                         {
2049                             ASTDumper ast_dumper((clang::Decl*)copied_function_decl);
2050 
2051                             StreamString ss;
2052 
2053                             function->DumpSymbolContext(&ss);
2054 
2055                             log->Printf("  CEDM::FEVD[%u] Imported decl for function %s (description %s), returned %s",
2056                                         current_id,
2057                                         copied_function_decl->getName().str().c_str(),
2058                                         ss.GetData(),
2059                                         ast_dumper.GetCString());
2060 
2061                         }
2062 
2063                         context.AddNamedDecl(copied_function_decl);
2064                         return;
2065                     }
2066                     else
2067                     {
2068                         if (log)
2069                         {
2070                             log->Printf ("  Failed to import the function decl for '%s'",
2071                                          src_function_decl->getName().str().c_str());
2072                         }
2073                     }
2074                 }
2075             }
2076         }
2077 
2078         if (!function_type)
2079         {
2080             if (log)
2081                 log->PutCString("  Skipped a function because it has no type");
2082             return;
2083         }
2084 
2085         function_clang_type = function_type->GetFullCompilerType ();
2086 
2087         if (!function_clang_type)
2088         {
2089             if (log)
2090                 log->PutCString("  Skipped a function because it has no Clang type");
2091             return;
2092         }
2093 
2094         fun_address = function->GetAddressRange().GetBaseAddress();
2095 
2096         CompilerType copied_function_type = GuardedCopyType(function_clang_type);
2097         if (copied_function_type)
2098         {
2099             function_decl = context.AddFunDecl(copied_function_type, extern_c);
2100 
2101             if (!function_decl)
2102             {
2103                 if (log)
2104                 {
2105                     log->Printf ("  Failed to create a function decl for '%s' {0x%8.8" PRIx64 "}",
2106                                  function_type->GetName().GetCString(),
2107                                  function_type->GetID());
2108                 }
2109 
2110                 return;
2111             }
2112         }
2113         else
2114         {
2115             // We failed to copy the type we found
2116             if (log)
2117             {
2118                 log->Printf ("  Failed to import the function type '%s' {0x%8.8" PRIx64 "} into the expression parser AST contenxt",
2119                              function_type->GetName().GetCString(),
2120                              function_type->GetID());
2121             }
2122 
2123             return;
2124         }
2125     }
2126     else if (symbol)
2127     {
2128         fun_address = symbol->GetAddress();
2129         function_decl = context.AddGenericFunDecl();
2130         is_indirect_function = symbol->IsIndirect();
2131     }
2132     else
2133     {
2134         if (log)
2135             log->PutCString("  AddOneFunction called with no function and no symbol");
2136         return;
2137     }
2138 
2139     Target *target = m_parser_vars->m_exe_ctx.GetTargetPtr();
2140 
2141     lldb::addr_t load_addr = fun_address.GetCallableLoadAddress(target, is_indirect_function);
2142 
2143     ClangExpressionVariable *entity(new ClangExpressionVariable (m_parser_vars->m_exe_ctx.GetBestExecutionContextScope (),
2144                                                                  m_parser_vars->m_target_info.byte_order,
2145                                                                  m_parser_vars->m_target_info.address_byte_size));
2146     m_found_entities.AddNewlyConstructedVariable(entity);
2147 
2148     std::string decl_name(context.m_decl_name.getAsString());
2149     entity->SetName(ConstString(decl_name.c_str()));
2150     entity->SetCompilerType (function_clang_type);
2151     entity->EnableParserVars(GetParserID());
2152 
2153     ClangExpressionVariable::ParserVars *parser_vars = entity->GetParserVars(GetParserID());
2154 
2155     if (load_addr != LLDB_INVALID_ADDRESS)
2156     {
2157         parser_vars->m_lldb_value.SetValueType(Value::eValueTypeLoadAddress);
2158         parser_vars->m_lldb_value.GetScalar() = load_addr;
2159     }
2160     else
2161     {
2162         // We have to try finding a file address.
2163 
2164         lldb::addr_t file_addr = fun_address.GetFileAddress();
2165 
2166         parser_vars->m_lldb_value.SetValueType(Value::eValueTypeFileAddress);
2167         parser_vars->m_lldb_value.GetScalar() = file_addr;
2168     }
2169 
2170 
2171     parser_vars->m_named_decl  = function_decl;
2172     parser_vars->m_llvm_value  = NULL;
2173 
2174     if (log)
2175     {
2176         ASTDumper ast_dumper(function_decl);
2177 
2178         StreamString ss;
2179 
2180         fun_address.Dump(&ss, m_parser_vars->m_exe_ctx.GetBestExecutionContextScope(), Address::DumpStyleResolvedDescription);
2181 
2182         log->Printf("  CEDM::FEVD[%u] Found %s function %s (description %s), returned %s",
2183                     current_id,
2184                     (function ? "specific" : "generic"),
2185                     decl_name.c_str(),
2186                     ss.GetData(),
2187                     ast_dumper.GetCString());
2188     }
2189 }
2190 
2191 void
2192 ClangExpressionDeclMap::AddThisType(NameSearchContext &context,
2193                                     TypeFromUser &ut,
2194                                     unsigned int current_id)
2195 {
2196     CompilerType copied_clang_type = GuardedCopyType(ut);
2197 
2198     if (!copied_clang_type)
2199     {
2200         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2201 
2202         if (log)
2203             log->Printf("ClangExpressionDeclMap::AddThisType - Couldn't import the type");
2204 
2205         return;
2206     }
2207 
2208     if (copied_clang_type.IsAggregateType() && copied_clang_type.GetCompleteType ())
2209     {
2210         CompilerType void_clang_type = ClangASTContext::GetBasicType(m_ast_context, eBasicTypeVoid);
2211         CompilerType void_ptr_clang_type = void_clang_type.GetPointerType();
2212 
2213         CompilerType method_type = ClangASTContext::CreateFunctionType (m_ast_context,
2214                                                                         void_clang_type,
2215                                                                         &void_ptr_clang_type,
2216                                                                         1,
2217                                                                         false,
2218                                                                         copied_clang_type.GetTypeQualifiers());
2219 
2220         const bool is_virtual = false;
2221         const bool is_static = false;
2222         const bool is_inline = false;
2223         const bool is_explicit = false;
2224         const bool is_attr_used = true;
2225         const bool is_artificial = false;
2226 
2227         ClangASTContext::GetASTContext(m_ast_context)->
2228             AddMethodToCXXRecordType (copied_clang_type.GetOpaqueQualType(),
2229                                       "$__lldb_expr",
2230                                       method_type,
2231                                       lldb::eAccessPublic,
2232                                       is_virtual,
2233                                       is_static,
2234                                       is_inline,
2235                                       is_explicit,
2236                                       is_attr_used,
2237                                       is_artificial);
2238     }
2239 
2240     if (!copied_clang_type.IsValid())
2241         return;
2242 
2243     TypeSourceInfo *type_source_info = m_ast_context->getTrivialTypeSourceInfo(QualType::getFromOpaquePtr(copied_clang_type.GetOpaqueQualType()));
2244 
2245     if (!type_source_info)
2246         return;
2247 
2248     // Construct a typedef type because if "*this" is a templated type we can't just return ClassTemplateSpecializationDecls in response to name queries.
2249     // Using a typedef makes this much more robust.
2250 
2251     TypedefDecl *typedef_decl = TypedefDecl::Create(*m_ast_context,
2252                                                     m_ast_context->getTranslationUnitDecl(),
2253                                                     SourceLocation(),
2254                                                     SourceLocation(),
2255                                                     context.m_decl_name.getAsIdentifierInfo(),
2256                                                     type_source_info);
2257 
2258 
2259     if (!typedef_decl)
2260         return;
2261 
2262     context.AddNamedDecl(typedef_decl);
2263 
2264     return;
2265 }
2266 
2267 void
2268 ClangExpressionDeclMap::AddOneType(NameSearchContext &context,
2269                                    TypeFromUser &ut,
2270                                    unsigned int current_id)
2271 {
2272     CompilerType copied_clang_type = GuardedCopyType(ut);
2273 
2274     if (!copied_clang_type)
2275     {
2276         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
2277 
2278         if (log)
2279             log->Printf("ClangExpressionDeclMap::AddOneType - Couldn't import the type");
2280 
2281         return;
2282     }
2283 
2284     context.AddTypeDecl(copied_clang_type);
2285 }
2286