1 //===-- ClangASTSource.cpp ------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "ClangASTSource.h"
11 #include "ClangDeclVendor.h"
12 #include "ClangModulesDeclVendor.h"
14 #include "lldb/Core/Module.h"
15 #include "lldb/Core/ModuleList.h"
16 #include "lldb/Symbol/CompilerDeclContext.h"
17 #include "lldb/Symbol/Function.h"
18 #include "lldb/Symbol/SymbolFile.h"
19 #include "lldb/Symbol/TaggedASTType.h"
20 #include "lldb/Target/Target.h"
21 #include "lldb/Utility/LLDBLog.h"
22 #include "lldb/Utility/Log.h"
23 #include "clang/AST/ASTContext.h"
24 #include "clang/Basic/SourceManager.h"
26 #include "Plugins/ExpressionParser/Clang/ClangUtil.h"
27 #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h"
28 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
33 using namespace clang
;
34 using namespace lldb_private
;
36 // Scoped class that will remove an active lexical decl from the set when it
39 class ScopedLexicalDeclEraser
{
41 ScopedLexicalDeclEraser(std::set
<const clang::Decl
*> &decls
,
42 const clang::Decl
*decl
)
43 : m_active_lexical_decls(decls
), m_decl(decl
) {}
45 ~ScopedLexicalDeclEraser() { m_active_lexical_decls
.erase(m_decl
); }
48 std::set
<const clang::Decl
*> &m_active_lexical_decls
;
49 const clang::Decl
*m_decl
;
53 ClangASTSource::ClangASTSource(
54 const lldb::TargetSP
&target
,
55 const std::shared_ptr
<ClangASTImporter
> &importer
)
56 : m_lookups_enabled(false), m_target(target
), m_ast_context(nullptr),
57 m_ast_importer_sp(importer
), m_active_lexical_decls(),
59 assert(m_ast_importer_sp
&& "No ClangASTImporter passed to ClangASTSource?");
62 void ClangASTSource::InstallASTContext(TypeSystemClang
&clang_ast_context
) {
63 m_ast_context
= &clang_ast_context
.getASTContext();
64 m_clang_ast_context
= &clang_ast_context
;
65 m_file_manager
= &m_ast_context
->getSourceManager().getFileManager();
66 m_ast_importer_sp
->InstallMapCompleter(m_ast_context
, *this);
69 ClangASTSource::~ClangASTSource() {
70 m_ast_importer_sp
->ForgetDestination(m_ast_context
);
75 // Unregister the current ASTContext as a source for all scratch
76 // ASTContexts in the ClangASTImporter. Without this the scratch AST might
77 // query the deleted ASTContext for additional type information.
78 // We unregister from *all* scratch ASTContexts in case a type got exported
79 // to a scratch AST that isn't the best fitting scratch ASTContext.
80 lldb::TypeSystemClangSP scratch_ts_sp
= ScratchTypeSystemClang::GetForTarget(
81 *m_target
, ScratchTypeSystemClang::DefaultAST
, false);
86 ScratchTypeSystemClang
*default_scratch_ast
=
87 llvm::cast
<ScratchTypeSystemClang
>(scratch_ts_sp
.get());
88 // Unregister from the default scratch AST (and all sub-ASTs).
89 default_scratch_ast
->ForgetSource(m_ast_context
, *m_ast_importer_sp
);
92 void ClangASTSource::StartTranslationUnit(ASTConsumer
*Consumer
) {
96 m_ast_context
->getTranslationUnitDecl()->setHasExternalVisibleStorage();
97 m_ast_context
->getTranslationUnitDecl()->setHasExternalLexicalStorage();
100 // The core lookup interface.
101 bool ClangASTSource::FindExternalVisibleDeclsByName(
102 const DeclContext
*decl_ctx
, DeclarationName clang_decl_name
) {
103 if (!m_ast_context
) {
104 SetNoExternalVisibleDeclsForName(decl_ctx
, clang_decl_name
);
108 std::string
decl_name(clang_decl_name
.getAsString());
110 switch (clang_decl_name
.getNameKind()) {
111 // Normal identifiers.
112 case DeclarationName::Identifier
: {
113 clang::IdentifierInfo
*identifier_info
=
114 clang_decl_name
.getAsIdentifierInfo();
116 if (!identifier_info
|| identifier_info
->getBuiltinID() != 0) {
117 SetNoExternalVisibleDeclsForName(decl_ctx
, clang_decl_name
);
123 case DeclarationName::CXXOperatorName
:
124 case DeclarationName::CXXLiteralOperatorName
:
127 // Using directives found in this context.
128 // Tell Sema we didn't find any or we'll end up getting asked a *lot*.
129 case DeclarationName::CXXUsingDirective
:
130 SetNoExternalVisibleDeclsForName(decl_ctx
, clang_decl_name
);
133 case DeclarationName::ObjCZeroArgSelector
:
134 case DeclarationName::ObjCOneArgSelector
:
135 case DeclarationName::ObjCMultiArgSelector
: {
136 llvm::SmallVector
<NamedDecl
*, 1> method_decls
;
138 NameSearchContext
method_search_context(*m_clang_ast_context
, method_decls
,
139 clang_decl_name
, decl_ctx
);
141 FindObjCMethodDecls(method_search_context
);
143 SetExternalVisibleDeclsForName(decl_ctx
, clang_decl_name
, method_decls
);
144 return (method_decls
.size() > 0);
146 // These aren't possible in the global context.
147 case DeclarationName::CXXConstructorName
:
148 case DeclarationName::CXXDestructorName
:
149 case DeclarationName::CXXConversionFunctionName
:
150 case DeclarationName::CXXDeductionGuideName
:
151 SetNoExternalVisibleDeclsForName(decl_ctx
, clang_decl_name
);
155 if (!GetLookupsEnabled()) {
156 // Wait until we see a '$' at the start of a name before we start doing any
157 // lookups so we can avoid lookup up all of the builtin types.
158 if (!decl_name
.empty() && decl_name
[0] == '$') {
159 SetLookupsEnabled(true);
161 SetNoExternalVisibleDeclsForName(decl_ctx
, clang_decl_name
);
166 ConstString
const_decl_name(decl_name
.c_str());
168 const char *uniqued_const_decl_name
= const_decl_name
.GetCString();
169 if (m_active_lookups
.find(uniqued_const_decl_name
) !=
170 m_active_lookups
.end()) {
171 // We are currently looking up this name...
172 SetNoExternalVisibleDeclsForName(decl_ctx
, clang_decl_name
);
175 m_active_lookups
.insert(uniqued_const_decl_name
);
176 llvm::SmallVector
<NamedDecl
*, 4> name_decls
;
177 NameSearchContext
name_search_context(*m_clang_ast_context
, name_decls
,
178 clang_decl_name
, decl_ctx
);
179 FindExternalVisibleDecls(name_search_context
);
180 SetExternalVisibleDeclsForName(decl_ctx
, clang_decl_name
, name_decls
);
181 m_active_lookups
.erase(uniqued_const_decl_name
);
182 return (name_decls
.size() != 0);
185 TagDecl
*ClangASTSource::FindCompleteType(const TagDecl
*decl
) {
186 Log
*log
= GetLog(LLDBLog::Expressions
);
188 if (const NamespaceDecl
*namespace_context
=
189 dyn_cast
<NamespaceDecl
>(decl
->getDeclContext())) {
190 ClangASTImporter::NamespaceMapSP namespace_map
=
191 m_ast_importer_sp
->GetNamespaceMap(namespace_context
);
196 LLDB_LOGV(log
, " CTD Inspecting namespace map{0:x} ({1} entries)",
197 namespace_map
.get(), namespace_map
->size());
199 for (const ClangASTImporter::NamespaceMapItem
&item
: *namespace_map
) {
200 LLDB_LOG(log
, " CTD Searching namespace {0} in module {1}",
201 item
.second
.GetName(), item
.first
->GetFileSpec().GetFilename());
203 ConstString
name(decl
->getName());
205 // Create a type matcher using the CompilerDeclContext for the namespace
206 // as the context (item.second) and search for the name inside of this
208 TypeQuery
query(item
.second
, name
);
210 item
.first
->FindTypes(query
, results
);
212 for (const lldb::TypeSP
&type_sp
: results
.GetTypeMap().Types()) {
213 CompilerType
clang_type(type_sp
->GetFullCompilerType());
215 if (!ClangUtil::IsClangType(clang_type
))
218 const TagType
*tag_type
=
219 ClangUtil::GetQualType(clang_type
)->getAs
<TagType
>();
224 TagDecl
*candidate_tag_decl
=
225 const_cast<TagDecl
*>(tag_type
->getDecl());
227 if (TypeSystemClang::GetCompleteDecl(
228 &candidate_tag_decl
->getASTContext(), candidate_tag_decl
))
229 return candidate_tag_decl
;
233 const ModuleList
&module_list
= m_target
->GetImages();
234 // Create a type matcher using a CompilerDecl. Each TypeSystem class knows
235 // how to fill out a CompilerContext array using a CompilerDecl.
236 TypeQuery
query(CompilerDecl(m_clang_ast_context
, (void *)decl
));
238 module_list
.FindTypes(nullptr, query
, results
);
239 for (const lldb::TypeSP
&type_sp
: results
.GetTypeMap().Types()) {
241 CompilerType
clang_type(type_sp
->GetFullCompilerType());
243 if (!ClangUtil::IsClangType(clang_type
))
246 const TagType
*tag_type
=
247 ClangUtil::GetQualType(clang_type
)->getAs
<TagType
>();
252 TagDecl
*candidate_tag_decl
= const_cast<TagDecl
*>(tag_type
->getDecl());
254 if (TypeSystemClang::GetCompleteDecl(&candidate_tag_decl
->getASTContext(),
256 return candidate_tag_decl
;
262 void ClangASTSource::CompleteType(TagDecl
*tag_decl
) {
263 Log
*log
= GetLog(LLDBLog::Expressions
);
267 " CompleteTagDecl on (ASTContext*){0} Completing "
268 "(TagDecl*){1:x} named {2}",
269 m_clang_ast_context
->getDisplayName(), tag_decl
,
270 tag_decl
->getName());
272 LLDB_LOG(log
, " CTD Before:\n{0}", ClangUtil::DumpDecl(tag_decl
));
275 auto iter
= m_active_lexical_decls
.find(tag_decl
);
276 if (iter
!= m_active_lexical_decls
.end())
278 m_active_lexical_decls
.insert(tag_decl
);
279 ScopedLexicalDeclEraser
eraser(m_active_lexical_decls
, tag_decl
);
281 if (!m_ast_importer_sp
->CompleteTagDecl(tag_decl
)) {
282 // We couldn't complete the type. Maybe there's a definition somewhere
283 // else that can be completed.
284 if (TagDecl
*alternate
= FindCompleteType(tag_decl
))
285 m_ast_importer_sp
->CompleteTagDeclWithOrigin(tag_decl
, alternate
);
288 LLDB_LOG(log
, " [CTD] After:\n{0}", ClangUtil::DumpDecl(tag_decl
));
291 void ClangASTSource::CompleteType(clang::ObjCInterfaceDecl
*interface_decl
) {
292 Log
*log
= GetLog(LLDBLog::Expressions
);
295 " [CompleteObjCInterfaceDecl] on (ASTContext*){0:x} '{1}' "
296 "Completing an ObjCInterfaceDecl named {2}",
297 m_ast_context
, m_clang_ast_context
->getDisplayName(),
298 interface_decl
->getName());
299 LLDB_LOG(log
, " [COID] Before:\n{0}",
300 ClangUtil::DumpDecl(interface_decl
));
302 ClangASTImporter::DeclOrigin original
= m_ast_importer_sp
->GetDeclOrigin(interface_decl
);
304 if (original
.Valid()) {
305 if (ObjCInterfaceDecl
*original_iface_decl
=
306 dyn_cast
<ObjCInterfaceDecl
>(original
.decl
)) {
307 ObjCInterfaceDecl
*complete_iface_decl
=
308 GetCompleteObjCInterface(original_iface_decl
);
310 if (complete_iface_decl
&& (complete_iface_decl
!= original_iface_decl
)) {
311 m_ast_importer_sp
->SetDeclOrigin(interface_decl
, complete_iface_decl
);
316 m_ast_importer_sp
->CompleteObjCInterfaceDecl(interface_decl
);
318 if (interface_decl
->getSuperClass() &&
319 interface_decl
->getSuperClass() != interface_decl
)
320 CompleteType(interface_decl
->getSuperClass());
322 LLDB_LOG(log
, " [COID] After:");
323 LLDB_LOG(log
, " [COID] {0}", ClangUtil::DumpDecl(interface_decl
));
326 clang::ObjCInterfaceDecl
*ClangASTSource::GetCompleteObjCInterface(
327 const clang::ObjCInterfaceDecl
*interface_decl
) {
328 lldb::ProcessSP
process(m_target
->GetProcessSP());
333 ObjCLanguageRuntime
*language_runtime(ObjCLanguageRuntime::Get(*process
));
335 if (!language_runtime
)
338 ConstString
class_name(interface_decl
->getNameAsString().c_str());
340 lldb::TypeSP
complete_type_sp(
341 language_runtime
->LookupInCompleteClassCache(class_name
));
343 if (!complete_type_sp
)
346 TypeFromUser complete_type
=
347 TypeFromUser(complete_type_sp
->GetFullCompilerType());
348 lldb::opaque_compiler_type_t complete_opaque_type
=
349 complete_type
.GetOpaqueQualType();
351 if (!complete_opaque_type
)
354 const clang::Type
*complete_clang_type
=
355 QualType::getFromOpaquePtr(complete_opaque_type
).getTypePtr();
356 const ObjCInterfaceType
*complete_interface_type
=
357 dyn_cast
<ObjCInterfaceType
>(complete_clang_type
);
359 if (!complete_interface_type
)
362 ObjCInterfaceDecl
*complete_iface_decl(complete_interface_type
->getDecl());
364 return complete_iface_decl
;
367 void ClangASTSource::FindExternalLexicalDecls(
368 const DeclContext
*decl_context
,
369 llvm::function_ref
<bool(Decl::Kind
)> predicate
,
370 llvm::SmallVectorImpl
<Decl
*> &decls
) {
372 Log
*log
= GetLog(LLDBLog::Expressions
);
374 const Decl
*context_decl
= dyn_cast
<Decl
>(decl_context
);
379 auto iter
= m_active_lexical_decls
.find(context_decl
);
380 if (iter
!= m_active_lexical_decls
.end())
382 m_active_lexical_decls
.insert(context_decl
);
383 ScopedLexicalDeclEraser
eraser(m_active_lexical_decls
, context_decl
);
386 if (const NamedDecl
*context_named_decl
= dyn_cast
<NamedDecl
>(context_decl
))
388 "FindExternalLexicalDecls on (ASTContext*){0:x} '{1}' in "
389 "'{2}' ({3}Decl*){4}",
390 m_ast_context
, m_clang_ast_context
->getDisplayName(),
391 context_named_decl
->getNameAsString().c_str(),
392 context_decl
->getDeclKindName(),
393 static_cast<const void *>(context_decl
));
394 else if (context_decl
)
396 "FindExternalLexicalDecls on (ASTContext*){0:x} '{1}' in "
398 m_ast_context
, m_clang_ast_context
->getDisplayName(),
399 context_decl
->getDeclKindName(),
400 static_cast<const void *>(context_decl
));
403 "FindExternalLexicalDecls on (ASTContext*){0:x} '{1}' in a "
405 m_ast_context
, m_clang_ast_context
->getDisplayName());
408 ClangASTImporter::DeclOrigin original
= m_ast_importer_sp
->GetDeclOrigin(context_decl
);
410 if (!original
.Valid())
413 LLDB_LOG(log
, " FELD Original decl (ASTContext*){0:x} (Decl*){1:x}:\n{2}",
414 static_cast<void *>(original
.ctx
),
415 static_cast<void *>(original
.decl
),
416 ClangUtil::DumpDecl(original
.decl
));
418 if (ObjCInterfaceDecl
*original_iface_decl
=
419 dyn_cast
<ObjCInterfaceDecl
>(original
.decl
)) {
420 ObjCInterfaceDecl
*complete_iface_decl
=
421 GetCompleteObjCInterface(original_iface_decl
);
423 if (complete_iface_decl
&& (complete_iface_decl
!= original_iface_decl
)) {
424 original
.decl
= complete_iface_decl
;
425 original
.ctx
= &complete_iface_decl
->getASTContext();
427 m_ast_importer_sp
->SetDeclOrigin(context_decl
, complete_iface_decl
);
431 if (TagDecl
*original_tag_decl
= dyn_cast
<TagDecl
>(original
.decl
)) {
432 ExternalASTSource
*external_source
= original
.ctx
->getExternalSource();
435 external_source
->CompleteType(original_tag_decl
);
438 const DeclContext
*original_decl_context
=
439 dyn_cast
<DeclContext
>(original
.decl
);
441 if (!original_decl_context
)
444 // Indicates whether we skipped any Decls of the original DeclContext.
445 bool SkippedDecls
= false;
446 for (Decl
*decl
: original_decl_context
->decls()) {
447 // The predicate function returns true if the passed declaration kind is
448 // the one we are looking for.
449 // See clang::ExternalASTSource::FindExternalLexicalDecls()
450 if (predicate(decl
->getKind())) {
452 std::string ast_dump
= ClangUtil::DumpDecl(decl
);
453 if (const NamedDecl
*context_named_decl
=
454 dyn_cast
<NamedDecl
>(context_decl
))
455 LLDB_LOG(log
, " FELD Adding [to {0}Decl {1}] lexical {2}Decl {3}",
456 context_named_decl
->getDeclKindName(),
457 context_named_decl
->getName(), decl
->getDeclKindName(),
460 LLDB_LOG(log
, " FELD Adding lexical {0}Decl {1}",
461 decl
->getDeclKindName(), ast_dump
);
464 Decl
*copied_decl
= CopyDecl(decl
);
469 // FIXME: We should add the copied decl to the 'decls' list. This would
470 // add the copied Decl into the DeclContext and make sure that we
471 // correctly propagate that we added some Decls back to Clang.
472 // By leaving 'decls' empty we incorrectly return false from
473 // DeclContext::LoadLexicalDeclsFromExternalStorage which might cause
474 // lookup issues later on.
475 // We can't just add them for now as the ASTImporter already added the
476 // decl into the DeclContext and this would add it twice.
478 if (FieldDecl
*copied_field
= dyn_cast
<FieldDecl
>(copied_decl
)) {
479 QualType copied_field_type
= copied_field
->getType();
481 m_ast_importer_sp
->RequireCompleteType(copied_field_type
);
488 // CopyDecl may build a lookup table which may set up ExternalLexicalStorage
489 // to false. However, since we skipped some of the external Decls we must
492 decl_context
->setHasExternalLexicalStorage(true);
493 // This sets HasLazyExternalLexicalLookups to true. By setting this bit we
494 // ensure that the lookup table is rebuilt, which means the external source
495 // is consulted again when a clang::DeclContext::lookup is called.
496 const_cast<DeclContext
*>(decl_context
)->setMustBuildLookupTable();
500 void ClangASTSource::FindExternalVisibleDecls(NameSearchContext
&context
) {
501 assert(m_ast_context
);
503 const ConstString
name(context
.m_decl_name
.getAsString().c_str());
505 Log
*log
= GetLog(LLDBLog::Expressions
);
508 if (!context
.m_decl_context
)
510 "ClangASTSource::FindExternalVisibleDecls on "
511 "(ASTContext*){0:x} '{1}' for '{2}' in a NULL DeclContext",
512 m_ast_context
, m_clang_ast_context
->getDisplayName(), name
);
513 else if (const NamedDecl
*context_named_decl
=
514 dyn_cast
<NamedDecl
>(context
.m_decl_context
))
516 "ClangASTSource::FindExternalVisibleDecls on "
517 "(ASTContext*){0:x} '{1}' for '{2}' in '{3}'",
518 m_ast_context
, m_clang_ast_context
->getDisplayName(), name
,
519 context_named_decl
->getName());
522 "ClangASTSource::FindExternalVisibleDecls on "
523 "(ASTContext*){0:x} '{1}' for '{2}' in a '{3}'",
524 m_ast_context
, m_clang_ast_context
->getDisplayName(), name
,
525 context
.m_decl_context
->getDeclKindName());
528 if (isa
<NamespaceDecl
>(context
.m_decl_context
)) {
529 LookupInNamespace(context
);
530 } else if (isa
<ObjCInterfaceDecl
>(context
.m_decl_context
)) {
531 FindObjCPropertyAndIvarDecls(context
);
532 } else if (!isa
<TranslationUnitDecl
>(context
.m_decl_context
)) {
533 // we shouldn't be getting FindExternalVisibleDecls calls for these
536 CompilerDeclContext namespace_decl
;
538 LLDB_LOG(log
, " CAS::FEVD Searching the root namespace");
540 FindExternalVisibleDecls(context
, lldb::ModuleSP(), namespace_decl
);
543 if (!context
.m_namespace_map
->empty()) {
544 if (log
&& log
->GetVerbose())
545 LLDB_LOG(log
, " CAS::FEVD Registering namespace map {0:x} ({1} entries)",
546 context
.m_namespace_map
.get(), context
.m_namespace_map
->size());
548 NamespaceDecl
*clang_namespace_decl
=
549 AddNamespace(context
, context
.m_namespace_map
);
551 if (clang_namespace_decl
)
552 clang_namespace_decl
->setHasExternalVisibleStorage();
556 clang::Sema
*ClangASTSource::getSema() {
557 return m_clang_ast_context
->getSema();
560 bool ClangASTSource::IgnoreName(const ConstString name
,
561 bool ignore_all_dollar_names
) {
562 static const ConstString
id_name("id");
563 static const ConstString
Class_name("Class");
565 if (m_ast_context
->getLangOpts().ObjC
)
566 if (name
== id_name
|| name
== Class_name
)
569 StringRef name_string_ref
= name
.GetStringRef();
571 // The ClangASTSource is not responsible for finding $-names.
572 return name_string_ref
.empty() ||
573 (ignore_all_dollar_names
&& name_string_ref
.starts_with("$")) ||
574 name_string_ref
.starts_with("_$");
577 void ClangASTSource::FindExternalVisibleDecls(
578 NameSearchContext
&context
, lldb::ModuleSP module_sp
,
579 CompilerDeclContext
&namespace_decl
) {
580 assert(m_ast_context
);
582 Log
*log
= GetLog(LLDBLog::Expressions
);
584 SymbolContextList sc_list
;
586 const ConstString
name(context
.m_decl_name
.getAsString().c_str());
587 if (IgnoreName(name
, true))
593 FillNamespaceMap(context
, module_sp
, namespace_decl
);
595 if (context
.m_found_type
)
598 lldb::TypeSP type_sp
;
600 if (module_sp
&& namespace_decl
) {
601 // Match the name in the specified decl context.
602 TypeQuery
query(namespace_decl
, name
, TypeQueryOptions::e_find_one
);
603 module_sp
->FindTypes(query
, results
);
604 type_sp
= results
.GetFirstType();
606 // Match the exact name of the type at the root level.
607 TypeQuery
query(name
.GetStringRef(), TypeQueryOptions::e_exact_match
|
608 TypeQueryOptions::e_find_one
);
609 m_target
->GetImages().FindTypes(nullptr, query
, results
);
610 type_sp
= results
.GetFirstType();
615 const char *name_string
= type_sp
->GetName().GetCString();
617 LLDB_LOG(log
, " CAS::FEVD Matching type found for \"{0}\": {1}", name
,
618 (name_string
? name_string
: "<anonymous>"));
621 CompilerType full_type
= type_sp
->GetFullCompilerType();
623 CompilerType
copied_clang_type(GuardedCopyType(full_type
));
625 if (!copied_clang_type
) {
626 LLDB_LOG(log
, " CAS::FEVD - Couldn't export a type");
629 context
.AddTypeDecl(copied_clang_type
);
631 context
.m_found_type
= true;
635 if (!context
.m_found_type
) {
636 // Try the modules next.
637 FindDeclInModules(context
, name
);
640 if (!context
.m_found_type
&& m_ast_context
->getLangOpts().ObjC
) {
641 FindDeclInObjCRuntime(context
, name
);
645 void ClangASTSource::FillNamespaceMap(
646 NameSearchContext
&context
, lldb::ModuleSP module_sp
,
647 const CompilerDeclContext
&namespace_decl
) {
648 const ConstString
name(context
.m_decl_name
.getAsString().c_str());
649 if (IgnoreName(name
, true))
652 Log
*log
= GetLog(LLDBLog::Expressions
);
654 if (module_sp
&& namespace_decl
) {
655 CompilerDeclContext found_namespace_decl
;
657 if (SymbolFile
*symbol_file
= module_sp
->GetSymbolFile()) {
658 found_namespace_decl
= symbol_file
->FindNamespace(name
, namespace_decl
);
660 if (found_namespace_decl
) {
661 context
.m_namespace_map
->push_back(
662 std::pair
<lldb::ModuleSP
, CompilerDeclContext
>(
663 module_sp
, found_namespace_decl
));
665 LLDB_LOG(log
, " CAS::FEVD Found namespace {0} in module {1}", name
,
666 module_sp
->GetFileSpec().GetFilename());
672 for (lldb::ModuleSP image
: m_target
->GetImages().Modules()) {
676 CompilerDeclContext found_namespace_decl
;
678 SymbolFile
*symbol_file
= image
->GetSymbolFile();
683 // If namespace_decl is not valid, 'FindNamespace' would look for
684 // any namespace called 'name' (ignoring parent contexts) and return
685 // the first one it finds. Thus if we're doing a qualified lookup only
686 // consider root namespaces. E.g., in an expression ::A::B::Foo, the
687 // lookup of ::A will result in a qualified lookup. Note, namespace
688 // disambiguation for function calls are handled separately in
689 // SearchFunctionsInSymbolContexts.
690 const bool find_root_namespaces
=
691 context
.m_decl_context
&&
692 context
.m_decl_context
->shouldUseQualifiedLookup();
693 found_namespace_decl
= symbol_file
->FindNamespace(
694 name
, namespace_decl
, /* only root namespaces */ find_root_namespaces
);
696 if (found_namespace_decl
) {
697 context
.m_namespace_map
->push_back(
698 std::pair
<lldb::ModuleSP
, CompilerDeclContext
>(image
,
699 found_namespace_decl
));
701 LLDB_LOG(log
, " CAS::FEVD Found namespace {0} in module {1}", name
,
702 image
->GetFileSpec().GetFilename());
707 bool ClangASTSource::FindObjCMethodDeclsWithOrigin(
708 NameSearchContext
&context
, ObjCInterfaceDecl
*original_interface_decl
,
709 const char *log_info
) {
710 const DeclarationName
&decl_name(context
.m_decl_name
);
711 clang::ASTContext
*original_ctx
= &original_interface_decl
->getASTContext();
713 Selector original_selector
;
715 if (decl_name
.isObjCZeroArgSelector()) {
716 const IdentifierInfo
*ident
=
717 &original_ctx
->Idents
.get(decl_name
.getAsString());
718 original_selector
= original_ctx
->Selectors
.getSelector(0, &ident
);
719 } else if (decl_name
.isObjCOneArgSelector()) {
720 const std::string
&decl_name_string
= decl_name
.getAsString();
721 std::string
decl_name_string_without_colon(decl_name_string
.c_str(),
722 decl_name_string
.length() - 1);
723 const IdentifierInfo
*ident
=
724 &original_ctx
->Idents
.get(decl_name_string_without_colon
);
725 original_selector
= original_ctx
->Selectors
.getSelector(1, &ident
);
727 SmallVector
<const IdentifierInfo
*, 4> idents
;
729 clang::Selector sel
= decl_name
.getObjCSelector();
731 unsigned num_args
= sel
.getNumArgs();
733 for (unsigned i
= 0; i
!= num_args
; ++i
) {
734 idents
.push_back(&original_ctx
->Idents
.get(sel
.getNameForSlot(i
)));
738 original_ctx
->Selectors
.getSelector(num_args
, idents
.data());
741 DeclarationName
original_decl_name(original_selector
);
743 llvm::SmallVector
<NamedDecl
*, 1> methods
;
745 TypeSystemClang::GetCompleteDecl(original_ctx
, original_interface_decl
);
747 if (ObjCMethodDecl
*instance_method_decl
=
748 original_interface_decl
->lookupInstanceMethod(original_selector
)) {
749 methods
.push_back(instance_method_decl
);
750 } else if (ObjCMethodDecl
*class_method_decl
=
751 original_interface_decl
->lookupClassMethod(
752 original_selector
)) {
753 methods
.push_back(class_method_decl
);
756 if (methods
.empty()) {
760 for (NamedDecl
*named_decl
: methods
) {
764 ObjCMethodDecl
*result_method
= dyn_cast
<ObjCMethodDecl
>(named_decl
);
769 Decl
*copied_decl
= CopyDecl(result_method
);
774 ObjCMethodDecl
*copied_method_decl
= dyn_cast
<ObjCMethodDecl
>(copied_decl
);
776 if (!copied_method_decl
)
779 Log
*log
= GetLog(LLDBLog::Expressions
);
781 LLDB_LOG(log
, " CAS::FOMD found ({0}) {1}", log_info
,
782 ClangUtil::DumpDecl(copied_method_decl
));
784 context
.AddNamedDecl(copied_method_decl
);
790 void ClangASTSource::FindDeclInModules(NameSearchContext
&context
,
792 Log
*log
= GetLog(LLDBLog::Expressions
);
794 std::shared_ptr
<ClangModulesDeclVendor
> modules_decl_vendor
=
795 GetClangModulesDeclVendor();
796 if (!modules_decl_vendor
)
800 uint32_t max_matches
= 1;
801 std::vector
<clang::NamedDecl
*> decls
;
803 if (!modules_decl_vendor
->FindDecls(name
, append
, max_matches
, decls
))
806 LLDB_LOG(log
, " CAS::FEVD Matching entity found for \"{0}\" in the modules",
809 clang::NamedDecl
*const decl_from_modules
= decls
[0];
811 if (llvm::isa
<clang::TypeDecl
>(decl_from_modules
) ||
812 llvm::isa
<clang::ObjCContainerDecl
>(decl_from_modules
) ||
813 llvm::isa
<clang::EnumConstantDecl
>(decl_from_modules
)) {
814 clang::Decl
*copied_decl
= CopyDecl(decl_from_modules
);
815 clang::NamedDecl
*copied_named_decl
=
816 copied_decl
? dyn_cast
<clang::NamedDecl
>(copied_decl
) : nullptr;
818 if (!copied_named_decl
) {
819 LLDB_LOG(log
, " CAS::FEVD - Couldn't export a type from the modules");
824 context
.AddNamedDecl(copied_named_decl
);
826 context
.m_found_type
= true;
830 void ClangASTSource::FindDeclInObjCRuntime(NameSearchContext
&context
,
832 Log
*log
= GetLog(LLDBLog::Expressions
);
834 lldb::ProcessSP
process(m_target
->GetProcessSP());
839 ObjCLanguageRuntime
*language_runtime(ObjCLanguageRuntime::Get(*process
));
841 if (!language_runtime
)
844 DeclVendor
*decl_vendor
= language_runtime
->GetDeclVendor();
850 uint32_t max_matches
= 1;
851 std::vector
<clang::NamedDecl
*> decls
;
853 auto *clang_decl_vendor
= llvm::cast
<ClangDeclVendor
>(decl_vendor
);
854 if (!clang_decl_vendor
->FindDecls(name
, append
, max_matches
, decls
))
857 LLDB_LOG(log
, " CAS::FEVD Matching type found for \"{0}\" in the runtime",
860 clang::Decl
*copied_decl
= CopyDecl(decls
[0]);
861 clang::NamedDecl
*copied_named_decl
=
862 copied_decl
? dyn_cast
<clang::NamedDecl
>(copied_decl
) : nullptr;
864 if (!copied_named_decl
) {
865 LLDB_LOG(log
, " CAS::FEVD - Couldn't export a type from the runtime");
870 context
.AddNamedDecl(copied_named_decl
);
873 void ClangASTSource::FindObjCMethodDecls(NameSearchContext
&context
) {
874 Log
*log
= GetLog(LLDBLog::Expressions
);
876 const DeclarationName
&decl_name(context
.m_decl_name
);
877 const DeclContext
*decl_ctx(context
.m_decl_context
);
879 const ObjCInterfaceDecl
*interface_decl
=
880 dyn_cast
<ObjCInterfaceDecl
>(decl_ctx
);
886 ClangASTImporter::DeclOrigin original
= m_ast_importer_sp
->GetDeclOrigin(interface_decl
);
888 if (!original
.Valid())
891 ObjCInterfaceDecl
*original_interface_decl
=
892 dyn_cast
<ObjCInterfaceDecl
>(original
.decl
);
894 if (FindObjCMethodDeclsWithOrigin(context
, original_interface_decl
,
896 return; // found it, no need to look any further
901 if (decl_name
.isObjCZeroArgSelector()) {
902 ss
.Printf("%s", decl_name
.getAsString().c_str());
903 } else if (decl_name
.isObjCOneArgSelector()) {
904 ss
.Printf("%s", decl_name
.getAsString().c_str());
906 clang::Selector sel
= decl_name
.getObjCSelector();
908 for (unsigned i
= 0, e
= sel
.getNumArgs(); i
!= e
; ++i
) {
909 llvm::StringRef r
= sel
.getNameForSlot(i
);
910 ss
.Printf("%s:", r
.str().c_str());
915 if (ss
.GetString().contains("$__lldb"))
916 return; // we don't need any results
918 ConstString
selector_name(ss
.GetString());
921 "ClangASTSource::FindObjCMethodDecls on (ASTContext*){0:x} '{1}' "
922 "for selector [{2} {3}]",
923 m_ast_context
, m_clang_ast_context
->getDisplayName(),
924 interface_decl
->getName(), selector_name
);
925 SymbolContextList sc_list
;
927 ModuleFunctionSearchOptions function_options
;
928 function_options
.include_symbols
= false;
929 function_options
.include_inlines
= false;
931 std::string interface_name
= interface_decl
->getNameAsString();
935 ms
.Printf("-[%s %s]", interface_name
.c_str(), selector_name
.AsCString());
937 ConstString
instance_method_name(ms
.GetString());
940 m_target
->GetImages().FindFunctions(instance_method_name
,
941 lldb::eFunctionNameTypeFull
,
942 function_options
, sc_list
);
944 if (sc_list
.GetSize())
948 ms
.Printf("+[%s %s]", interface_name
.c_str(), selector_name
.AsCString());
950 ConstString
class_method_name(ms
.GetString());
953 m_target
->GetImages().FindFunctions(class_method_name
,
954 lldb::eFunctionNameTypeFull
,
955 function_options
, sc_list
);
957 if (sc_list
.GetSize())
960 // Fall back and check for methods in categories. If we find methods this
961 // way, we need to check that they're actually in categories on the desired
964 SymbolContextList candidate_sc_list
;
966 m_target
->GetImages().FindFunctions(selector_name
,
967 lldb::eFunctionNameTypeSelector
,
968 function_options
, candidate_sc_list
);
970 for (const SymbolContext
&candidate_sc
: candidate_sc_list
) {
971 if (!candidate_sc
.function
)
974 const char *candidate_name
= candidate_sc
.function
->GetName().AsCString();
976 const char *cursor
= candidate_name
;
978 if (*cursor
!= '+' && *cursor
!= '-')
988 size_t interface_len
= interface_name
.length();
990 if (strncmp(cursor
, interface_name
.c_str(), interface_len
))
993 cursor
+= interface_len
;
995 if (*cursor
== ' ' || *cursor
== '(')
996 sc_list
.Append(candidate_sc
);
1000 if (sc_list
.GetSize()) {
1001 // We found a good function symbol. Use that.
1003 for (const SymbolContext
&sc
: sc_list
) {
1007 CompilerDeclContext function_decl_ctx
= sc
.function
->GetDeclContext();
1008 if (!function_decl_ctx
)
1011 ObjCMethodDecl
*method_decl
=
1012 TypeSystemClang::DeclContextGetAsObjCMethodDecl(function_decl_ctx
);
1017 ObjCInterfaceDecl
*found_interface_decl
=
1018 method_decl
->getClassInterface();
1020 if (!found_interface_decl
)
1023 if (found_interface_decl
->getName() == interface_decl
->getName()) {
1024 Decl
*copied_decl
= CopyDecl(method_decl
);
1029 ObjCMethodDecl
*copied_method_decl
=
1030 dyn_cast
<ObjCMethodDecl
>(copied_decl
);
1032 if (!copied_method_decl
)
1035 LLDB_LOG(log
, " CAS::FOMD found (in symbols)\n{0}",
1036 ClangUtil::DumpDecl(copied_method_decl
));
1038 context
.AddNamedDecl(copied_method_decl
);
1045 // Try the debug information.
1048 ObjCInterfaceDecl
*complete_interface_decl
= GetCompleteObjCInterface(
1049 const_cast<ObjCInterfaceDecl
*>(interface_decl
));
1051 if (!complete_interface_decl
)
1054 // We found the complete interface. The runtime never needs to be queried
1055 // in this scenario.
1057 DeclFromUser
<const ObjCInterfaceDecl
> complete_iface_decl(
1058 complete_interface_decl
);
1060 if (complete_interface_decl
== interface_decl
)
1061 break; // already checked this one
1064 "CAS::FOPD trying origin "
1065 "(ObjCInterfaceDecl*){0:x}/(ASTContext*){1:x}...",
1066 complete_interface_decl
, &complete_iface_decl
->getASTContext());
1068 FindObjCMethodDeclsWithOrigin(context
, complete_interface_decl
,
1075 // Check the modules only if the debug information didn't have a complete
1078 if (std::shared_ptr
<ClangModulesDeclVendor
> modules_decl_vendor
=
1079 GetClangModulesDeclVendor()) {
1080 ConstString
interface_name(interface_decl
->getNameAsString().c_str());
1081 bool append
= false;
1082 uint32_t max_matches
= 1;
1083 std::vector
<clang::NamedDecl
*> decls
;
1085 if (!modules_decl_vendor
->FindDecls(interface_name
, append
, max_matches
,
1089 ObjCInterfaceDecl
*interface_decl_from_modules
=
1090 dyn_cast
<ObjCInterfaceDecl
>(decls
[0]);
1092 if (!interface_decl_from_modules
)
1095 if (FindObjCMethodDeclsWithOrigin(context
, interface_decl_from_modules
,
1102 // Check the runtime only if the debug information didn't have a complete
1103 // interface and the modules don't get us anywhere.
1105 lldb::ProcessSP
process(m_target
->GetProcessSP());
1110 ObjCLanguageRuntime
*language_runtime(ObjCLanguageRuntime::Get(*process
));
1112 if (!language_runtime
)
1115 DeclVendor
*decl_vendor
= language_runtime
->GetDeclVendor();
1120 ConstString
interface_name(interface_decl
->getNameAsString().c_str());
1121 bool append
= false;
1122 uint32_t max_matches
= 1;
1123 std::vector
<clang::NamedDecl
*> decls
;
1125 auto *clang_decl_vendor
= llvm::cast
<ClangDeclVendor
>(decl_vendor
);
1126 if (!clang_decl_vendor
->FindDecls(interface_name
, append
, max_matches
,
1130 ObjCInterfaceDecl
*runtime_interface_decl
=
1131 dyn_cast
<ObjCInterfaceDecl
>(decls
[0]);
1133 if (!runtime_interface_decl
)
1136 FindObjCMethodDeclsWithOrigin(context
, runtime_interface_decl
,
1141 bool ClangASTSource::FindObjCPropertyAndIvarDeclsWithOrigin(
1142 NameSearchContext
&context
,
1143 DeclFromUser
<const ObjCInterfaceDecl
> &origin_iface_decl
) {
1144 Log
*log
= GetLog(LLDBLog::Expressions
);
1146 if (origin_iface_decl
.IsInvalid())
1149 std::string name_str
= context
.m_decl_name
.getAsString();
1150 StringRef
name(name_str
);
1151 IdentifierInfo
&name_identifier(
1152 origin_iface_decl
->getASTContext().Idents
.get(name
));
1154 DeclFromUser
<ObjCPropertyDecl
> origin_property_decl(
1155 origin_iface_decl
->FindPropertyDeclaration(
1156 &name_identifier
, ObjCPropertyQueryKind::OBJC_PR_query_instance
));
1160 if (origin_property_decl
.IsValid()) {
1161 DeclFromParser
<ObjCPropertyDecl
> parser_property_decl(
1162 origin_property_decl
.Import(m_ast_context
, *m_ast_importer_sp
));
1163 if (parser_property_decl
.IsValid()) {
1164 LLDB_LOG(log
, " CAS::FOPD found\n{0}",
1165 ClangUtil::DumpDecl(parser_property_decl
.decl
));
1167 context
.AddNamedDecl(parser_property_decl
.decl
);
1172 DeclFromUser
<ObjCIvarDecl
> origin_ivar_decl(
1173 origin_iface_decl
->getIvarDecl(&name_identifier
));
1175 if (origin_ivar_decl
.IsValid()) {
1176 DeclFromParser
<ObjCIvarDecl
> parser_ivar_decl(
1177 origin_ivar_decl
.Import(m_ast_context
, *m_ast_importer_sp
));
1178 if (parser_ivar_decl
.IsValid()) {
1179 LLDB_LOG(log
, " CAS::FOPD found\n{0}",
1180 ClangUtil::DumpDecl(parser_ivar_decl
.decl
));
1182 context
.AddNamedDecl(parser_ivar_decl
.decl
);
1190 void ClangASTSource::FindObjCPropertyAndIvarDecls(NameSearchContext
&context
) {
1191 Log
*log
= GetLog(LLDBLog::Expressions
);
1193 DeclFromParser
<const ObjCInterfaceDecl
> parser_iface_decl(
1194 cast
<ObjCInterfaceDecl
>(context
.m_decl_context
));
1195 DeclFromUser
<const ObjCInterfaceDecl
> origin_iface_decl(
1196 parser_iface_decl
.GetOrigin(*m_ast_importer_sp
));
1198 ConstString
class_name(parser_iface_decl
->getNameAsString().c_str());
1201 "ClangASTSource::FindObjCPropertyAndIvarDecls on "
1202 "(ASTContext*){0:x} '{1}' for '{2}.{3}'",
1203 m_ast_context
, m_clang_ast_context
->getDisplayName(),
1204 parser_iface_decl
->getName(), context
.m_decl_name
.getAsString());
1206 if (FindObjCPropertyAndIvarDeclsWithOrigin(context
, origin_iface_decl
))
1210 "CAS::FOPD couldn't find the property on origin "
1211 "(ObjCInterfaceDecl*){0:x}/(ASTContext*){1:x}, searching "
1213 origin_iface_decl
.decl
, &origin_iface_decl
->getASTContext());
1215 SymbolContext null_sc
;
1219 ObjCInterfaceDecl
*complete_interface_decl
= GetCompleteObjCInterface(
1220 const_cast<ObjCInterfaceDecl
*>(parser_iface_decl
.decl
));
1222 if (!complete_interface_decl
)
1225 // We found the complete interface. The runtime never needs to be queried
1226 // in this scenario.
1228 DeclFromUser
<const ObjCInterfaceDecl
> complete_iface_decl(
1229 complete_interface_decl
);
1231 if (complete_iface_decl
.decl
== origin_iface_decl
.decl
)
1232 break; // already checked this one
1235 "CAS::FOPD trying origin "
1236 "(ObjCInterfaceDecl*){0:x}/(ASTContext*){1:x}...",
1237 complete_iface_decl
.decl
, &complete_iface_decl
->getASTContext());
1239 FindObjCPropertyAndIvarDeclsWithOrigin(context
, complete_iface_decl
);
1245 // Check the modules only if the debug information didn't have a complete
1248 std::shared_ptr
<ClangModulesDeclVendor
> modules_decl_vendor
=
1249 GetClangModulesDeclVendor();
1251 if (!modules_decl_vendor
)
1254 bool append
= false;
1255 uint32_t max_matches
= 1;
1256 std::vector
<clang::NamedDecl
*> decls
;
1258 if (!modules_decl_vendor
->FindDecls(class_name
, append
, max_matches
, decls
))
1261 DeclFromUser
<const ObjCInterfaceDecl
> interface_decl_from_modules(
1262 dyn_cast
<ObjCInterfaceDecl
>(decls
[0]));
1264 if (!interface_decl_from_modules
.IsValid())
1268 "CAS::FOPD[{0:x}] trying module "
1269 "(ObjCInterfaceDecl*){0:x}/(ASTContext*){1:x}...",
1270 interface_decl_from_modules
.decl
,
1271 &interface_decl_from_modules
->getASTContext());
1273 if (FindObjCPropertyAndIvarDeclsWithOrigin(context
,
1274 interface_decl_from_modules
))
1279 // Check the runtime only if the debug information didn't have a complete
1280 // interface and nothing was in the modules.
1282 lldb::ProcessSP
process(m_target
->GetProcessSP());
1287 ObjCLanguageRuntime
*language_runtime(ObjCLanguageRuntime::Get(*process
));
1289 if (!language_runtime
)
1292 DeclVendor
*decl_vendor
= language_runtime
->GetDeclVendor();
1297 bool append
= false;
1298 uint32_t max_matches
= 1;
1299 std::vector
<clang::NamedDecl
*> decls
;
1301 auto *clang_decl_vendor
= llvm::cast
<ClangDeclVendor
>(decl_vendor
);
1302 if (!clang_decl_vendor
->FindDecls(class_name
, append
, max_matches
, decls
))
1305 DeclFromUser
<const ObjCInterfaceDecl
> interface_decl_from_runtime(
1306 dyn_cast
<ObjCInterfaceDecl
>(decls
[0]));
1308 if (!interface_decl_from_runtime
.IsValid())
1312 "CAS::FOPD[{0:x}] trying runtime "
1313 "(ObjCInterfaceDecl*){0:x}/(ASTContext*){1:x}...",
1314 interface_decl_from_runtime
.decl
,
1315 &interface_decl_from_runtime
->getASTContext());
1317 if (FindObjCPropertyAndIvarDeclsWithOrigin(context
,
1318 interface_decl_from_runtime
))
1323 void ClangASTSource::LookupInNamespace(NameSearchContext
&context
) {
1324 const NamespaceDecl
*namespace_context
=
1325 dyn_cast
<NamespaceDecl
>(context
.m_decl_context
);
1327 Log
*log
= GetLog(LLDBLog::Expressions
);
1329 ClangASTImporter::NamespaceMapSP namespace_map
=
1330 m_ast_importer_sp
->GetNamespaceMap(namespace_context
);
1332 LLDB_LOGV(log
, " CAS::FEVD Inspecting namespace map {0:x} ({1} entries)",
1333 namespace_map
.get(), namespace_map
->size());
1338 for (ClangASTImporter::NamespaceMap::iterator i
= namespace_map
->begin(),
1339 e
= namespace_map
->end();
1341 LLDB_LOG(log
, " CAS::FEVD Searching namespace {0} in module {1}",
1342 i
->second
.GetName(), i
->first
->GetFileSpec().GetFilename());
1344 FindExternalVisibleDecls(context
, i
->first
, i
->second
);
1348 bool ClangASTSource::layoutRecordType(
1349 const RecordDecl
*record
, uint64_t &size
, uint64_t &alignment
,
1350 llvm::DenseMap
<const clang::FieldDecl
*, uint64_t> &field_offsets
,
1351 llvm::DenseMap
<const clang::CXXRecordDecl
*, clang::CharUnits
>
1353 llvm::DenseMap
<const clang::CXXRecordDecl
*, clang::CharUnits
>
1354 &virtual_base_offsets
) {
1355 return m_ast_importer_sp
->importRecordLayoutFromOrigin(
1356 record
, size
, alignment
, field_offsets
, base_offsets
,
1357 virtual_base_offsets
);
1360 void ClangASTSource::CompleteNamespaceMap(
1361 ClangASTImporter::NamespaceMapSP
&namespace_map
, ConstString name
,
1362 ClangASTImporter::NamespaceMapSP
&parent_map
) const {
1364 Log
*log
= GetLog(LLDBLog::Expressions
);
1367 if (parent_map
&& parent_map
->size())
1369 "CompleteNamespaceMap on (ASTContext*){0:x} '{1}' Searching "
1370 "for namespace {2} in namespace {3}",
1371 m_ast_context
, m_clang_ast_context
->getDisplayName(), name
,
1372 parent_map
->begin()->second
.GetName());
1375 "CompleteNamespaceMap on (ASTContext*){0} '{1}' Searching "
1376 "for namespace {2}",
1377 m_ast_context
, m_clang_ast_context
->getDisplayName(), name
);
1381 for (ClangASTImporter::NamespaceMap::iterator i
= parent_map
->begin(),
1382 e
= parent_map
->end();
1384 CompilerDeclContext found_namespace_decl
;
1386 lldb::ModuleSP module_sp
= i
->first
;
1387 CompilerDeclContext module_parent_namespace_decl
= i
->second
;
1389 SymbolFile
*symbol_file
= module_sp
->GetSymbolFile();
1394 found_namespace_decl
=
1395 symbol_file
->FindNamespace(name
, module_parent_namespace_decl
);
1397 if (!found_namespace_decl
)
1400 namespace_map
->push_back(std::pair
<lldb::ModuleSP
, CompilerDeclContext
>(
1401 module_sp
, found_namespace_decl
));
1403 LLDB_LOG(log
, " CMN Found namespace {0} in module {1}", name
,
1404 module_sp
->GetFileSpec().GetFilename());
1407 CompilerDeclContext null_namespace_decl
;
1408 for (lldb::ModuleSP image
: m_target
->GetImages().Modules()) {
1412 CompilerDeclContext found_namespace_decl
;
1414 SymbolFile
*symbol_file
= image
->GetSymbolFile();
1419 found_namespace_decl
=
1420 symbol_file
->FindNamespace(name
, null_namespace_decl
);
1422 if (!found_namespace_decl
)
1425 namespace_map
->push_back(std::pair
<lldb::ModuleSP
, CompilerDeclContext
>(
1426 image
, found_namespace_decl
));
1428 LLDB_LOG(log
, " CMN[{0}] Found namespace {0} in module {1}", name
,
1429 image
->GetFileSpec().GetFilename());
1434 NamespaceDecl
*ClangASTSource::AddNamespace(
1435 NameSearchContext
&context
,
1436 ClangASTImporter::NamespaceMapSP
&namespace_decls
) {
1437 if (!namespace_decls
)
1440 const CompilerDeclContext
&namespace_decl
= namespace_decls
->begin()->second
;
1442 clang::ASTContext
*src_ast
=
1443 TypeSystemClang::DeclContextGetTypeSystemClang(namespace_decl
);
1446 clang::NamespaceDecl
*src_namespace_decl
=
1447 TypeSystemClang::DeclContextGetAsNamespaceDecl(namespace_decl
);
1449 if (!src_namespace_decl
)
1452 Decl
*copied_decl
= CopyDecl(src_namespace_decl
);
1457 NamespaceDecl
*copied_namespace_decl
= dyn_cast
<NamespaceDecl
>(copied_decl
);
1459 if (!copied_namespace_decl
)
1462 context
.m_decls
.push_back(copied_namespace_decl
);
1464 m_ast_importer_sp
->RegisterNamespaceMap(copied_namespace_decl
,
1467 return dyn_cast
<NamespaceDecl
>(copied_decl
);
1470 clang::Decl
*ClangASTSource::CopyDecl(Decl
*src_decl
) {
1471 return m_ast_importer_sp
->CopyDecl(m_ast_context
, src_decl
);
1474 ClangASTImporter::DeclOrigin
ClangASTSource::GetDeclOrigin(const clang::Decl
*decl
) {
1475 return m_ast_importer_sp
->GetDeclOrigin(decl
);
1478 CompilerType
ClangASTSource::GuardedCopyType(const CompilerType
&src_type
) {
1479 auto ts
= src_type
.GetTypeSystem();
1480 auto src_ast
= ts
.dyn_cast_or_null
<TypeSystemClang
>();
1484 QualType copied_qual_type
= ClangUtil::GetQualType(
1485 m_ast_importer_sp
->CopyType(*m_clang_ast_context
, src_type
));
1487 if (copied_qual_type
.getAsOpaquePtr() &&
1488 copied_qual_type
->getCanonicalTypeInternal().isNull())
1489 // this shouldn't happen, but we're hardening because the AST importer
1490 // seems to be generating bad types on occasion.
1493 return m_clang_ast_context
->GetType(copied_qual_type
);
1496 std::shared_ptr
<ClangModulesDeclVendor
>
1497 ClangASTSource::GetClangModulesDeclVendor() {
1498 auto persistent_vars
= llvm::cast
<ClangPersistentVariables
>(
1499 m_target
->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC
));
1500 return persistent_vars
->GetClangModulesDeclVendor();