1 //===-- ClangASTSource.cpp ------------------------------------------------===// 2 // 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 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "ClangASTSource.h" 10 11 #include "ClangDeclVendor.h" 12 #include "ClangModulesDeclVendor.h" 13 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/Log.h" 22 #include "clang/AST/ASTContext.h" 23 #include "clang/AST/RecordLayout.h" 24 #include "clang/Basic/SourceManager.h" 25 26 #include "Plugins/ExpressionParser/Clang/ClangUtil.h" 27 #include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h" 28 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" 29 30 #include <memory> 31 #include <vector> 32 33 using namespace clang; 34 using namespace lldb_private; 35 36 // Scoped class that will remove an active lexical decl from the set when it 37 // goes out of scope. 38 namespace { 39 class ScopedLexicalDeclEraser { 40 public: 41 ScopedLexicalDeclEraser(std::set<const clang::Decl *> &decls, 42 const clang::Decl *decl) 43 : m_active_lexical_decls(decls), m_decl(decl) {} 44 45 ~ScopedLexicalDeclEraser() { m_active_lexical_decls.erase(m_decl); } 46 47 private: 48 std::set<const clang::Decl *> &m_active_lexical_decls; 49 const clang::Decl *m_decl; 50 }; 51 } 52 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(), 58 m_active_lookups() { 59 assert(m_ast_importer_sp && "No ClangASTImporter passed to ClangASTSource?"); 60 } 61 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); 67 } 68 69 ClangASTSource::~ClangASTSource() { 70 m_ast_importer_sp->ForgetDestination(m_ast_context); 71 72 if (!m_target) 73 return; 74 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 TypeSystemClang *scratch_ast = ScratchTypeSystemClang::GetForTarget( 81 *m_target, ScratchTypeSystemClang::DefaultAST, false); 82 83 if (!scratch_ast) 84 return; 85 86 ScratchTypeSystemClang *default_scratch_ast = 87 llvm::cast<ScratchTypeSystemClang>(scratch_ast); 88 // Unregister from the default scratch AST (and all sub-ASTs). 89 default_scratch_ast->ForgetSource(m_ast_context, *m_ast_importer_sp); 90 } 91 92 void ClangASTSource::StartTranslationUnit(ASTConsumer *Consumer) { 93 if (!m_ast_context) 94 return; 95 96 m_ast_context->getTranslationUnitDecl()->setHasExternalVisibleStorage(); 97 m_ast_context->getTranslationUnitDecl()->setHasExternalLexicalStorage(); 98 } 99 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); 105 return false; 106 } 107 108 std::string decl_name(clang_decl_name.getAsString()); 109 110 switch (clang_decl_name.getNameKind()) { 111 // Normal identifiers. 112 case DeclarationName::Identifier: { 113 clang::IdentifierInfo *identifier_info = 114 clang_decl_name.getAsIdentifierInfo(); 115 116 if (!identifier_info || identifier_info->getBuiltinID() != 0) { 117 SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name); 118 return false; 119 } 120 } break; 121 122 // Operator names. 123 case DeclarationName::CXXOperatorName: 124 case DeclarationName::CXXLiteralOperatorName: 125 break; 126 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); 131 return false; 132 133 case DeclarationName::ObjCZeroArgSelector: 134 case DeclarationName::ObjCOneArgSelector: 135 case DeclarationName::ObjCMultiArgSelector: { 136 llvm::SmallVector<NamedDecl *, 1> method_decls; 137 138 NameSearchContext method_search_context(*m_clang_ast_context, method_decls, 139 clang_decl_name, decl_ctx); 140 141 FindObjCMethodDecls(method_search_context); 142 143 SetExternalVisibleDeclsForName(decl_ctx, clang_decl_name, method_decls); 144 return (method_decls.size() > 0); 145 } 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); 152 return false; 153 } 154 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); 160 } else { 161 SetNoExternalVisibleDeclsForName(decl_ctx, clang_decl_name); 162 return false; 163 } 164 } 165 166 ConstString const_decl_name(decl_name.c_str()); 167 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); 173 return false; 174 } 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); 183 } 184 185 TagDecl *ClangASTSource::FindCompleteType(const TagDecl *decl) { 186 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 187 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); 192 193 LLDB_LOGV(log, " CTD Inspecting namespace map{0} ({1} entries)", 194 namespace_map.get(), namespace_map->size()); 195 196 if (!namespace_map) 197 return nullptr; 198 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()); 202 203 TypeList types; 204 205 ConstString name(decl->getName()); 206 207 item.first->FindTypesInNamespace(name, item.second, UINT32_MAX, types); 208 209 for (uint32_t ti = 0, te = types.GetSize(); ti != te; ++ti) { 210 lldb::TypeSP type = types.GetTypeAtIndex(ti); 211 212 if (!type) 213 continue; 214 215 CompilerType clang_type(type->GetFullCompilerType()); 216 217 if (!ClangUtil::IsClangType(clang_type)) 218 continue; 219 220 const TagType *tag_type = 221 ClangUtil::GetQualType(clang_type)->getAs<TagType>(); 222 223 if (!tag_type) 224 continue; 225 226 TagDecl *candidate_tag_decl = 227 const_cast<TagDecl *>(tag_type->getDecl()); 228 229 if (TypeSystemClang::GetCompleteDecl( 230 &candidate_tag_decl->getASTContext(), candidate_tag_decl)) 231 return candidate_tag_decl; 232 } 233 } 234 } else { 235 TypeList types; 236 237 ConstString name(decl->getName()); 238 239 const ModuleList &module_list = m_target->GetImages(); 240 241 bool exact_match = false; 242 llvm::DenseSet<SymbolFile *> searched_symbol_files; 243 module_list.FindTypes(nullptr, name, exact_match, UINT32_MAX, 244 searched_symbol_files, types); 245 246 for (uint32_t ti = 0, te = types.GetSize(); ti != te; ++ti) { 247 lldb::TypeSP type = types.GetTypeAtIndex(ti); 248 249 if (!type) 250 continue; 251 252 CompilerType clang_type(type->GetFullCompilerType()); 253 254 if (!ClangUtil::IsClangType(clang_type)) 255 continue; 256 257 const TagType *tag_type = 258 ClangUtil::GetQualType(clang_type)->getAs<TagType>(); 259 260 if (!tag_type) 261 continue; 262 263 TagDecl *candidate_tag_decl = const_cast<TagDecl *>(tag_type->getDecl()); 264 265 // We have found a type by basename and we need to make sure the decl 266 // contexts are the same before we can try to complete this type with 267 // another 268 if (!TypeSystemClang::DeclsAreEquivalent(const_cast<TagDecl *>(decl), 269 candidate_tag_decl)) 270 continue; 271 272 if (TypeSystemClang::GetCompleteDecl(&candidate_tag_decl->getASTContext(), 273 candidate_tag_decl)) 274 return candidate_tag_decl; 275 } 276 } 277 return nullptr; 278 } 279 280 void ClangASTSource::CompleteType(TagDecl *tag_decl) { 281 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 282 283 if (log) { 284 LLDB_LOG(log, 285 " CompleteTagDecl on (ASTContext*){0} Completing " 286 "(TagDecl*){1} named {2}", 287 m_clang_ast_context->getDisplayName(), tag_decl, 288 tag_decl->getName()); 289 290 LLDB_LOG(log, " CTD Before:\n{0}", ClangUtil::DumpDecl(tag_decl)); 291 } 292 293 auto iter = m_active_lexical_decls.find(tag_decl); 294 if (iter != m_active_lexical_decls.end()) 295 return; 296 m_active_lexical_decls.insert(tag_decl); 297 ScopedLexicalDeclEraser eraser(m_active_lexical_decls, tag_decl); 298 299 if (!m_ast_importer_sp->CompleteTagDecl(tag_decl)) { 300 // We couldn't complete the type. Maybe there's a definition somewhere 301 // else that can be completed. 302 if (TagDecl *alternate = FindCompleteType(tag_decl)) 303 m_ast_importer_sp->CompleteTagDeclWithOrigin(tag_decl, alternate); 304 } 305 306 LLDB_LOG(log, " [CTD] After:\n{0}", ClangUtil::DumpDecl(tag_decl)); 307 } 308 309 void ClangASTSource::CompleteType(clang::ObjCInterfaceDecl *interface_decl) { 310 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 311 312 LLDB_LOG(log, 313 " [CompleteObjCInterfaceDecl] on (ASTContext*){0} '{1}' " 314 "Completing an ObjCInterfaceDecl named {1}", 315 m_ast_context, m_clang_ast_context->getDisplayName(), 316 interface_decl->getName()); 317 LLDB_LOG(log, " [COID] Before:\n{0}", 318 ClangUtil::DumpDecl(interface_decl)); 319 320 ClangASTImporter::DeclOrigin original = m_ast_importer_sp->GetDeclOrigin(interface_decl); 321 322 if (original.Valid()) { 323 if (ObjCInterfaceDecl *original_iface_decl = 324 dyn_cast<ObjCInterfaceDecl>(original.decl)) { 325 ObjCInterfaceDecl *complete_iface_decl = 326 GetCompleteObjCInterface(original_iface_decl); 327 328 if (complete_iface_decl && (complete_iface_decl != original_iface_decl)) { 329 m_ast_importer_sp->SetDeclOrigin(interface_decl, complete_iface_decl); 330 } 331 } 332 } 333 334 m_ast_importer_sp->CompleteObjCInterfaceDecl(interface_decl); 335 336 if (interface_decl->getSuperClass() && 337 interface_decl->getSuperClass() != interface_decl) 338 CompleteType(interface_decl->getSuperClass()); 339 340 LLDB_LOG(log, " [COID] After:"); 341 LLDB_LOG(log, " [COID] {0}", ClangUtil::DumpDecl(interface_decl)); 342 } 343 344 clang::ObjCInterfaceDecl *ClangASTSource::GetCompleteObjCInterface( 345 const clang::ObjCInterfaceDecl *interface_decl) { 346 lldb::ProcessSP process(m_target->GetProcessSP()); 347 348 if (!process) 349 return nullptr; 350 351 ObjCLanguageRuntime *language_runtime(ObjCLanguageRuntime::Get(*process)); 352 353 if (!language_runtime) 354 return nullptr; 355 356 ConstString class_name(interface_decl->getNameAsString().c_str()); 357 358 lldb::TypeSP complete_type_sp( 359 language_runtime->LookupInCompleteClassCache(class_name)); 360 361 if (!complete_type_sp) 362 return nullptr; 363 364 TypeFromUser complete_type = 365 TypeFromUser(complete_type_sp->GetFullCompilerType()); 366 lldb::opaque_compiler_type_t complete_opaque_type = 367 complete_type.GetOpaqueQualType(); 368 369 if (!complete_opaque_type) 370 return nullptr; 371 372 const clang::Type *complete_clang_type = 373 QualType::getFromOpaquePtr(complete_opaque_type).getTypePtr(); 374 const ObjCInterfaceType *complete_interface_type = 375 dyn_cast<ObjCInterfaceType>(complete_clang_type); 376 377 if (!complete_interface_type) 378 return nullptr; 379 380 ObjCInterfaceDecl *complete_iface_decl(complete_interface_type->getDecl()); 381 382 return complete_iface_decl; 383 } 384 385 void ClangASTSource::FindExternalLexicalDecls( 386 const DeclContext *decl_context, 387 llvm::function_ref<bool(Decl::Kind)> predicate, 388 llvm::SmallVectorImpl<Decl *> &decls) { 389 390 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 391 392 const Decl *context_decl = dyn_cast<Decl>(decl_context); 393 394 if (!context_decl) 395 return; 396 397 auto iter = m_active_lexical_decls.find(context_decl); 398 if (iter != m_active_lexical_decls.end()) 399 return; 400 m_active_lexical_decls.insert(context_decl); 401 ScopedLexicalDeclEraser eraser(m_active_lexical_decls, context_decl); 402 403 if (log) { 404 if (const NamedDecl *context_named_decl = dyn_cast<NamedDecl>(context_decl)) 405 LLDB_LOG(log, 406 "FindExternalLexicalDecls on (ASTContext*){0} '{1}' in " 407 "'{2}' (%sDecl*){3}", 408 m_ast_context, m_clang_ast_context->getDisplayName(), 409 context_named_decl->getNameAsString().c_str(), 410 context_decl->getDeclKindName(), 411 static_cast<const void *>(context_decl)); 412 else if (context_decl) 413 LLDB_LOG(log, 414 "FindExternalLexicalDecls on (ASTContext*){0} '{1}' in " 415 "({2}Decl*){3}", 416 m_ast_context, m_clang_ast_context->getDisplayName(), 417 context_decl->getDeclKindName(), 418 static_cast<const void *>(context_decl)); 419 else 420 LLDB_LOG(log, 421 "FindExternalLexicalDecls on (ASTContext*){0} '{1}' in a " 422 "NULL context", 423 m_ast_context, m_clang_ast_context->getDisplayName()); 424 } 425 426 ClangASTImporter::DeclOrigin original = m_ast_importer_sp->GetDeclOrigin(context_decl); 427 428 if (!original.Valid()) 429 return; 430 431 LLDB_LOG(log, " FELD Original decl {0} (Decl*){1:x}:\n{2}", 432 static_cast<void *>(original.ctx), 433 static_cast<void *>(original.decl), 434 ClangUtil::DumpDecl(original.decl)); 435 436 if (ObjCInterfaceDecl *original_iface_decl = 437 dyn_cast<ObjCInterfaceDecl>(original.decl)) { 438 ObjCInterfaceDecl *complete_iface_decl = 439 GetCompleteObjCInterface(original_iface_decl); 440 441 if (complete_iface_decl && (complete_iface_decl != original_iface_decl)) { 442 original.decl = complete_iface_decl; 443 original.ctx = &complete_iface_decl->getASTContext(); 444 445 m_ast_importer_sp->SetDeclOrigin(context_decl, complete_iface_decl); 446 } 447 } 448 449 if (TagDecl *original_tag_decl = dyn_cast<TagDecl>(original.decl)) { 450 ExternalASTSource *external_source = original.ctx->getExternalSource(); 451 452 if (external_source) 453 external_source->CompleteType(original_tag_decl); 454 } 455 456 const DeclContext *original_decl_context = 457 dyn_cast<DeclContext>(original.decl); 458 459 if (!original_decl_context) 460 return; 461 462 // Indicates whether we skipped any Decls of the original DeclContext. 463 bool SkippedDecls = false; 464 for (Decl *decl : original_decl_context->decls()) { 465 // The predicate function returns true if the passed declaration kind is 466 // the one we are looking for. 467 // See clang::ExternalASTSource::FindExternalLexicalDecls() 468 if (predicate(decl->getKind())) { 469 if (log) { 470 std::string ast_dump = ClangUtil::DumpDecl(decl); 471 if (const NamedDecl *context_named_decl = 472 dyn_cast<NamedDecl>(context_decl)) 473 LLDB_LOG(log, " FELD Adding [to {0}Decl {1}] lexical {2}Decl {3}", 474 context_named_decl->getDeclKindName(), 475 context_named_decl->getName(), decl->getDeclKindName(), 476 ast_dump); 477 else 478 LLDB_LOG(log, " FELD Adding lexical {0}Decl {1}", 479 decl->getDeclKindName(), ast_dump); 480 } 481 482 Decl *copied_decl = CopyDecl(decl); 483 484 if (!copied_decl) 485 continue; 486 487 // FIXME: We should add the copied decl to the 'decls' list. This would 488 // add the copied Decl into the DeclContext and make sure that we 489 // correctly propagate that we added some Decls back to Clang. 490 // By leaving 'decls' empty we incorrectly return false from 491 // DeclContext::LoadLexicalDeclsFromExternalStorage which might cause 492 // lookup issues later on. 493 // We can't just add them for now as the ASTImporter already added the 494 // decl into the DeclContext and this would add it twice. 495 496 if (FieldDecl *copied_field = dyn_cast<FieldDecl>(copied_decl)) { 497 QualType copied_field_type = copied_field->getType(); 498 499 m_ast_importer_sp->RequireCompleteType(copied_field_type); 500 } 501 } else { 502 SkippedDecls = true; 503 } 504 } 505 506 // CopyDecl may build a lookup table which may set up ExternalLexicalStorage 507 // to false. However, since we skipped some of the external Decls we must 508 // set it back! 509 if (SkippedDecls) { 510 decl_context->setHasExternalLexicalStorage(true); 511 // This sets HasLazyExternalLexicalLookups to true. By setting this bit we 512 // ensure that the lookup table is rebuilt, which means the external source 513 // is consulted again when a clang::DeclContext::lookup is called. 514 const_cast<DeclContext *>(decl_context)->setMustBuildLookupTable(); 515 } 516 517 return; 518 } 519 520 void ClangASTSource::FindExternalVisibleDecls(NameSearchContext &context) { 521 assert(m_ast_context); 522 523 const ConstString name(context.m_decl_name.getAsString().c_str()); 524 525 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 526 527 if (log) { 528 if (!context.m_decl_context) 529 LLDB_LOG(log, 530 "ClangASTSource::FindExternalVisibleDecls on " 531 "(ASTContext*){0} '{1}' for '{2}' in a NULL DeclContext", 532 m_ast_context, m_clang_ast_context->getDisplayName(), name); 533 else if (const NamedDecl *context_named_decl = 534 dyn_cast<NamedDecl>(context.m_decl_context)) 535 LLDB_LOG(log, 536 "ClangASTSource::FindExternalVisibleDecls on " 537 "(ASTContext*){0} '{1}' for '{2}' in '{3}'", 538 m_ast_context, m_clang_ast_context->getDisplayName(), name, 539 context_named_decl->getName()); 540 else 541 LLDB_LOG(log, 542 "ClangASTSource::FindExternalVisibleDecls on " 543 "(ASTContext*){0} '{1}' for '{2}' in a '{3}'", 544 m_ast_context, m_clang_ast_context->getDisplayName(), name, 545 context.m_decl_context->getDeclKindName()); 546 } 547 548 if (isa<NamespaceDecl>(context.m_decl_context)) { 549 LookupInNamespace(context); 550 } else if (isa<ObjCInterfaceDecl>(context.m_decl_context)) { 551 FindObjCPropertyAndIvarDecls(context); 552 } else if (!isa<TranslationUnitDecl>(context.m_decl_context)) { 553 // we shouldn't be getting FindExternalVisibleDecls calls for these 554 return; 555 } else { 556 CompilerDeclContext namespace_decl; 557 558 LLDB_LOG(log, " CAS::FEVD Searching the root namespace"); 559 560 FindExternalVisibleDecls(context, lldb::ModuleSP(), namespace_decl); 561 } 562 563 if (!context.m_namespace_map->empty()) { 564 if (log && log->GetVerbose()) 565 LLDB_LOG(log, " CAS::FEVD Registering namespace map {0} ({1} entries)", 566 context.m_namespace_map.get(), context.m_namespace_map->size()); 567 568 NamespaceDecl *clang_namespace_decl = 569 AddNamespace(context, context.m_namespace_map); 570 571 if (clang_namespace_decl) 572 clang_namespace_decl->setHasExternalVisibleStorage(); 573 } 574 } 575 576 clang::Sema *ClangASTSource::getSema() { 577 return m_clang_ast_context->getSema(); 578 } 579 580 bool ClangASTSource::IgnoreName(const ConstString name, 581 bool ignore_all_dollar_names) { 582 static const ConstString id_name("id"); 583 static const ConstString Class_name("Class"); 584 585 if (m_ast_context->getLangOpts().ObjC) 586 if (name == id_name || name == Class_name) 587 return true; 588 589 StringRef name_string_ref = name.GetStringRef(); 590 591 // The ClangASTSource is not responsible for finding $-names. 592 return name_string_ref.empty() || 593 (ignore_all_dollar_names && name_string_ref.startswith("$")) || 594 name_string_ref.startswith("_$"); 595 } 596 597 void ClangASTSource::FindExternalVisibleDecls( 598 NameSearchContext &context, lldb::ModuleSP module_sp, 599 CompilerDeclContext &namespace_decl) { 600 assert(m_ast_context); 601 602 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 603 604 SymbolContextList sc_list; 605 606 const ConstString name(context.m_decl_name.getAsString().c_str()); 607 if (IgnoreName(name, true)) 608 return; 609 610 if (!m_target) 611 return; 612 613 FillNamespaceMap(context, module_sp, namespace_decl); 614 615 if (context.m_found_type) 616 return; 617 618 TypeList types; 619 const bool exact_match = true; 620 llvm::DenseSet<lldb_private::SymbolFile *> searched_symbol_files; 621 if (module_sp && namespace_decl) 622 module_sp->FindTypesInNamespace(name, namespace_decl, 1, types); 623 else { 624 m_target->GetImages().FindTypes(module_sp.get(), name, exact_match, 1, 625 searched_symbol_files, types); 626 } 627 628 if (size_t num_types = types.GetSize()) { 629 for (size_t ti = 0; ti < num_types; ++ti) { 630 lldb::TypeSP type_sp = types.GetTypeAtIndex(ti); 631 632 if (log) { 633 const char *name_string = type_sp->GetName().GetCString(); 634 635 LLDB_LOG(log, " CAS::FEVD Matching type found for \"{0}\": {1}", name, 636 (name_string ? name_string : "<anonymous>")); 637 } 638 639 CompilerType full_type = type_sp->GetFullCompilerType(); 640 641 CompilerType copied_clang_type(GuardedCopyType(full_type)); 642 643 if (!copied_clang_type) { 644 LLDB_LOG(log, " CAS::FEVD - Couldn't export a type"); 645 646 continue; 647 } 648 649 context.AddTypeDecl(copied_clang_type); 650 651 context.m_found_type = true; 652 break; 653 } 654 } 655 656 if (!context.m_found_type) { 657 // Try the modules next. 658 FindDeclInModules(context, name); 659 } 660 661 if (!context.m_found_type) { 662 FindDeclInObjCRuntime(context, name); 663 } 664 } 665 666 void ClangASTSource::FillNamespaceMap( 667 NameSearchContext &context, lldb::ModuleSP module_sp, 668 const CompilerDeclContext &namespace_decl) { 669 const ConstString name(context.m_decl_name.getAsString().c_str()); 670 if (IgnoreName(name, true)) 671 return; 672 673 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 674 675 if (module_sp && namespace_decl) { 676 CompilerDeclContext found_namespace_decl; 677 678 if (SymbolFile *symbol_file = module_sp->GetSymbolFile()) { 679 found_namespace_decl = symbol_file->FindNamespace(name, namespace_decl); 680 681 if (found_namespace_decl) { 682 context.m_namespace_map->push_back( 683 std::pair<lldb::ModuleSP, CompilerDeclContext>( 684 module_sp, found_namespace_decl)); 685 686 LLDB_LOG(log, " CAS::FEVD Found namespace {0} in module {1}", name, 687 module_sp->GetFileSpec().GetFilename()); 688 } 689 } 690 return; 691 } 692 693 const ModuleList &target_images = m_target->GetImages(); 694 std::lock_guard<std::recursive_mutex> guard(target_images.GetMutex()); 695 696 for (size_t i = 0, e = target_images.GetSize(); i < e; ++i) { 697 lldb::ModuleSP image = target_images.GetModuleAtIndexUnlocked(i); 698 699 if (!image) 700 continue; 701 702 CompilerDeclContext found_namespace_decl; 703 704 SymbolFile *symbol_file = image->GetSymbolFile(); 705 706 if (!symbol_file) 707 continue; 708 709 found_namespace_decl = symbol_file->FindNamespace(name, namespace_decl); 710 711 if (found_namespace_decl) { 712 context.m_namespace_map->push_back( 713 std::pair<lldb::ModuleSP, CompilerDeclContext>(image, 714 found_namespace_decl)); 715 716 LLDB_LOG(log, " CAS::FEVD Found namespace {0} in module {1}", name, 717 image->GetFileSpec().GetFilename()); 718 } 719 } 720 } 721 722 template <class D> class TaggedASTDecl { 723 public: 724 TaggedASTDecl() : decl(nullptr) {} 725 TaggedASTDecl(D *_decl) : decl(_decl) {} 726 bool IsValid() const { return (decl != nullptr); } 727 bool IsInvalid() const { return !IsValid(); } 728 D *operator->() const { return decl; } 729 D *decl; 730 }; 731 732 template <class D2, template <class D> class TD, class D1> 733 TD<D2> DynCast(TD<D1> source) { 734 return TD<D2>(dyn_cast<D2>(source.decl)); 735 } 736 737 template <class D = Decl> class DeclFromParser; 738 template <class D = Decl> class DeclFromUser; 739 740 template <class D> class DeclFromParser : public TaggedASTDecl<D> { 741 public: 742 DeclFromParser() : TaggedASTDecl<D>() {} 743 DeclFromParser(D *_decl) : TaggedASTDecl<D>(_decl) {} 744 745 DeclFromUser<D> GetOrigin(ClangASTSource &source); 746 }; 747 748 template <class D> class DeclFromUser : public TaggedASTDecl<D> { 749 public: 750 DeclFromUser() : TaggedASTDecl<D>() {} 751 DeclFromUser(D *_decl) : TaggedASTDecl<D>(_decl) {} 752 753 DeclFromParser<D> Import(ClangASTSource &source); 754 }; 755 756 template <class D> 757 DeclFromUser<D> DeclFromParser<D>::GetOrigin(ClangASTSource &source) { 758 ClangASTImporter::DeclOrigin origin = source.GetDeclOrigin(this->decl); 759 if (!origin.Valid()) 760 return DeclFromUser<D>(); 761 return DeclFromUser<D>(dyn_cast<D>(origin.decl)); 762 } 763 764 template <class D> 765 DeclFromParser<D> DeclFromUser<D>::Import(ClangASTSource &source) { 766 DeclFromParser<> parser_generic_decl(source.CopyDecl(this->decl)); 767 if (parser_generic_decl.IsInvalid()) 768 return DeclFromParser<D>(); 769 return DeclFromParser<D>(dyn_cast<D>(parser_generic_decl.decl)); 770 } 771 772 bool ClangASTSource::FindObjCMethodDeclsWithOrigin( 773 NameSearchContext &context, ObjCInterfaceDecl *original_interface_decl, 774 const char *log_info) { 775 const DeclarationName &decl_name(context.m_decl_name); 776 clang::ASTContext *original_ctx = &original_interface_decl->getASTContext(); 777 778 Selector original_selector; 779 780 if (decl_name.isObjCZeroArgSelector()) { 781 IdentifierInfo *ident = &original_ctx->Idents.get(decl_name.getAsString()); 782 original_selector = original_ctx->Selectors.getSelector(0, &ident); 783 } else if (decl_name.isObjCOneArgSelector()) { 784 const std::string &decl_name_string = decl_name.getAsString(); 785 std::string decl_name_string_without_colon(decl_name_string.c_str(), 786 decl_name_string.length() - 1); 787 IdentifierInfo *ident = 788 &original_ctx->Idents.get(decl_name_string_without_colon); 789 original_selector = original_ctx->Selectors.getSelector(1, &ident); 790 } else { 791 SmallVector<IdentifierInfo *, 4> idents; 792 793 clang::Selector sel = decl_name.getObjCSelector(); 794 795 unsigned num_args = sel.getNumArgs(); 796 797 for (unsigned i = 0; i != num_args; ++i) { 798 idents.push_back(&original_ctx->Idents.get(sel.getNameForSlot(i))); 799 } 800 801 original_selector = 802 original_ctx->Selectors.getSelector(num_args, idents.data()); 803 } 804 805 DeclarationName original_decl_name(original_selector); 806 807 llvm::SmallVector<NamedDecl *, 1> methods; 808 809 TypeSystemClang::GetCompleteDecl(original_ctx, original_interface_decl); 810 811 if (ObjCMethodDecl *instance_method_decl = 812 original_interface_decl->lookupInstanceMethod(original_selector)) { 813 methods.push_back(instance_method_decl); 814 } else if (ObjCMethodDecl *class_method_decl = 815 original_interface_decl->lookupClassMethod( 816 original_selector)) { 817 methods.push_back(class_method_decl); 818 } 819 820 if (methods.empty()) { 821 return false; 822 } 823 824 for (NamedDecl *named_decl : methods) { 825 if (!named_decl) 826 continue; 827 828 ObjCMethodDecl *result_method = dyn_cast<ObjCMethodDecl>(named_decl); 829 830 if (!result_method) 831 continue; 832 833 Decl *copied_decl = CopyDecl(result_method); 834 835 if (!copied_decl) 836 continue; 837 838 ObjCMethodDecl *copied_method_decl = dyn_cast<ObjCMethodDecl>(copied_decl); 839 840 if (!copied_method_decl) 841 continue; 842 843 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 844 845 LLDB_LOG(log, " CAS::FOMD found ({0}) {1}", log_info, 846 ClangUtil::DumpDecl(copied_method_decl)); 847 848 context.AddNamedDecl(copied_method_decl); 849 } 850 851 return true; 852 } 853 854 void ClangASTSource::FindDeclInModules(NameSearchContext &context, 855 ConstString name) { 856 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 857 858 ClangModulesDeclVendor *modules_decl_vendor = 859 m_target->GetClangModulesDeclVendor(); 860 if (!modules_decl_vendor) 861 return; 862 863 bool append = false; 864 uint32_t max_matches = 1; 865 std::vector<clang::NamedDecl *> decls; 866 867 if (!modules_decl_vendor->FindDecls(name, append, max_matches, decls)) 868 return; 869 870 LLDB_LOG(log, " CAS::FEVD Matching entity found for \"{0}\" in the modules", 871 name); 872 873 clang::NamedDecl *const decl_from_modules = decls[0]; 874 875 if (llvm::isa<clang::TypeDecl>(decl_from_modules) || 876 llvm::isa<clang::ObjCContainerDecl>(decl_from_modules) || 877 llvm::isa<clang::EnumConstantDecl>(decl_from_modules)) { 878 clang::Decl *copied_decl = CopyDecl(decl_from_modules); 879 clang::NamedDecl *copied_named_decl = 880 copied_decl ? dyn_cast<clang::NamedDecl>(copied_decl) : nullptr; 881 882 if (!copied_named_decl) { 883 LLDB_LOG(log, " CAS::FEVD - Couldn't export a type from the modules"); 884 885 return; 886 } 887 888 context.AddNamedDecl(copied_named_decl); 889 890 context.m_found_type = true; 891 } 892 } 893 894 void ClangASTSource::FindDeclInObjCRuntime(NameSearchContext &context, 895 ConstString name) { 896 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 897 898 lldb::ProcessSP process(m_target->GetProcessSP()); 899 900 if (!process) 901 return; 902 903 ObjCLanguageRuntime *language_runtime(ObjCLanguageRuntime::Get(*process)); 904 905 if (!language_runtime) 906 return; 907 908 DeclVendor *decl_vendor = language_runtime->GetDeclVendor(); 909 910 if (!decl_vendor) 911 return; 912 913 bool append = false; 914 uint32_t max_matches = 1; 915 std::vector<clang::NamedDecl *> decls; 916 917 auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor); 918 if (!clang_decl_vendor->FindDecls(name, append, max_matches, decls)) 919 return; 920 921 LLDB_LOG(log, " CAS::FEVD Matching type found for \"{0}\" in the runtime", 922 name); 923 924 clang::Decl *copied_decl = CopyDecl(decls[0]); 925 clang::NamedDecl *copied_named_decl = 926 copied_decl ? dyn_cast<clang::NamedDecl>(copied_decl) : nullptr; 927 928 if (!copied_named_decl) { 929 LLDB_LOG(log, " CAS::FEVD - Couldn't export a type from the runtime"); 930 931 return; 932 } 933 934 context.AddNamedDecl(copied_named_decl); 935 } 936 937 void ClangASTSource::FindObjCMethodDecls(NameSearchContext &context) { 938 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 939 940 const DeclarationName &decl_name(context.m_decl_name); 941 const DeclContext *decl_ctx(context.m_decl_context); 942 943 const ObjCInterfaceDecl *interface_decl = 944 dyn_cast<ObjCInterfaceDecl>(decl_ctx); 945 946 if (!interface_decl) 947 return; 948 949 do { 950 ClangASTImporter::DeclOrigin original = m_ast_importer_sp->GetDeclOrigin(interface_decl); 951 952 if (!original.Valid()) 953 break; 954 955 ObjCInterfaceDecl *original_interface_decl = 956 dyn_cast<ObjCInterfaceDecl>(original.decl); 957 958 if (FindObjCMethodDeclsWithOrigin(context, original_interface_decl, 959 "at origin")) 960 return; // found it, no need to look any further 961 } while (false); 962 963 StreamString ss; 964 965 if (decl_name.isObjCZeroArgSelector()) { 966 ss.Printf("%s", decl_name.getAsString().c_str()); 967 } else if (decl_name.isObjCOneArgSelector()) { 968 ss.Printf("%s", decl_name.getAsString().c_str()); 969 } else { 970 clang::Selector sel = decl_name.getObjCSelector(); 971 972 for (unsigned i = 0, e = sel.getNumArgs(); i != e; ++i) { 973 llvm::StringRef r = sel.getNameForSlot(i); 974 ss.Printf("%s:", r.str().c_str()); 975 } 976 } 977 ss.Flush(); 978 979 if (ss.GetString().contains("$__lldb")) 980 return; // we don't need any results 981 982 ConstString selector_name(ss.GetString()); 983 984 LLDB_LOG(log, 985 "ClangASTSource::FindObjCMethodDecls on (ASTContext*){0} '{1}' " 986 "for selector [{2} {3}]", 987 m_ast_context, m_clang_ast_context->getDisplayName(), 988 interface_decl->getName(), selector_name); 989 SymbolContextList sc_list; 990 991 const bool include_symbols = false; 992 const bool include_inlines = false; 993 994 std::string interface_name = interface_decl->getNameAsString(); 995 996 do { 997 StreamString ms; 998 ms.Printf("-[%s %s]", interface_name.c_str(), selector_name.AsCString()); 999 ms.Flush(); 1000 ConstString instance_method_name(ms.GetString()); 1001 1002 sc_list.Clear(); 1003 m_target->GetImages().FindFunctions( 1004 instance_method_name, lldb::eFunctionNameTypeFull, include_symbols, 1005 include_inlines, sc_list); 1006 1007 if (sc_list.GetSize()) 1008 break; 1009 1010 ms.Clear(); 1011 ms.Printf("+[%s %s]", interface_name.c_str(), selector_name.AsCString()); 1012 ms.Flush(); 1013 ConstString class_method_name(ms.GetString()); 1014 1015 sc_list.Clear(); 1016 m_target->GetImages().FindFunctions( 1017 class_method_name, lldb::eFunctionNameTypeFull, include_symbols, 1018 include_inlines, sc_list); 1019 1020 if (sc_list.GetSize()) 1021 break; 1022 1023 // Fall back and check for methods in categories. If we find methods this 1024 // way, we need to check that they're actually in categories on the desired 1025 // class. 1026 1027 SymbolContextList candidate_sc_list; 1028 1029 m_target->GetImages().FindFunctions( 1030 selector_name, lldb::eFunctionNameTypeSelector, include_symbols, 1031 include_inlines, candidate_sc_list); 1032 1033 for (uint32_t ci = 0, ce = candidate_sc_list.GetSize(); ci != ce; ++ci) { 1034 SymbolContext candidate_sc; 1035 1036 if (!candidate_sc_list.GetContextAtIndex(ci, candidate_sc)) 1037 continue; 1038 1039 if (!candidate_sc.function) 1040 continue; 1041 1042 const char *candidate_name = candidate_sc.function->GetName().AsCString(); 1043 1044 const char *cursor = candidate_name; 1045 1046 if (*cursor != '+' && *cursor != '-') 1047 continue; 1048 1049 ++cursor; 1050 1051 if (*cursor != '[') 1052 continue; 1053 1054 ++cursor; 1055 1056 size_t interface_len = interface_name.length(); 1057 1058 if (strncmp(cursor, interface_name.c_str(), interface_len)) 1059 continue; 1060 1061 cursor += interface_len; 1062 1063 if (*cursor == ' ' || *cursor == '(') 1064 sc_list.Append(candidate_sc); 1065 } 1066 } while (false); 1067 1068 if (sc_list.GetSize()) { 1069 // We found a good function symbol. Use that. 1070 1071 for (uint32_t i = 0, e = sc_list.GetSize(); i != e; ++i) { 1072 SymbolContext sc; 1073 1074 if (!sc_list.GetContextAtIndex(i, sc)) 1075 continue; 1076 1077 if (!sc.function) 1078 continue; 1079 1080 CompilerDeclContext function_decl_ctx = sc.function->GetDeclContext(); 1081 if (!function_decl_ctx) 1082 continue; 1083 1084 ObjCMethodDecl *method_decl = 1085 TypeSystemClang::DeclContextGetAsObjCMethodDecl(function_decl_ctx); 1086 1087 if (!method_decl) 1088 continue; 1089 1090 ObjCInterfaceDecl *found_interface_decl = 1091 method_decl->getClassInterface(); 1092 1093 if (!found_interface_decl) 1094 continue; 1095 1096 if (found_interface_decl->getName() == interface_decl->getName()) { 1097 Decl *copied_decl = CopyDecl(method_decl); 1098 1099 if (!copied_decl) 1100 continue; 1101 1102 ObjCMethodDecl *copied_method_decl = 1103 dyn_cast<ObjCMethodDecl>(copied_decl); 1104 1105 if (!copied_method_decl) 1106 continue; 1107 1108 LLDB_LOG(log, " CAS::FOMD found (in symbols)\n{0}", 1109 ClangUtil::DumpDecl(copied_method_decl)); 1110 1111 context.AddNamedDecl(copied_method_decl); 1112 } 1113 } 1114 1115 return; 1116 } 1117 1118 // Try the debug information. 1119 1120 do { 1121 ObjCInterfaceDecl *complete_interface_decl = GetCompleteObjCInterface( 1122 const_cast<ObjCInterfaceDecl *>(interface_decl)); 1123 1124 if (!complete_interface_decl) 1125 break; 1126 1127 // We found the complete interface. The runtime never needs to be queried 1128 // in this scenario. 1129 1130 DeclFromUser<const ObjCInterfaceDecl> complete_iface_decl( 1131 complete_interface_decl); 1132 1133 if (complete_interface_decl == interface_decl) 1134 break; // already checked this one 1135 1136 LLDB_LOG(log, 1137 "CAS::FOPD trying origin " 1138 "(ObjCInterfaceDecl*){0}/(ASTContext*){1}...", 1139 complete_interface_decl, &complete_iface_decl->getASTContext()); 1140 1141 FindObjCMethodDeclsWithOrigin(context, complete_interface_decl, 1142 "in debug info"); 1143 1144 return; 1145 } while (false); 1146 1147 do { 1148 // Check the modules only if the debug information didn't have a complete 1149 // interface. 1150 1151 if (ClangModulesDeclVendor *modules_decl_vendor = 1152 m_target->GetClangModulesDeclVendor()) { 1153 ConstString interface_name(interface_decl->getNameAsString().c_str()); 1154 bool append = false; 1155 uint32_t max_matches = 1; 1156 std::vector<clang::NamedDecl *> decls; 1157 1158 if (!modules_decl_vendor->FindDecls(interface_name, append, max_matches, 1159 decls)) 1160 break; 1161 1162 ObjCInterfaceDecl *interface_decl_from_modules = 1163 dyn_cast<ObjCInterfaceDecl>(decls[0]); 1164 1165 if (!interface_decl_from_modules) 1166 break; 1167 1168 if (FindObjCMethodDeclsWithOrigin(context, interface_decl_from_modules, 1169 "in modules")) 1170 return; 1171 } 1172 } while (false); 1173 1174 do { 1175 // Check the runtime only if the debug information didn't have a complete 1176 // interface and the modules don't get us anywhere. 1177 1178 lldb::ProcessSP process(m_target->GetProcessSP()); 1179 1180 if (!process) 1181 break; 1182 1183 ObjCLanguageRuntime *language_runtime(ObjCLanguageRuntime::Get(*process)); 1184 1185 if (!language_runtime) 1186 break; 1187 1188 DeclVendor *decl_vendor = language_runtime->GetDeclVendor(); 1189 1190 if (!decl_vendor) 1191 break; 1192 1193 ConstString interface_name(interface_decl->getNameAsString().c_str()); 1194 bool append = false; 1195 uint32_t max_matches = 1; 1196 std::vector<clang::NamedDecl *> decls; 1197 1198 auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor); 1199 if (!clang_decl_vendor->FindDecls(interface_name, append, max_matches, 1200 decls)) 1201 break; 1202 1203 ObjCInterfaceDecl *runtime_interface_decl = 1204 dyn_cast<ObjCInterfaceDecl>(decls[0]); 1205 1206 if (!runtime_interface_decl) 1207 break; 1208 1209 FindObjCMethodDeclsWithOrigin(context, runtime_interface_decl, 1210 "in runtime"); 1211 } while (false); 1212 } 1213 1214 static bool FindObjCPropertyAndIvarDeclsWithOrigin( 1215 NameSearchContext &context, ClangASTSource &source, 1216 DeclFromUser<const ObjCInterfaceDecl> &origin_iface_decl) { 1217 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1218 1219 if (origin_iface_decl.IsInvalid()) 1220 return false; 1221 1222 std::string name_str = context.m_decl_name.getAsString(); 1223 StringRef name(name_str); 1224 IdentifierInfo &name_identifier( 1225 origin_iface_decl->getASTContext().Idents.get(name)); 1226 1227 DeclFromUser<ObjCPropertyDecl> origin_property_decl( 1228 origin_iface_decl->FindPropertyDeclaration( 1229 &name_identifier, ObjCPropertyQueryKind::OBJC_PR_query_instance)); 1230 1231 bool found = false; 1232 1233 if (origin_property_decl.IsValid()) { 1234 DeclFromParser<ObjCPropertyDecl> parser_property_decl( 1235 origin_property_decl.Import(source)); 1236 if (parser_property_decl.IsValid()) { 1237 LLDB_LOG(log, " CAS::FOPD found\n{0}", 1238 ClangUtil::DumpDecl(parser_property_decl.decl)); 1239 1240 context.AddNamedDecl(parser_property_decl.decl); 1241 found = true; 1242 } 1243 } 1244 1245 DeclFromUser<ObjCIvarDecl> origin_ivar_decl( 1246 origin_iface_decl->getIvarDecl(&name_identifier)); 1247 1248 if (origin_ivar_decl.IsValid()) { 1249 DeclFromParser<ObjCIvarDecl> parser_ivar_decl( 1250 origin_ivar_decl.Import(source)); 1251 if (parser_ivar_decl.IsValid()) { 1252 LLDB_LOG(log, " CAS::FOPD found\n{0}", 1253 ClangUtil::DumpDecl(parser_ivar_decl.decl)); 1254 1255 context.AddNamedDecl(parser_ivar_decl.decl); 1256 found = true; 1257 } 1258 } 1259 1260 return found; 1261 } 1262 1263 void ClangASTSource::FindObjCPropertyAndIvarDecls(NameSearchContext &context) { 1264 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1265 1266 DeclFromParser<const ObjCInterfaceDecl> parser_iface_decl( 1267 cast<ObjCInterfaceDecl>(context.m_decl_context)); 1268 DeclFromUser<const ObjCInterfaceDecl> origin_iface_decl( 1269 parser_iface_decl.GetOrigin(*this)); 1270 1271 ConstString class_name(parser_iface_decl->getNameAsString().c_str()); 1272 1273 LLDB_LOG(log, 1274 "ClangASTSource::FindObjCPropertyAndIvarDecls on " 1275 "(ASTContext*){0} '{1}' for '{2}.{3}'", 1276 m_ast_context, m_clang_ast_context->getDisplayName(), 1277 parser_iface_decl->getName(), context.m_decl_name.getAsString()); 1278 1279 if (FindObjCPropertyAndIvarDeclsWithOrigin(context, *this, origin_iface_decl)) 1280 return; 1281 1282 LLDB_LOG(log, 1283 "CAS::FOPD couldn't find the property on origin " 1284 "(ObjCInterfaceDecl*){0}/(ASTContext*){1}, searching " 1285 "elsewhere...", 1286 origin_iface_decl.decl, &origin_iface_decl->getASTContext()); 1287 1288 SymbolContext null_sc; 1289 TypeList type_list; 1290 1291 do { 1292 ObjCInterfaceDecl *complete_interface_decl = GetCompleteObjCInterface( 1293 const_cast<ObjCInterfaceDecl *>(parser_iface_decl.decl)); 1294 1295 if (!complete_interface_decl) 1296 break; 1297 1298 // We found the complete interface. The runtime never needs to be queried 1299 // in this scenario. 1300 1301 DeclFromUser<const ObjCInterfaceDecl> complete_iface_decl( 1302 complete_interface_decl); 1303 1304 if (complete_iface_decl.decl == origin_iface_decl.decl) 1305 break; // already checked this one 1306 1307 LLDB_LOG(log, 1308 "CAS::FOPD trying origin " 1309 "(ObjCInterfaceDecl*){0}/(ASTContext*){1}...", 1310 complete_iface_decl.decl, &complete_iface_decl->getASTContext()); 1311 1312 FindObjCPropertyAndIvarDeclsWithOrigin(context, *this, complete_iface_decl); 1313 1314 return; 1315 } while (false); 1316 1317 do { 1318 // Check the modules only if the debug information didn't have a complete 1319 // interface. 1320 1321 ClangModulesDeclVendor *modules_decl_vendor = 1322 m_target->GetClangModulesDeclVendor(); 1323 1324 if (!modules_decl_vendor) 1325 break; 1326 1327 bool append = false; 1328 uint32_t max_matches = 1; 1329 std::vector<clang::NamedDecl *> decls; 1330 1331 if (!modules_decl_vendor->FindDecls(class_name, append, max_matches, decls)) 1332 break; 1333 1334 DeclFromUser<const ObjCInterfaceDecl> interface_decl_from_modules( 1335 dyn_cast<ObjCInterfaceDecl>(decls[0])); 1336 1337 if (!interface_decl_from_modules.IsValid()) 1338 break; 1339 1340 LLDB_LOG(log, 1341 "CAS::FOPD[{0}] trying module " 1342 "(ObjCInterfaceDecl*){0}/(ASTContext*){1}...", 1343 interface_decl_from_modules.decl, 1344 &interface_decl_from_modules->getASTContext()); 1345 1346 if (FindObjCPropertyAndIvarDeclsWithOrigin(context, *this, 1347 interface_decl_from_modules)) 1348 return; 1349 } while (false); 1350 1351 do { 1352 // Check the runtime only if the debug information didn't have a complete 1353 // interface and nothing was in the modules. 1354 1355 lldb::ProcessSP process(m_target->GetProcessSP()); 1356 1357 if (!process) 1358 return; 1359 1360 ObjCLanguageRuntime *language_runtime(ObjCLanguageRuntime::Get(*process)); 1361 1362 if (!language_runtime) 1363 return; 1364 1365 DeclVendor *decl_vendor = language_runtime->GetDeclVendor(); 1366 1367 if (!decl_vendor) 1368 break; 1369 1370 bool append = false; 1371 uint32_t max_matches = 1; 1372 std::vector<clang::NamedDecl *> decls; 1373 1374 auto *clang_decl_vendor = llvm::cast<ClangDeclVendor>(decl_vendor); 1375 if (!clang_decl_vendor->FindDecls(class_name, append, max_matches, decls)) 1376 break; 1377 1378 DeclFromUser<const ObjCInterfaceDecl> interface_decl_from_runtime( 1379 dyn_cast<ObjCInterfaceDecl>(decls[0])); 1380 1381 if (!interface_decl_from_runtime.IsValid()) 1382 break; 1383 1384 LLDB_LOG(log, 1385 "CAS::FOPD[{0}] trying runtime " 1386 "(ObjCInterfaceDecl*){0}/(ASTContext*){1}...", 1387 interface_decl_from_runtime.decl, 1388 &interface_decl_from_runtime->getASTContext()); 1389 1390 if (FindObjCPropertyAndIvarDeclsWithOrigin(context, *this, 1391 interface_decl_from_runtime)) 1392 return; 1393 } while (false); 1394 } 1395 1396 void ClangASTSource::LookupInNamespace(NameSearchContext &context) { 1397 const NamespaceDecl *namespace_context = 1398 dyn_cast<NamespaceDecl>(context.m_decl_context); 1399 1400 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1401 1402 ClangASTImporter::NamespaceMapSP namespace_map = 1403 m_ast_importer_sp->GetNamespaceMap(namespace_context); 1404 1405 LLDB_LOGV(log, " CAS::FEVD Inspecting namespace map {0} ({1} entries)", 1406 namespace_map.get(), namespace_map->size()); 1407 1408 if (!namespace_map) 1409 return; 1410 1411 for (ClangASTImporter::NamespaceMap::iterator i = namespace_map->begin(), 1412 e = namespace_map->end(); 1413 i != e; ++i) { 1414 LLDB_LOG(log, " CAS::FEVD Searching namespace {0} in module {1}", 1415 i->second.GetName(), i->first->GetFileSpec().GetFilename()); 1416 1417 FindExternalVisibleDecls(context, i->first, i->second); 1418 } 1419 } 1420 1421 typedef llvm::DenseMap<const FieldDecl *, uint64_t> FieldOffsetMap; 1422 typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetMap; 1423 1424 template <class D, class O> 1425 static bool ImportOffsetMap(llvm::DenseMap<const D *, O> &destination_map, 1426 llvm::DenseMap<const D *, O> &source_map, 1427 ClangASTSource &source) { 1428 // When importing fields into a new record, clang has a hard requirement that 1429 // fields be imported in field offset order. Since they are stored in a 1430 // DenseMap with a pointer as the key type, this means we cannot simply 1431 // iterate over the map, as the order will be non-deterministic. Instead we 1432 // have to sort by the offset and then insert in sorted order. 1433 typedef llvm::DenseMap<const D *, O> MapType; 1434 typedef typename MapType::value_type PairType; 1435 std::vector<PairType> sorted_items; 1436 sorted_items.reserve(source_map.size()); 1437 sorted_items.assign(source_map.begin(), source_map.end()); 1438 llvm::sort(sorted_items.begin(), sorted_items.end(), 1439 [](const PairType &lhs, const PairType &rhs) { 1440 return lhs.second < rhs.second; 1441 }); 1442 1443 for (const auto &item : sorted_items) { 1444 DeclFromUser<D> user_decl(const_cast<D *>(item.first)); 1445 DeclFromParser<D> parser_decl(user_decl.Import(source)); 1446 if (parser_decl.IsInvalid()) 1447 return false; 1448 destination_map.insert( 1449 std::pair<const D *, O>(parser_decl.decl, item.second)); 1450 } 1451 1452 return true; 1453 } 1454 1455 template <bool IsVirtual> 1456 bool ExtractBaseOffsets(const ASTRecordLayout &record_layout, 1457 DeclFromUser<const CXXRecordDecl> &record, 1458 BaseOffsetMap &base_offsets) { 1459 for (CXXRecordDecl::base_class_const_iterator 1460 bi = (IsVirtual ? record->vbases_begin() : record->bases_begin()), 1461 be = (IsVirtual ? record->vbases_end() : record->bases_end()); 1462 bi != be; ++bi) { 1463 if (!IsVirtual && bi->isVirtual()) 1464 continue; 1465 1466 const clang::Type *origin_base_type = bi->getType().getTypePtr(); 1467 const clang::RecordType *origin_base_record_type = 1468 origin_base_type->getAs<RecordType>(); 1469 1470 if (!origin_base_record_type) 1471 return false; 1472 1473 DeclFromUser<RecordDecl> origin_base_record( 1474 origin_base_record_type->getDecl()); 1475 1476 if (origin_base_record.IsInvalid()) 1477 return false; 1478 1479 DeclFromUser<CXXRecordDecl> origin_base_cxx_record( 1480 DynCast<CXXRecordDecl>(origin_base_record)); 1481 1482 if (origin_base_cxx_record.IsInvalid()) 1483 return false; 1484 1485 CharUnits base_offset; 1486 1487 if (IsVirtual) 1488 base_offset = 1489 record_layout.getVBaseClassOffset(origin_base_cxx_record.decl); 1490 else 1491 base_offset = 1492 record_layout.getBaseClassOffset(origin_base_cxx_record.decl); 1493 1494 base_offsets.insert(std::pair<const CXXRecordDecl *, CharUnits>( 1495 origin_base_cxx_record.decl, base_offset)); 1496 } 1497 1498 return true; 1499 } 1500 1501 bool ClangASTSource::layoutRecordType(const RecordDecl *record, uint64_t &size, 1502 uint64_t &alignment, 1503 FieldOffsetMap &field_offsets, 1504 BaseOffsetMap &base_offsets, 1505 BaseOffsetMap &virtual_base_offsets) { 1506 1507 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1508 1509 LLDB_LOG(log, 1510 "LayoutRecordType on (ASTContext*){0} '{1}' for (RecordDecl*)" 1511 "{3} [name = '{4}']", 1512 m_ast_context, m_clang_ast_context->getDisplayName(), record, 1513 record->getName()); 1514 1515 DeclFromParser<const RecordDecl> parser_record(record); 1516 DeclFromUser<const RecordDecl> origin_record( 1517 parser_record.GetOrigin(*this)); 1518 1519 if (origin_record.IsInvalid()) 1520 return false; 1521 1522 FieldOffsetMap origin_field_offsets; 1523 BaseOffsetMap origin_base_offsets; 1524 BaseOffsetMap origin_virtual_base_offsets; 1525 1526 TypeSystemClang::GetCompleteDecl( 1527 &origin_record->getASTContext(), 1528 const_cast<RecordDecl *>(origin_record.decl)); 1529 1530 clang::RecordDecl *definition = origin_record.decl->getDefinition(); 1531 if (!definition || !definition->isCompleteDefinition()) 1532 return false; 1533 1534 const ASTRecordLayout &record_layout( 1535 origin_record->getASTContext().getASTRecordLayout(origin_record.decl)); 1536 1537 int field_idx = 0, field_count = record_layout.getFieldCount(); 1538 1539 for (RecordDecl::field_iterator fi = origin_record->field_begin(), 1540 fe = origin_record->field_end(); 1541 fi != fe; ++fi) { 1542 if (field_idx >= field_count) 1543 return false; // Layout didn't go well. Bail out. 1544 1545 uint64_t field_offset = record_layout.getFieldOffset(field_idx); 1546 1547 origin_field_offsets.insert( 1548 std::pair<const FieldDecl *, uint64_t>(*fi, field_offset)); 1549 1550 field_idx++; 1551 } 1552 1553 lldbassert(&record->getASTContext() == m_ast_context); 1554 1555 DeclFromUser<const CXXRecordDecl> origin_cxx_record( 1556 DynCast<const CXXRecordDecl>(origin_record)); 1557 1558 if (origin_cxx_record.IsValid()) { 1559 if (!ExtractBaseOffsets<false>(record_layout, origin_cxx_record, 1560 origin_base_offsets) || 1561 !ExtractBaseOffsets<true>(record_layout, origin_cxx_record, 1562 origin_virtual_base_offsets)) 1563 return false; 1564 } 1565 1566 if (!ImportOffsetMap(field_offsets, origin_field_offsets, *this) || 1567 !ImportOffsetMap(base_offsets, origin_base_offsets, *this) || 1568 !ImportOffsetMap(virtual_base_offsets, origin_virtual_base_offsets, 1569 *this)) 1570 return false; 1571 1572 size = record_layout.getSize().getQuantity() * m_ast_context->getCharWidth(); 1573 alignment = record_layout.getAlignment().getQuantity() * 1574 m_ast_context->getCharWidth(); 1575 1576 if (log) { 1577 LLDB_LOG(log, "LRT returned:"); 1578 LLDB_LOG(log, "LRT Original = (RecordDecl*)%p", 1579 static_cast<const void *>(origin_record.decl)); 1580 LLDB_LOG(log, "LRT Size = %" PRId64, size); 1581 LLDB_LOG(log, "LRT Alignment = %" PRId64, alignment); 1582 LLDB_LOG(log, "LRT Fields:"); 1583 for (RecordDecl::field_iterator fi = record->field_begin(), 1584 fe = record->field_end(); 1585 fi != fe; ++fi) { 1586 LLDB_LOG(log, 1587 "LRT (FieldDecl*){0}, Name = '{1}', Offset = {2} bits", 1588 *fi, fi->getName(), field_offsets[*fi]); 1589 } 1590 DeclFromParser<const CXXRecordDecl> parser_cxx_record = 1591 DynCast<const CXXRecordDecl>(parser_record); 1592 if (parser_cxx_record.IsValid()) { 1593 LLDB_LOG(log, "LRT Bases:"); 1594 for (CXXRecordDecl::base_class_const_iterator 1595 bi = parser_cxx_record->bases_begin(), 1596 be = parser_cxx_record->bases_end(); 1597 bi != be; ++bi) { 1598 bool is_virtual = bi->isVirtual(); 1599 1600 QualType base_type = bi->getType(); 1601 const RecordType *base_record_type = base_type->getAs<RecordType>(); 1602 DeclFromParser<RecordDecl> base_record(base_record_type->getDecl()); 1603 DeclFromParser<CXXRecordDecl> base_cxx_record = 1604 DynCast<CXXRecordDecl>(base_record); 1605 1606 LLDB_LOG(log, 1607 "LRT {0}(CXXRecordDecl*){1}, Name = '{2}', Offset = " 1608 "{3} chars", 1609 (is_virtual ? "Virtual " : ""), base_cxx_record.decl, 1610 base_cxx_record.decl->getName(), 1611 (is_virtual 1612 ? virtual_base_offsets[base_cxx_record.decl].getQuantity() 1613 : base_offsets[base_cxx_record.decl].getQuantity())); 1614 } 1615 } else { 1616 LLDB_LOG(log, "LRD Not a CXXRecord, so no bases"); 1617 } 1618 } 1619 1620 return true; 1621 } 1622 1623 void ClangASTSource::CompleteNamespaceMap( 1624 ClangASTImporter::NamespaceMapSP &namespace_map, ConstString name, 1625 ClangASTImporter::NamespaceMapSP &parent_map) const { 1626 1627 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1628 1629 if (log) { 1630 if (parent_map && parent_map->size()) 1631 LLDB_LOG(log, 1632 "CompleteNamespaceMap on (ASTContext*){0} '{1}' Searching " 1633 "for namespace {2} in namespace {3}", 1634 m_ast_context, m_clang_ast_context->getDisplayName(), name, 1635 parent_map->begin()->second.GetName()); 1636 else 1637 LLDB_LOG(log, 1638 "CompleteNamespaceMap on (ASTContext*){0} '{1}' Searching " 1639 "for namespace {2}", 1640 m_ast_context, m_clang_ast_context->getDisplayName(), name); 1641 } 1642 1643 if (parent_map) { 1644 for (ClangASTImporter::NamespaceMap::iterator i = parent_map->begin(), 1645 e = parent_map->end(); 1646 i != e; ++i) { 1647 CompilerDeclContext found_namespace_decl; 1648 1649 lldb::ModuleSP module_sp = i->first; 1650 CompilerDeclContext module_parent_namespace_decl = i->second; 1651 1652 SymbolFile *symbol_file = module_sp->GetSymbolFile(); 1653 1654 if (!symbol_file) 1655 continue; 1656 1657 found_namespace_decl = 1658 symbol_file->FindNamespace(name, module_parent_namespace_decl); 1659 1660 if (!found_namespace_decl) 1661 continue; 1662 1663 namespace_map->push_back(std::pair<lldb::ModuleSP, CompilerDeclContext>( 1664 module_sp, found_namespace_decl)); 1665 1666 LLDB_LOG(log, " CMN Found namespace {0} in module {1}", name, 1667 module_sp->GetFileSpec().GetFilename()); 1668 } 1669 } else { 1670 const ModuleList &target_images = m_target->GetImages(); 1671 std::lock_guard<std::recursive_mutex> guard(target_images.GetMutex()); 1672 1673 CompilerDeclContext null_namespace_decl; 1674 1675 for (size_t i = 0, e = target_images.GetSize(); i < e; ++i) { 1676 lldb::ModuleSP image = target_images.GetModuleAtIndexUnlocked(i); 1677 1678 if (!image) 1679 continue; 1680 1681 CompilerDeclContext found_namespace_decl; 1682 1683 SymbolFile *symbol_file = image->GetSymbolFile(); 1684 1685 if (!symbol_file) 1686 continue; 1687 1688 found_namespace_decl = 1689 symbol_file->FindNamespace(name, null_namespace_decl); 1690 1691 if (!found_namespace_decl) 1692 continue; 1693 1694 namespace_map->push_back(std::pair<lldb::ModuleSP, CompilerDeclContext>( 1695 image, found_namespace_decl)); 1696 1697 LLDB_LOG(log, " CMN[{0}] Found namespace {0} in module {1}", name, 1698 image->GetFileSpec().GetFilename()); 1699 } 1700 } 1701 } 1702 1703 NamespaceDecl *ClangASTSource::AddNamespace( 1704 NameSearchContext &context, 1705 ClangASTImporter::NamespaceMapSP &namespace_decls) { 1706 if (!namespace_decls) 1707 return nullptr; 1708 1709 const CompilerDeclContext &namespace_decl = namespace_decls->begin()->second; 1710 1711 clang::ASTContext *src_ast = 1712 TypeSystemClang::DeclContextGetTypeSystemClang(namespace_decl); 1713 if (!src_ast) 1714 return nullptr; 1715 clang::NamespaceDecl *src_namespace_decl = 1716 TypeSystemClang::DeclContextGetAsNamespaceDecl(namespace_decl); 1717 1718 if (!src_namespace_decl) 1719 return nullptr; 1720 1721 Decl *copied_decl = CopyDecl(src_namespace_decl); 1722 1723 if (!copied_decl) 1724 return nullptr; 1725 1726 NamespaceDecl *copied_namespace_decl = dyn_cast<NamespaceDecl>(copied_decl); 1727 1728 if (!copied_namespace_decl) 1729 return nullptr; 1730 1731 context.m_decls.push_back(copied_namespace_decl); 1732 1733 m_ast_importer_sp->RegisterNamespaceMap(copied_namespace_decl, 1734 namespace_decls); 1735 1736 return dyn_cast<NamespaceDecl>(copied_decl); 1737 } 1738 1739 clang::Decl *ClangASTSource::CopyDecl(Decl *src_decl) { 1740 return m_ast_importer_sp->CopyDecl(m_ast_context, src_decl); 1741 } 1742 1743 ClangASTImporter::DeclOrigin ClangASTSource::GetDeclOrigin(const clang::Decl *decl) { 1744 return m_ast_importer_sp->GetDeclOrigin(decl); 1745 } 1746 1747 CompilerType ClangASTSource::GuardedCopyType(const CompilerType &src_type) { 1748 TypeSystemClang *src_ast = 1749 llvm::dyn_cast_or_null<TypeSystemClang>(src_type.GetTypeSystem()); 1750 if (src_ast == nullptr) 1751 return CompilerType(); 1752 1753 QualType copied_qual_type = ClangUtil::GetQualType( 1754 m_ast_importer_sp->CopyType(*m_clang_ast_context, src_type)); 1755 1756 if (copied_qual_type.getAsOpaquePtr() && 1757 copied_qual_type->getCanonicalTypeInternal().isNull()) 1758 // this shouldn't happen, but we're hardening because the AST importer 1759 // seems to be generating bad types on occasion. 1760 return CompilerType(); 1761 1762 return m_clang_ast_context->GetType(copied_qual_type); 1763 } 1764