1 //===-- ClangASTImporter.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 "lldb/Core/Module.h" 10 #include "lldb/Utility/LLDBAssert.h" 11 #include "lldb/Utility/Log.h" 12 #include "clang/AST/Decl.h" 13 #include "clang/AST/DeclCXX.h" 14 #include "clang/AST/DeclObjC.h" 15 #include "clang/Sema/Lookup.h" 16 #include "clang/Sema/Sema.h" 17 #include "llvm/Support/raw_ostream.h" 18 19 #include "Plugins/ExpressionParser/Clang/ClangASTImporter.h" 20 #include "Plugins/ExpressionParser/Clang/ClangASTMetadata.h" 21 #include "Plugins/ExpressionParser/Clang/ClangASTSource.h" 22 #include "Plugins/ExpressionParser/Clang/ClangExternalASTSourceCallbacks.h" 23 #include "Plugins/ExpressionParser/Clang/ClangUtil.h" 24 #include "Plugins/TypeSystem/Clang/TypeSystemClang.h" 25 26 #include <memory> 27 28 using namespace lldb_private; 29 using namespace clang; 30 31 CompilerType ClangASTImporter::CopyType(TypeSystemClang &dst_ast, 32 const CompilerType &src_type) { 33 clang::ASTContext &dst_clang_ast = dst_ast.getASTContext(); 34 35 TypeSystemClang *src_ast = 36 llvm::dyn_cast_or_null<TypeSystemClang>(src_type.GetTypeSystem()); 37 if (!src_ast) 38 return CompilerType(); 39 40 clang::ASTContext &src_clang_ast = src_ast->getASTContext(); 41 42 clang::QualType src_qual_type = ClangUtil::GetQualType(src_type); 43 44 ImporterDelegateSP delegate_sp(GetDelegate(&dst_clang_ast, &src_clang_ast)); 45 if (!delegate_sp) 46 return CompilerType(); 47 48 ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, &dst_clang_ast); 49 50 llvm::Expected<QualType> ret_or_error = delegate_sp->Import(src_qual_type); 51 if (!ret_or_error) { 52 Log *log = 53 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS); 54 LLDB_LOG_ERROR(log, ret_or_error.takeError(), 55 "Couldn't import type: {0}"); 56 return CompilerType(); 57 } 58 59 lldb::opaque_compiler_type_t dst_clang_type = ret_or_error->getAsOpaquePtr(); 60 61 if (dst_clang_type) 62 return CompilerType(&dst_ast, dst_clang_type); 63 return CompilerType(); 64 } 65 66 clang::Decl *ClangASTImporter::CopyDecl(clang::ASTContext *dst_ast, 67 clang::Decl *decl) { 68 ImporterDelegateSP delegate_sp; 69 70 clang::ASTContext *src_ast = &decl->getASTContext(); 71 delegate_sp = GetDelegate(dst_ast, src_ast); 72 73 ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, dst_ast); 74 75 if (!delegate_sp) 76 return nullptr; 77 78 llvm::Expected<clang::Decl *> result = delegate_sp->Import(decl); 79 if (!result) { 80 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 81 LLDB_LOG_ERROR(log, result.takeError(), "Couldn't import decl: {0}"); 82 if (log) { 83 lldb::user_id_t user_id = LLDB_INVALID_UID; 84 ClangASTMetadata *metadata = GetDeclMetadata(decl); 85 if (metadata) 86 user_id = metadata->GetUserID(); 87 88 if (NamedDecl *named_decl = dyn_cast<NamedDecl>(decl)) 89 LLDB_LOG(log, 90 " [ClangASTImporter] WARNING: Failed to import a {0} " 91 "'{1}', metadata {2}", 92 decl->getDeclKindName(), named_decl->getNameAsString(), 93 user_id); 94 else 95 LLDB_LOG(log, 96 " [ClangASTImporter] WARNING: Failed to import a {0}, " 97 "metadata {1}", 98 decl->getDeclKindName(), user_id); 99 } 100 return nullptr; 101 } 102 103 return *result; 104 } 105 106 class DeclContextOverride { 107 private: 108 struct Backup { 109 clang::DeclContext *decl_context; 110 clang::DeclContext *lexical_decl_context; 111 }; 112 113 llvm::DenseMap<clang::Decl *, Backup> m_backups; 114 115 void OverrideOne(clang::Decl *decl) { 116 if (m_backups.find(decl) != m_backups.end()) { 117 return; 118 } 119 120 m_backups[decl] = {decl->getDeclContext(), decl->getLexicalDeclContext()}; 121 122 decl->setDeclContext(decl->getASTContext().getTranslationUnitDecl()); 123 decl->setLexicalDeclContext(decl->getASTContext().getTranslationUnitDecl()); 124 } 125 126 bool ChainPassesThrough( 127 clang::Decl *decl, clang::DeclContext *base, 128 clang::DeclContext *(clang::Decl::*contextFromDecl)(), 129 clang::DeclContext *(clang::DeclContext::*contextFromContext)()) { 130 for (DeclContext *decl_ctx = (decl->*contextFromDecl)(); decl_ctx; 131 decl_ctx = (decl_ctx->*contextFromContext)()) { 132 if (decl_ctx == base) { 133 return true; 134 } 135 } 136 137 return false; 138 } 139 140 clang::Decl *GetEscapedChild(clang::Decl *decl, 141 clang::DeclContext *base = nullptr) { 142 if (base) { 143 // decl's DeclContext chains must pass through base. 144 145 if (!ChainPassesThrough(decl, base, &clang::Decl::getDeclContext, 146 &clang::DeclContext::getParent) || 147 !ChainPassesThrough(decl, base, &clang::Decl::getLexicalDeclContext, 148 &clang::DeclContext::getLexicalParent)) { 149 return decl; 150 } 151 } else { 152 base = clang::dyn_cast<clang::DeclContext>(decl); 153 154 if (!base) { 155 return nullptr; 156 } 157 } 158 159 if (clang::DeclContext *context = 160 clang::dyn_cast<clang::DeclContext>(decl)) { 161 for (clang::Decl *decl : context->decls()) { 162 if (clang::Decl *escaped_child = GetEscapedChild(decl)) { 163 return escaped_child; 164 } 165 } 166 } 167 168 return nullptr; 169 } 170 171 void Override(clang::Decl *decl) { 172 if (clang::Decl *escaped_child = GetEscapedChild(decl)) { 173 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 174 175 LLDB_LOG(log, 176 " [ClangASTImporter] DeclContextOverride couldn't " 177 "override ({0}Decl*){1} - its child ({2}Decl*){3} escapes", 178 decl->getDeclKindName(), decl, escaped_child->getDeclKindName(), 179 escaped_child); 180 lldbassert(0 && "Couldn't override!"); 181 } 182 183 OverrideOne(decl); 184 } 185 186 public: 187 DeclContextOverride() {} 188 189 void OverrideAllDeclsFromContainingFunction(clang::Decl *decl) { 190 for (DeclContext *decl_context = decl->getLexicalDeclContext(); 191 decl_context; decl_context = decl_context->getLexicalParent()) { 192 DeclContext *redecl_context = decl_context->getRedeclContext(); 193 194 if (llvm::isa<FunctionDecl>(redecl_context) && 195 llvm::isa<TranslationUnitDecl>(redecl_context->getLexicalParent())) { 196 for (clang::Decl *child_decl : decl_context->decls()) { 197 Override(child_decl); 198 } 199 } 200 } 201 } 202 203 ~DeclContextOverride() { 204 for (const std::pair<clang::Decl *, Backup> &backup : m_backups) { 205 backup.first->setDeclContext(backup.second.decl_context); 206 backup.first->setLexicalDeclContext(backup.second.lexical_decl_context); 207 } 208 } 209 }; 210 211 namespace { 212 /// Completes all imported TagDecls at the end of the scope. 213 /// 214 /// While in a CompleteTagDeclsScope, every decl that could be completed will 215 /// be completed at the end of the scope (including all Decls that are 216 /// imported while completing the original Decls). 217 class CompleteTagDeclsScope : public ClangASTImporter::NewDeclListener { 218 ClangASTImporter::ImporterDelegateSP m_delegate; 219 llvm::SmallVector<NamedDecl *, 32> m_decls_to_complete; 220 llvm::SmallPtrSet<NamedDecl *, 32> m_decls_already_completed; 221 clang::ASTContext *m_dst_ctx; 222 clang::ASTContext *m_src_ctx; 223 ClangASTImporter &importer; 224 225 public: 226 /// Constructs a CompleteTagDeclsScope. 227 /// \param importer The ClangASTImporter that we should observe. 228 /// \param dst_ctx The ASTContext to which Decls are imported. 229 /// \param src_ctx The ASTContext from which Decls are imported. 230 explicit CompleteTagDeclsScope(ClangASTImporter &importer, 231 clang::ASTContext *dst_ctx, 232 clang::ASTContext *src_ctx) 233 : m_delegate(importer.GetDelegate(dst_ctx, src_ctx)), m_dst_ctx(dst_ctx), 234 m_src_ctx(src_ctx), importer(importer) { 235 m_delegate->SetImportListener(this); 236 } 237 238 virtual ~CompleteTagDeclsScope() { 239 ClangASTImporter::ASTContextMetadataSP to_context_md = 240 importer.GetContextMetadata(m_dst_ctx); 241 242 // Complete all decls we collected until now. 243 while (!m_decls_to_complete.empty()) { 244 NamedDecl *decl = m_decls_to_complete.pop_back_val(); 245 m_decls_already_completed.insert(decl); 246 247 // We should only complete decls coming from the source context. 248 assert(to_context_md->m_origins[decl].ctx == m_src_ctx); 249 250 Decl *original_decl = to_context_md->m_origins[decl].decl; 251 252 // Complete the decl now. 253 TypeSystemClang::GetCompleteDecl(m_src_ctx, original_decl); 254 if (auto *tag_decl = dyn_cast<TagDecl>(decl)) { 255 if (auto *original_tag_decl = dyn_cast<TagDecl>(original_decl)) { 256 if (original_tag_decl->isCompleteDefinition()) { 257 m_delegate->ImportDefinitionTo(tag_decl, original_tag_decl); 258 tag_decl->setCompleteDefinition(true); 259 } 260 } 261 262 tag_decl->setHasExternalLexicalStorage(false); 263 tag_decl->setHasExternalVisibleStorage(false); 264 } else if (auto *container_decl = dyn_cast<ObjCContainerDecl>(decl)) { 265 container_decl->setHasExternalLexicalStorage(false); 266 container_decl->setHasExternalVisibleStorage(false); 267 } 268 269 to_context_md->m_origins.erase(decl); 270 } 271 272 // Stop listening to imported decls. We do this after clearing the 273 // Decls we needed to import to catch all Decls they might have pulled in. 274 m_delegate->RemoveImportListener(); 275 } 276 277 void NewDeclImported(clang::Decl *from, clang::Decl *to) override { 278 // Filter out decls that we can't complete later. 279 if (!isa<TagDecl>(to) && !isa<ObjCInterfaceDecl>(to)) 280 return; 281 RecordDecl *from_record_decl = dyn_cast<RecordDecl>(from); 282 // We don't need to complete injected class name decls. 283 if (from_record_decl && from_record_decl->isInjectedClassName()) 284 return; 285 286 NamedDecl *to_named_decl = dyn_cast<NamedDecl>(to); 287 // Check if we already completed this type. 288 if (m_decls_already_completed.count(to_named_decl) != 0) 289 return; 290 m_decls_to_complete.push_back(to_named_decl); 291 } 292 }; 293 } // namespace 294 295 CompilerType ClangASTImporter::DeportType(TypeSystemClang &dst, 296 const CompilerType &src_type) { 297 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 298 299 TypeSystemClang *src_ctxt = 300 llvm::cast<TypeSystemClang>(src_type.GetTypeSystem()); 301 302 LLDB_LOG(log, 303 " [ClangASTImporter] DeportType called on ({0}Type*){1} " 304 "from (ASTContext*){2} to (ASTContext*){3}", 305 src_type.GetTypeName(), src_type.GetOpaqueQualType(), 306 &src_ctxt->getASTContext(), &dst.getASTContext()); 307 308 DeclContextOverride decl_context_override; 309 310 if (auto *t = ClangUtil::GetQualType(src_type)->getAs<TagType>()) 311 decl_context_override.OverrideAllDeclsFromContainingFunction(t->getDecl()); 312 313 CompleteTagDeclsScope complete_scope(*this, &dst.getASTContext(), 314 &src_ctxt->getASTContext()); 315 return CopyType(dst, src_type); 316 } 317 318 clang::Decl *ClangASTImporter::DeportDecl(clang::ASTContext *dst_ctx, 319 clang::Decl *decl) { 320 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 321 322 clang::ASTContext *src_ctx = &decl->getASTContext(); 323 LLDB_LOG(log, 324 " [ClangASTImporter] DeportDecl called on ({0}Decl*){1} from " 325 "(ASTContext*){2} to (ASTContext*){3}", 326 decl->getDeclKindName(), decl, src_ctx, dst_ctx); 327 328 DeclContextOverride decl_context_override; 329 330 decl_context_override.OverrideAllDeclsFromContainingFunction(decl); 331 332 clang::Decl *result; 333 { 334 CompleteTagDeclsScope complete_scope(*this, dst_ctx, src_ctx); 335 result = CopyDecl(dst_ctx, decl); 336 } 337 338 if (!result) 339 return nullptr; 340 341 LLDB_LOG(log, 342 " [ClangASTImporter] DeportDecl deported ({0}Decl*){1} to " 343 "({2}Decl*){3}", 344 decl->getDeclKindName(), decl, result->getDeclKindName(), result); 345 346 return result; 347 } 348 349 bool ClangASTImporter::CanImport(const CompilerType &type) { 350 if (!ClangUtil::IsClangType(type)) 351 return false; 352 353 // TODO: remove external completion BOOL 354 // CompleteAndFetchChildren should get the Decl out and check for the 355 356 clang::QualType qual_type( 357 ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type))); 358 359 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 360 switch (type_class) { 361 case clang::Type::Record: { 362 const clang::CXXRecordDecl *cxx_record_decl = 363 qual_type->getAsCXXRecordDecl(); 364 if (cxx_record_decl) { 365 if (GetDeclOrigin(cxx_record_decl).Valid()) 366 return true; 367 } 368 } break; 369 370 case clang::Type::Enum: { 371 clang::EnumDecl *enum_decl = 372 llvm::cast<clang::EnumType>(qual_type)->getDecl(); 373 if (enum_decl) { 374 if (GetDeclOrigin(enum_decl).Valid()) 375 return true; 376 } 377 } break; 378 379 case clang::Type::ObjCObject: 380 case clang::Type::ObjCInterface: { 381 const clang::ObjCObjectType *objc_class_type = 382 llvm::dyn_cast<clang::ObjCObjectType>(qual_type); 383 if (objc_class_type) { 384 clang::ObjCInterfaceDecl *class_interface_decl = 385 objc_class_type->getInterface(); 386 // We currently can't complete objective C types through the newly added 387 // ASTContext because it only supports TagDecl objects right now... 388 if (class_interface_decl) { 389 if (GetDeclOrigin(class_interface_decl).Valid()) 390 return true; 391 } 392 } 393 } break; 394 395 case clang::Type::Typedef: 396 return CanImport(CompilerType(type.GetTypeSystem(), 397 llvm::cast<clang::TypedefType>(qual_type) 398 ->getDecl() 399 ->getUnderlyingType() 400 .getAsOpaquePtr())); 401 402 case clang::Type::Auto: 403 return CanImport(CompilerType(type.GetTypeSystem(), 404 llvm::cast<clang::AutoType>(qual_type) 405 ->getDeducedType() 406 .getAsOpaquePtr())); 407 408 case clang::Type::Elaborated: 409 return CanImport(CompilerType(type.GetTypeSystem(), 410 llvm::cast<clang::ElaboratedType>(qual_type) 411 ->getNamedType() 412 .getAsOpaquePtr())); 413 414 case clang::Type::Paren: 415 return CanImport(CompilerType( 416 type.GetTypeSystem(), 417 llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())); 418 419 default: 420 break; 421 } 422 423 return false; 424 } 425 426 bool ClangASTImporter::Import(const CompilerType &type) { 427 if (!ClangUtil::IsClangType(type)) 428 return false; 429 // TODO: remove external completion BOOL 430 // CompleteAndFetchChildren should get the Decl out and check for the 431 432 clang::QualType qual_type( 433 ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type))); 434 435 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 436 switch (type_class) { 437 case clang::Type::Record: { 438 const clang::CXXRecordDecl *cxx_record_decl = 439 qual_type->getAsCXXRecordDecl(); 440 if (cxx_record_decl) { 441 if (GetDeclOrigin(cxx_record_decl).Valid()) 442 return CompleteAndFetchChildren(qual_type); 443 } 444 } break; 445 446 case clang::Type::Enum: { 447 clang::EnumDecl *enum_decl = 448 llvm::cast<clang::EnumType>(qual_type)->getDecl(); 449 if (enum_decl) { 450 if (GetDeclOrigin(enum_decl).Valid()) 451 return CompleteAndFetchChildren(qual_type); 452 } 453 } break; 454 455 case clang::Type::ObjCObject: 456 case clang::Type::ObjCInterface: { 457 const clang::ObjCObjectType *objc_class_type = 458 llvm::dyn_cast<clang::ObjCObjectType>(qual_type); 459 if (objc_class_type) { 460 clang::ObjCInterfaceDecl *class_interface_decl = 461 objc_class_type->getInterface(); 462 // We currently can't complete objective C types through the newly added 463 // ASTContext because it only supports TagDecl objects right now... 464 if (class_interface_decl) { 465 if (GetDeclOrigin(class_interface_decl).Valid()) 466 return CompleteAndFetchChildren(qual_type); 467 } 468 } 469 } break; 470 471 case clang::Type::Typedef: 472 return Import(CompilerType(type.GetTypeSystem(), 473 llvm::cast<clang::TypedefType>(qual_type) 474 ->getDecl() 475 ->getUnderlyingType() 476 .getAsOpaquePtr())); 477 478 case clang::Type::Auto: 479 return Import(CompilerType(type.GetTypeSystem(), 480 llvm::cast<clang::AutoType>(qual_type) 481 ->getDeducedType() 482 .getAsOpaquePtr())); 483 484 case clang::Type::Elaborated: 485 return Import(CompilerType(type.GetTypeSystem(), 486 llvm::cast<clang::ElaboratedType>(qual_type) 487 ->getNamedType() 488 .getAsOpaquePtr())); 489 490 case clang::Type::Paren: 491 return Import(CompilerType( 492 type.GetTypeSystem(), 493 llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr())); 494 495 default: 496 break; 497 } 498 return false; 499 } 500 501 bool ClangASTImporter::CompleteType(const CompilerType &compiler_type) { 502 if (!CanImport(compiler_type)) 503 return false; 504 505 if (Import(compiler_type)) { 506 TypeSystemClang::CompleteTagDeclarationDefinition(compiler_type); 507 return true; 508 } 509 510 TypeSystemClang::SetHasExternalStorage(compiler_type.GetOpaqueQualType(), 511 false); 512 return false; 513 } 514 515 bool ClangASTImporter::LayoutRecordType( 516 const clang::RecordDecl *record_decl, uint64_t &bit_size, 517 uint64_t &alignment, 518 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets, 519 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 520 &base_offsets, 521 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> 522 &vbase_offsets) { 523 RecordDeclToLayoutMap::iterator pos = 524 m_record_decl_to_layout_map.find(record_decl); 525 bool success = false; 526 base_offsets.clear(); 527 vbase_offsets.clear(); 528 if (pos != m_record_decl_to_layout_map.end()) { 529 bit_size = pos->second.bit_size; 530 alignment = pos->second.alignment; 531 field_offsets.swap(pos->second.field_offsets); 532 base_offsets.swap(pos->second.base_offsets); 533 vbase_offsets.swap(pos->second.vbase_offsets); 534 m_record_decl_to_layout_map.erase(pos); 535 success = true; 536 } else { 537 bit_size = 0; 538 alignment = 0; 539 field_offsets.clear(); 540 } 541 return success; 542 } 543 544 void ClangASTImporter::SetRecordLayout(clang::RecordDecl *decl, 545 const LayoutInfo &layout) { 546 m_record_decl_to_layout_map.insert(std::make_pair(decl, layout)); 547 } 548 549 bool ClangASTImporter::CompleteTagDecl(clang::TagDecl *decl) { 550 DeclOrigin decl_origin = GetDeclOrigin(decl); 551 552 if (!decl_origin.Valid()) 553 return false; 554 555 if (!TypeSystemClang::GetCompleteDecl(decl_origin.ctx, decl_origin.decl)) 556 return false; 557 558 ImporterDelegateSP delegate_sp( 559 GetDelegate(&decl->getASTContext(), decl_origin.ctx)); 560 561 ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, 562 &decl->getASTContext()); 563 if (delegate_sp) 564 delegate_sp->ImportDefinitionTo(decl, decl_origin.decl); 565 566 return true; 567 } 568 569 bool ClangASTImporter::CompleteTagDeclWithOrigin(clang::TagDecl *decl, 570 clang::TagDecl *origin_decl) { 571 clang::ASTContext *origin_ast_ctx = &origin_decl->getASTContext(); 572 573 if (!TypeSystemClang::GetCompleteDecl(origin_ast_ctx, origin_decl)) 574 return false; 575 576 ImporterDelegateSP delegate_sp( 577 GetDelegate(&decl->getASTContext(), origin_ast_ctx)); 578 579 if (delegate_sp) 580 delegate_sp->ImportDefinitionTo(decl, origin_decl); 581 582 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 583 584 OriginMap &origins = context_md->m_origins; 585 586 origins[decl] = DeclOrigin(origin_ast_ctx, origin_decl); 587 588 return true; 589 } 590 591 bool ClangASTImporter::CompleteObjCInterfaceDecl( 592 clang::ObjCInterfaceDecl *interface_decl) { 593 DeclOrigin decl_origin = GetDeclOrigin(interface_decl); 594 595 if (!decl_origin.Valid()) 596 return false; 597 598 if (!TypeSystemClang::GetCompleteDecl(decl_origin.ctx, decl_origin.decl)) 599 return false; 600 601 ImporterDelegateSP delegate_sp( 602 GetDelegate(&interface_decl->getASTContext(), decl_origin.ctx)); 603 604 if (delegate_sp) 605 delegate_sp->ImportDefinitionTo(interface_decl, decl_origin.decl); 606 607 if (ObjCInterfaceDecl *super_class = interface_decl->getSuperClass()) 608 RequireCompleteType(clang::QualType(super_class->getTypeForDecl(), 0)); 609 610 return true; 611 } 612 613 bool ClangASTImporter::CompleteAndFetchChildren(clang::QualType type) { 614 if (!RequireCompleteType(type)) 615 return false; 616 617 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS); 618 619 if (const TagType *tag_type = type->getAs<TagType>()) { 620 TagDecl *tag_decl = tag_type->getDecl(); 621 622 DeclOrigin decl_origin = GetDeclOrigin(tag_decl); 623 624 if (!decl_origin.Valid()) 625 return false; 626 627 ImporterDelegateSP delegate_sp( 628 GetDelegate(&tag_decl->getASTContext(), decl_origin.ctx)); 629 630 ASTImporterDelegate::CxxModuleScope std_scope(*delegate_sp, 631 &tag_decl->getASTContext()); 632 633 TagDecl *origin_tag_decl = llvm::dyn_cast<TagDecl>(decl_origin.decl); 634 635 for (Decl *origin_child_decl : origin_tag_decl->decls()) { 636 llvm::Expected<Decl *> imported_or_err = 637 delegate_sp->Import(origin_child_decl); 638 if (!imported_or_err) { 639 LLDB_LOG_ERROR(log, imported_or_err.takeError(), 640 "Couldn't import decl: {0}"); 641 return false; 642 } 643 } 644 645 if (RecordDecl *record_decl = dyn_cast<RecordDecl>(origin_tag_decl)) 646 record_decl->setHasLoadedFieldsFromExternalStorage(true); 647 648 return true; 649 } 650 651 if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) { 652 if (ObjCInterfaceDecl *objc_interface_decl = 653 objc_object_type->getInterface()) { 654 DeclOrigin decl_origin = GetDeclOrigin(objc_interface_decl); 655 656 if (!decl_origin.Valid()) 657 return false; 658 659 ImporterDelegateSP delegate_sp( 660 GetDelegate(&objc_interface_decl->getASTContext(), decl_origin.ctx)); 661 662 ObjCInterfaceDecl *origin_interface_decl = 663 llvm::dyn_cast<ObjCInterfaceDecl>(decl_origin.decl); 664 665 for (Decl *origin_child_decl : origin_interface_decl->decls()) { 666 llvm::Expected<Decl *> imported_or_err = 667 delegate_sp->Import(origin_child_decl); 668 if (!imported_or_err) { 669 LLDB_LOG_ERROR(log, imported_or_err.takeError(), 670 "Couldn't import decl: {0}"); 671 return false; 672 } 673 } 674 675 return true; 676 } 677 return false; 678 } 679 680 return true; 681 } 682 683 bool ClangASTImporter::RequireCompleteType(clang::QualType type) { 684 if (type.isNull()) 685 return false; 686 687 if (const TagType *tag_type = type->getAs<TagType>()) { 688 TagDecl *tag_decl = tag_type->getDecl(); 689 690 if (tag_decl->getDefinition() || tag_decl->isBeingDefined()) 691 return true; 692 693 return CompleteTagDecl(tag_decl); 694 } 695 if (const ObjCObjectType *objc_object_type = type->getAs<ObjCObjectType>()) { 696 if (ObjCInterfaceDecl *objc_interface_decl = 697 objc_object_type->getInterface()) 698 return CompleteObjCInterfaceDecl(objc_interface_decl); 699 return false; 700 } 701 if (const ArrayType *array_type = type->getAsArrayTypeUnsafe()) 702 return RequireCompleteType(array_type->getElementType()); 703 if (const AtomicType *atomic_type = type->getAs<AtomicType>()) 704 return RequireCompleteType(atomic_type->getPointeeType()); 705 706 return true; 707 } 708 709 ClangASTMetadata *ClangASTImporter::GetDeclMetadata(const clang::Decl *decl) { 710 DeclOrigin decl_origin = GetDeclOrigin(decl); 711 712 if (decl_origin.Valid()) { 713 TypeSystemClang *ast = TypeSystemClang::GetASTContext(decl_origin.ctx); 714 return ast->GetMetadata(decl_origin.decl); 715 } 716 TypeSystemClang *ast = TypeSystemClang::GetASTContext(&decl->getASTContext()); 717 return ast->GetMetadata(decl); 718 } 719 720 ClangASTImporter::DeclOrigin 721 ClangASTImporter::GetDeclOrigin(const clang::Decl *decl) { 722 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 723 724 OriginMap &origins = context_md->m_origins; 725 726 OriginMap::iterator iter = origins.find(decl); 727 728 if (iter != origins.end()) 729 return iter->second; 730 return DeclOrigin(); 731 } 732 733 void ClangASTImporter::SetDeclOrigin(const clang::Decl *decl, 734 clang::Decl *original_decl) { 735 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 736 737 OriginMap &origins = context_md->m_origins; 738 739 OriginMap::iterator iter = origins.find(decl); 740 741 if (iter != origins.end()) { 742 iter->second.decl = original_decl; 743 iter->second.ctx = &original_decl->getASTContext(); 744 return; 745 } 746 origins[decl] = DeclOrigin(&original_decl->getASTContext(), original_decl); 747 } 748 749 void ClangASTImporter::RegisterNamespaceMap(const clang::NamespaceDecl *decl, 750 NamespaceMapSP &namespace_map) { 751 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 752 753 context_md->m_namespace_maps[decl] = namespace_map; 754 } 755 756 ClangASTImporter::NamespaceMapSP 757 ClangASTImporter::GetNamespaceMap(const clang::NamespaceDecl *decl) { 758 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 759 760 NamespaceMetaMap &namespace_maps = context_md->m_namespace_maps; 761 762 NamespaceMetaMap::iterator iter = namespace_maps.find(decl); 763 764 if (iter != namespace_maps.end()) 765 return iter->second; 766 return NamespaceMapSP(); 767 } 768 769 void ClangASTImporter::BuildNamespaceMap(const clang::NamespaceDecl *decl) { 770 assert(decl); 771 ASTContextMetadataSP context_md = GetContextMetadata(&decl->getASTContext()); 772 773 const DeclContext *parent_context = decl->getDeclContext(); 774 const NamespaceDecl *parent_namespace = 775 dyn_cast<NamespaceDecl>(parent_context); 776 NamespaceMapSP parent_map; 777 778 if (parent_namespace) 779 parent_map = GetNamespaceMap(parent_namespace); 780 781 NamespaceMapSP new_map; 782 783 new_map = std::make_shared<NamespaceMap>(); 784 785 if (context_md->m_map_completer) { 786 std::string namespace_string = decl->getDeclName().getAsString(); 787 788 context_md->m_map_completer->CompleteNamespaceMap( 789 new_map, ConstString(namespace_string.c_str()), parent_map); 790 } 791 792 context_md->m_namespace_maps[decl] = new_map; 793 } 794 795 void ClangASTImporter::ForgetDestination(clang::ASTContext *dst_ast) { 796 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 797 798 LLDB_LOG(log, 799 " [ClangASTImporter] Forgetting destination (ASTContext*){0}", 800 dst_ast); 801 802 m_metadata_map.erase(dst_ast); 803 } 804 805 void ClangASTImporter::ForgetSource(clang::ASTContext *dst_ast, 806 clang::ASTContext *src_ast) { 807 ASTContextMetadataSP md = MaybeGetContextMetadata(dst_ast); 808 809 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 810 811 LLDB_LOG(log, 812 " [ClangASTImporter] Forgetting source->dest " 813 "(ASTContext*){0}->(ASTContext*){1}", 814 src_ast, dst_ast); 815 816 if (!md) 817 return; 818 819 md->m_delegates.erase(src_ast); 820 821 for (OriginMap::iterator iter = md->m_origins.begin(); 822 iter != md->m_origins.end();) { 823 if (iter->second.ctx == src_ast) 824 md->m_origins.erase(iter++); 825 else 826 ++iter; 827 } 828 } 829 830 ClangASTImporter::MapCompleter::~MapCompleter() { return; } 831 832 llvm::Expected<Decl *> 833 ClangASTImporter::ASTImporterDelegate::ImportImpl(Decl *From) { 834 if (m_std_handler) { 835 llvm::Optional<Decl *> D = m_std_handler->Import(From); 836 if (D) { 837 // Make sure we don't use this decl later to map it back to it's original 838 // decl. The decl the CxxModuleHandler created has nothing to do with 839 // the one from debug info, and linking those two would just cause the 840 // ASTImporter to try 'updating' the module decl with the minimal one from 841 // the debug info. 842 m_decls_to_ignore.insert(*D); 843 return *D; 844 } 845 } 846 847 // Check which ASTContext this declaration originally came from. 848 DeclOrigin origin = m_master.GetDeclOrigin(From); 849 // If it originally came from the target ASTContext then we can just 850 // pretend that the original is the one we imported. This can happen for 851 // example when inspecting a persistent declaration from the scratch 852 // ASTContext (which will provide the declaration when parsing the 853 // expression and then we later try to copy the declaration back to the 854 // scratch ASTContext to store the result). 855 // Without this check we would ask the ASTImporter to import a declaration 856 // into the same ASTContext where it came from (which doesn't make a lot of 857 // sense). 858 if (origin.Valid() && origin.ctx == &getToContext()) { 859 RegisterImportedDecl(From, origin.decl); 860 return origin.decl; 861 } 862 863 // This declaration came originally from another ASTContext. Instead of 864 // copying our potentially incomplete 'From' Decl we instead go to the 865 // original ASTContext and copy the original to the target. This is not 866 // only faster than first completing our current decl and then copying it 867 // to the target, but it also prevents that indirectly copying the same 868 // declaration to the same target requires the ASTImporter to merge all 869 // the different decls that appear to come from different ASTContexts (even 870 // though all these different source ASTContexts just got a copy from 871 // one source AST). 872 if (origin.Valid()) { 873 auto R = m_master.CopyDecl(&getToContext(), origin.decl); 874 if (R) { 875 RegisterImportedDecl(From, R); 876 return R; 877 } 878 } 879 880 // If we have a forcefully completed type, try to find an actual definition 881 // for it in other modules. 882 const ClangASTMetadata *md = m_master.GetDeclMetadata(From); 883 auto *td = dyn_cast<TagDecl>(From); 884 if (td && md && md->IsForcefullyCompleted()) { 885 Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS); 886 LLDB_LOG(log, 887 "[ClangASTImporter] Searching for a complete definition of {0} in " 888 "other modules", 889 td->getName()); 890 Expected<DeclContext *> dc_or_err = ImportContext(td->getDeclContext()); 891 if (!dc_or_err) 892 return dc_or_err.takeError(); 893 Expected<DeclarationName> dn_or_err = Import(td->getDeclName()); 894 if (!dn_or_err) 895 return dn_or_err.takeError(); 896 DeclContext *dc = *dc_or_err; 897 DeclContext::lookup_result lr = dc->lookup(*dn_or_err); 898 if (lr.size()) { 899 clang::Decl *lookup_found = lr.front(); 900 RegisterImportedDecl(From, lookup_found); 901 m_decls_to_ignore.insert(lookup_found); 902 return lookup_found; 903 } else 904 LLDB_LOG(log, "[ClangASTImporter] Complete definition not found"); 905 } 906 907 return ASTImporter::ImportImpl(From); 908 } 909 910 void ClangASTImporter::ASTImporterDelegate::ImportDefinitionTo( 911 clang::Decl *to, clang::Decl *from) { 912 // We might have a forward declaration from a shared library that we 913 // gave external lexical storage so that Clang asks us about the full 914 // definition when it needs it. In this case the ASTImporter isn't aware 915 // that the forward decl from the shared library is the actual import 916 // target but would create a second declaration that would then be defined. 917 // We want that 'to' is actually complete after this function so let's 918 // tell the ASTImporter that 'to' was imported from 'from'. 919 MapImported(from, to); 920 ASTImporter::Imported(from, to); 921 922 /* 923 if (to_objc_interface) 924 to_objc_interface->startDefinition(); 925 926 CXXRecordDecl *to_cxx_record = dyn_cast<CXXRecordDecl>(to); 927 928 if (to_cxx_record) 929 to_cxx_record->startDefinition(); 930 */ 931 932 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS); 933 934 if (llvm::Error err = ImportDefinition(from)) { 935 LLDB_LOG_ERROR(log, std::move(err), 936 "[ClangASTImporter] Error during importing definition: {0}"); 937 return; 938 } 939 940 if (clang::TagDecl *to_tag = dyn_cast<clang::TagDecl>(to)) { 941 if (clang::TagDecl *from_tag = dyn_cast<clang::TagDecl>(from)) { 942 to_tag->setCompleteDefinition(from_tag->isCompleteDefinition()); 943 944 if (Log *log_ast = 945 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_AST)) { 946 std::string name_string; 947 if (NamedDecl *from_named_decl = dyn_cast<clang::NamedDecl>(from)) { 948 llvm::raw_string_ostream name_stream(name_string); 949 from_named_decl->printName(name_stream); 950 name_stream.flush(); 951 } 952 LLDB_LOG(log_ast, "==== [ClangASTImporter][TUDecl: {0}] Imported " 953 "({1}Decl*){2}, named {3} (from " 954 "(Decl*){4})", 955 static_cast<void *>(to->getTranslationUnitDecl()), 956 from->getDeclKindName(), static_cast<void *>(to), name_string, 957 static_cast<void *>(from)); 958 959 // Log the AST of the TU. 960 std::string ast_string; 961 llvm::raw_string_ostream ast_stream(ast_string); 962 to->getTranslationUnitDecl()->dump(ast_stream); 963 LLDB_LOG(log_ast, "{0}", ast_string); 964 } 965 } 966 } 967 968 // If we're dealing with an Objective-C class, ensure that the inheritance 969 // has been set up correctly. The ASTImporter may not do this correctly if 970 // the class was originally sourced from symbols. 971 972 if (ObjCInterfaceDecl *to_objc_interface = dyn_cast<ObjCInterfaceDecl>(to)) { 973 do { 974 ObjCInterfaceDecl *to_superclass = to_objc_interface->getSuperClass(); 975 976 if (to_superclass) 977 break; // we're not going to override it if it's set 978 979 ObjCInterfaceDecl *from_objc_interface = 980 dyn_cast<ObjCInterfaceDecl>(from); 981 982 if (!from_objc_interface) 983 break; 984 985 ObjCInterfaceDecl *from_superclass = from_objc_interface->getSuperClass(); 986 987 if (!from_superclass) 988 break; 989 990 llvm::Expected<Decl *> imported_from_superclass_decl = 991 Import(from_superclass); 992 993 if (!imported_from_superclass_decl) { 994 LLDB_LOG_ERROR(log, imported_from_superclass_decl.takeError(), 995 "Couldn't import decl: {0}"); 996 break; 997 } 998 999 ObjCInterfaceDecl *imported_from_superclass = 1000 dyn_cast<ObjCInterfaceDecl>(*imported_from_superclass_decl); 1001 1002 if (!imported_from_superclass) 1003 break; 1004 1005 if (!to_objc_interface->hasDefinition()) 1006 to_objc_interface->startDefinition(); 1007 1008 to_objc_interface->setSuperClass(m_source_ctx->getTrivialTypeSourceInfo( 1009 m_source_ctx->getObjCInterfaceType(imported_from_superclass))); 1010 } while (false); 1011 } 1012 } 1013 1014 /// Takes a CXXMethodDecl and completes the return type if necessary. This 1015 /// is currently only necessary for virtual functions with covariant return 1016 /// types where Clang's CodeGen expects that the underlying records are already 1017 /// completed. 1018 static void MaybeCompleteReturnType(ClangASTImporter &importer, 1019 CXXMethodDecl *to_method) { 1020 if (!to_method->isVirtual()) 1021 return; 1022 QualType return_type = to_method->getReturnType(); 1023 if (!return_type->isPointerType() && !return_type->isReferenceType()) 1024 return; 1025 1026 clang::RecordDecl *rd = return_type->getPointeeType()->getAsRecordDecl(); 1027 if (!rd) 1028 return; 1029 if (rd->getDefinition()) 1030 return; 1031 1032 importer.CompleteTagDecl(rd); 1033 } 1034 1035 /// Recreate a module with its parents in \p to_source and return its id. 1036 static OptionalClangModuleID 1037 RemapModule(OptionalClangModuleID from_id, 1038 ClangExternalASTSourceCallbacks &from_source, 1039 ClangExternalASTSourceCallbacks &to_source) { 1040 if (!from_id.HasValue()) 1041 return {}; 1042 clang::Module *module = from_source.getModule(from_id.GetValue()); 1043 OptionalClangModuleID parent = RemapModule( 1044 from_source.GetIDForModule(module->Parent), from_source, to_source); 1045 TypeSystemClang &to_ts = to_source.GetTypeSystem(); 1046 return to_ts.GetOrCreateClangModule(module->Name, parent, module->IsFramework, 1047 module->IsExplicit); 1048 } 1049 1050 void ClangASTImporter::ASTImporterDelegate::Imported(clang::Decl *from, 1051 clang::Decl *to) { 1052 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1053 1054 // Some decls shouldn't be tracked here because they were not created by 1055 // copying 'from' to 'to'. Just exit early for those. 1056 if (m_decls_to_ignore.count(to)) 1057 return clang::ASTImporter::Imported(from, to); 1058 1059 // Transfer module ownership information. 1060 auto *from_source = llvm::dyn_cast_or_null<ClangExternalASTSourceCallbacks>( 1061 getFromContext().getExternalSource()); 1062 // Can also be a ClangASTSourceProxy. 1063 auto *to_source = llvm::dyn_cast_or_null<ClangExternalASTSourceCallbacks>( 1064 getToContext().getExternalSource()); 1065 if (from_source && to_source) { 1066 OptionalClangModuleID from_id(from->getOwningModuleID()); 1067 OptionalClangModuleID to_id = 1068 RemapModule(from_id, *from_source, *to_source); 1069 TypeSystemClang &to_ts = to_source->GetTypeSystem(); 1070 to_ts.SetOwningModule(to, to_id); 1071 } 1072 1073 lldb::user_id_t user_id = LLDB_INVALID_UID; 1074 ClangASTMetadata *metadata = m_master.GetDeclMetadata(from); 1075 if (metadata) 1076 user_id = metadata->GetUserID(); 1077 1078 if (log) { 1079 if (NamedDecl *from_named_decl = dyn_cast<clang::NamedDecl>(from)) { 1080 std::string name_string; 1081 llvm::raw_string_ostream name_stream(name_string); 1082 from_named_decl->printName(name_stream); 1083 name_stream.flush(); 1084 1085 LLDB_LOG(log, 1086 " [ClangASTImporter] Imported ({0}Decl*){1}, named {2} (from " 1087 "(Decl*){3}), metadata {4}", 1088 from->getDeclKindName(), to, name_string, from, user_id); 1089 } else { 1090 LLDB_LOG(log, 1091 " [ClangASTImporter] Imported ({0}Decl*){1} (from " 1092 "(Decl*){2}), metadata {3}", 1093 from->getDeclKindName(), to, from, user_id); 1094 } 1095 } 1096 1097 ASTContextMetadataSP to_context_md = 1098 m_master.GetContextMetadata(&to->getASTContext()); 1099 ASTContextMetadataSP from_context_md = 1100 m_master.MaybeGetContextMetadata(m_source_ctx); 1101 1102 if (from_context_md) { 1103 OriginMap &origins = from_context_md->m_origins; 1104 1105 OriginMap::iterator origin_iter = origins.find(from); 1106 1107 if (origin_iter != origins.end()) { 1108 if (to_context_md->m_origins.find(to) == to_context_md->m_origins.end() || 1109 user_id != LLDB_INVALID_UID) { 1110 if (origin_iter->second.ctx != &to->getASTContext()) 1111 to_context_md->m_origins[to] = origin_iter->second; 1112 } 1113 1114 ImporterDelegateSP direct_completer = 1115 m_master.GetDelegate(&to->getASTContext(), origin_iter->second.ctx); 1116 1117 if (direct_completer.get() != this) 1118 direct_completer->ASTImporter::Imported(origin_iter->second.decl, to); 1119 1120 LLDB_LOG(log, 1121 " [ClangASTImporter] Propagated origin " 1122 "(Decl*){0}/(ASTContext*){1} from (ASTContext*){2} to " 1123 "(ASTContext*){3}", 1124 origin_iter->second.decl, origin_iter->second.ctx, 1125 &from->getASTContext(), &to->getASTContext()); 1126 } else { 1127 if (m_new_decl_listener) 1128 m_new_decl_listener->NewDeclImported(from, to); 1129 1130 if (to_context_md->m_origins.find(to) == to_context_md->m_origins.end() || 1131 user_id != LLDB_INVALID_UID) { 1132 to_context_md->m_origins[to] = DeclOrigin(m_source_ctx, from); 1133 } 1134 1135 LLDB_LOG(log, 1136 " [ClangASTImporter] Decl has no origin information in " 1137 "(ASTContext*){0}", 1138 &from->getASTContext()); 1139 } 1140 1141 if (auto *to_namespace = dyn_cast<clang::NamespaceDecl>(to)) { 1142 auto *from_namespace = cast<clang::NamespaceDecl>(from); 1143 1144 NamespaceMetaMap &namespace_maps = from_context_md->m_namespace_maps; 1145 1146 NamespaceMetaMap::iterator namespace_map_iter = 1147 namespace_maps.find(from_namespace); 1148 1149 if (namespace_map_iter != namespace_maps.end()) 1150 to_context_md->m_namespace_maps[to_namespace] = 1151 namespace_map_iter->second; 1152 } 1153 } else { 1154 to_context_md->m_origins[to] = DeclOrigin(m_source_ctx, from); 1155 1156 LLDB_LOG(log, 1157 " [ClangASTImporter] Sourced origin " 1158 "(Decl*){0}/(ASTContext*){1} into (ASTContext*){2}", 1159 from, m_source_ctx, &to->getASTContext()); 1160 } 1161 1162 if (auto *to_tag_decl = dyn_cast<TagDecl>(to)) { 1163 to_tag_decl->setHasExternalLexicalStorage(); 1164 to_tag_decl->getPrimaryContext()->setMustBuildLookupTable(); 1165 auto from_tag_decl = cast<TagDecl>(from); 1166 1167 LLDB_LOG( 1168 log, 1169 " [ClangASTImporter] To is a TagDecl - attributes {0}{1} [{2}->{3}]", 1170 (to_tag_decl->hasExternalLexicalStorage() ? " Lexical" : ""), 1171 (to_tag_decl->hasExternalVisibleStorage() ? " Visible" : ""), 1172 (from_tag_decl->isCompleteDefinition() ? "complete" : "incomplete"), 1173 (to_tag_decl->isCompleteDefinition() ? "complete" : "incomplete")); 1174 } 1175 1176 if (auto *to_namespace_decl = dyn_cast<NamespaceDecl>(to)) { 1177 m_master.BuildNamespaceMap(to_namespace_decl); 1178 to_namespace_decl->setHasExternalVisibleStorage(); 1179 } 1180 1181 if (auto *to_container_decl = dyn_cast<ObjCContainerDecl>(to)) { 1182 to_container_decl->setHasExternalLexicalStorage(); 1183 to_container_decl->setHasExternalVisibleStorage(); 1184 1185 if (log) { 1186 if (ObjCInterfaceDecl *to_interface_decl = 1187 llvm::dyn_cast<ObjCInterfaceDecl>(to_container_decl)) { 1188 LLDB_LOG( 1189 log, 1190 " [ClangASTImporter] To is an ObjCInterfaceDecl - attributes " 1191 "{0}{1}{2}", 1192 (to_interface_decl->hasExternalLexicalStorage() ? " Lexical" : ""), 1193 (to_interface_decl->hasExternalVisibleStorage() ? " Visible" : ""), 1194 (to_interface_decl->hasDefinition() ? " HasDefinition" : "")); 1195 } else { 1196 LLDB_LOG( 1197 log, " [ClangASTImporter] To is an {0}Decl - attributes {1}{2}", 1198 ((Decl *)to_container_decl)->getDeclKindName(), 1199 (to_container_decl->hasExternalLexicalStorage() ? " Lexical" : ""), 1200 (to_container_decl->hasExternalVisibleStorage() ? " Visible" : "")); 1201 } 1202 } 1203 } 1204 1205 if (clang::CXXMethodDecl *to_method = dyn_cast<CXXMethodDecl>(to)) 1206 MaybeCompleteReturnType(m_master, to_method); 1207 } 1208 1209 clang::Decl * 1210 ClangASTImporter::ASTImporterDelegate::GetOriginalDecl(clang::Decl *To) { 1211 return m_master.GetDeclOrigin(To).decl; 1212 } 1213