1 //===- ASTReader.cpp - AST File Reader ------------------------------------===// 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 // This file defines the ASTReader class, which reads AST files. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "ASTCommon.h" 14 #include "ASTReaderInternals.h" 15 #include "clang/AST/ASTConsumer.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/ASTMutationListener.h" 18 #include "clang/AST/ASTStructuralEquivalence.h" 19 #include "clang/AST/ASTUnresolvedSet.h" 20 #include "clang/AST/AbstractTypeReader.h" 21 #include "clang/AST/Decl.h" 22 #include "clang/AST/DeclBase.h" 23 #include "clang/AST/DeclCXX.h" 24 #include "clang/AST/DeclFriend.h" 25 #include "clang/AST/DeclGroup.h" 26 #include "clang/AST/DeclObjC.h" 27 #include "clang/AST/DeclTemplate.h" 28 #include "clang/AST/DeclarationName.h" 29 #include "clang/AST/Expr.h" 30 #include "clang/AST/ExprCXX.h" 31 #include "clang/AST/ExternalASTSource.h" 32 #include "clang/AST/NestedNameSpecifier.h" 33 #include "clang/AST/ODRHash.h" 34 #include "clang/AST/OpenMPClause.h" 35 #include "clang/AST/RawCommentList.h" 36 #include "clang/AST/TemplateBase.h" 37 #include "clang/AST/TemplateName.h" 38 #include "clang/AST/Type.h" 39 #include "clang/AST/TypeLoc.h" 40 #include "clang/AST/TypeLocVisitor.h" 41 #include "clang/AST/UnresolvedSet.h" 42 #include "clang/Basic/CommentOptions.h" 43 #include "clang/Basic/Diagnostic.h" 44 #include "clang/Basic/DiagnosticError.h" 45 #include "clang/Basic/DiagnosticOptions.h" 46 #include "clang/Basic/DiagnosticSema.h" 47 #include "clang/Basic/ExceptionSpecificationType.h" 48 #include "clang/Basic/FileManager.h" 49 #include "clang/Basic/FileSystemOptions.h" 50 #include "clang/Basic/IdentifierTable.h" 51 #include "clang/Basic/LLVM.h" 52 #include "clang/Basic/LangOptions.h" 53 #include "clang/Basic/Module.h" 54 #include "clang/Basic/ObjCRuntime.h" 55 #include "clang/Basic/OpenMPKinds.h" 56 #include "clang/Basic/OperatorKinds.h" 57 #include "clang/Basic/PragmaKinds.h" 58 #include "clang/Basic/Sanitizers.h" 59 #include "clang/Basic/SourceLocation.h" 60 #include "clang/Basic/SourceManager.h" 61 #include "clang/Basic/SourceManagerInternals.h" 62 #include "clang/Basic/Specifiers.h" 63 #include "clang/Basic/TargetInfo.h" 64 #include "clang/Basic/TargetOptions.h" 65 #include "clang/Basic/TokenKinds.h" 66 #include "clang/Basic/Version.h" 67 #include "clang/Lex/HeaderSearch.h" 68 #include "clang/Lex/HeaderSearchOptions.h" 69 #include "clang/Lex/MacroInfo.h" 70 #include "clang/Lex/ModuleMap.h" 71 #include "clang/Lex/PreprocessingRecord.h" 72 #include "clang/Lex/Preprocessor.h" 73 #include "clang/Lex/PreprocessorOptions.h" 74 #include "clang/Lex/Token.h" 75 #include "clang/Sema/ObjCMethodList.h" 76 #include "clang/Sema/Scope.h" 77 #include "clang/Sema/Sema.h" 78 #include "clang/Sema/Weak.h" 79 #include "clang/Serialization/ASTBitCodes.h" 80 #include "clang/Serialization/ASTDeserializationListener.h" 81 #include "clang/Serialization/ASTRecordReader.h" 82 #include "clang/Serialization/ContinuousRangeMap.h" 83 #include "clang/Serialization/GlobalModuleIndex.h" 84 #include "clang/Serialization/InMemoryModuleCache.h" 85 #include "clang/Serialization/ModuleFile.h" 86 #include "clang/Serialization/ModuleFileExtension.h" 87 #include "clang/Serialization/ModuleManager.h" 88 #include "clang/Serialization/PCHContainerOperations.h" 89 #include "clang/Serialization/SerializationDiagnostic.h" 90 #include "llvm/ADT/APFloat.h" 91 #include "llvm/ADT/APInt.h" 92 #include "llvm/ADT/APSInt.h" 93 #include "llvm/ADT/ArrayRef.h" 94 #include "llvm/ADT/DenseMap.h" 95 #include "llvm/ADT/FloatingPointMode.h" 96 #include "llvm/ADT/FoldingSet.h" 97 #include "llvm/ADT/Hashing.h" 98 #include "llvm/ADT/IntrusiveRefCntPtr.h" 99 #include "llvm/ADT/None.h" 100 #include "llvm/ADT/Optional.h" 101 #include "llvm/ADT/STLExtras.h" 102 #include "llvm/ADT/ScopeExit.h" 103 #include "llvm/ADT/SmallPtrSet.h" 104 #include "llvm/ADT/SmallString.h" 105 #include "llvm/ADT/SmallVector.h" 106 #include "llvm/ADT/StringExtras.h" 107 #include "llvm/ADT/StringMap.h" 108 #include "llvm/ADT/StringRef.h" 109 #include "llvm/ADT/Triple.h" 110 #include "llvm/ADT/iterator_range.h" 111 #include "llvm/Bitstream/BitstreamReader.h" 112 #include "llvm/Support/Casting.h" 113 #include "llvm/Support/Compiler.h" 114 #include "llvm/Support/Compression.h" 115 #include "llvm/Support/DJB.h" 116 #include "llvm/Support/Endian.h" 117 #include "llvm/Support/Error.h" 118 #include "llvm/Support/ErrorHandling.h" 119 #include "llvm/Support/FileSystem.h" 120 #include "llvm/Support/LEB128.h" 121 #include "llvm/Support/MemoryBuffer.h" 122 #include "llvm/Support/Path.h" 123 #include "llvm/Support/SaveAndRestore.h" 124 #include "llvm/Support/Timer.h" 125 #include "llvm/Support/VersionTuple.h" 126 #include "llvm/Support/raw_ostream.h" 127 #include <algorithm> 128 #include <cassert> 129 #include <cstddef> 130 #include <cstdint> 131 #include <cstdio> 132 #include <ctime> 133 #include <iterator> 134 #include <limits> 135 #include <map> 136 #include <memory> 137 #include <string> 138 #include <system_error> 139 #include <tuple> 140 #include <utility> 141 #include <vector> 142 143 using namespace clang; 144 using namespace clang::serialization; 145 using namespace clang::serialization::reader; 146 using llvm::BitstreamCursor; 147 148 //===----------------------------------------------------------------------===// 149 // ChainedASTReaderListener implementation 150 //===----------------------------------------------------------------------===// 151 152 bool 153 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 154 return First->ReadFullVersionInformation(FullVersion) || 155 Second->ReadFullVersionInformation(FullVersion); 156 } 157 158 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 159 First->ReadModuleName(ModuleName); 160 Second->ReadModuleName(ModuleName); 161 } 162 163 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 164 First->ReadModuleMapFile(ModuleMapPath); 165 Second->ReadModuleMapFile(ModuleMapPath); 166 } 167 168 bool 169 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 170 bool Complain, 171 bool AllowCompatibleDifferences) { 172 return First->ReadLanguageOptions(LangOpts, Complain, 173 AllowCompatibleDifferences) || 174 Second->ReadLanguageOptions(LangOpts, Complain, 175 AllowCompatibleDifferences); 176 } 177 178 bool ChainedASTReaderListener::ReadTargetOptions( 179 const TargetOptions &TargetOpts, bool Complain, 180 bool AllowCompatibleDifferences) { 181 return First->ReadTargetOptions(TargetOpts, Complain, 182 AllowCompatibleDifferences) || 183 Second->ReadTargetOptions(TargetOpts, Complain, 184 AllowCompatibleDifferences); 185 } 186 187 bool ChainedASTReaderListener::ReadDiagnosticOptions( 188 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 189 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 190 Second->ReadDiagnosticOptions(DiagOpts, Complain); 191 } 192 193 bool 194 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 195 bool Complain) { 196 return First->ReadFileSystemOptions(FSOpts, Complain) || 197 Second->ReadFileSystemOptions(FSOpts, Complain); 198 } 199 200 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 201 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 202 bool Complain) { 203 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 204 Complain) || 205 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 206 Complain); 207 } 208 209 bool ChainedASTReaderListener::ReadPreprocessorOptions( 210 const PreprocessorOptions &PPOpts, bool Complain, 211 std::string &SuggestedPredefines) { 212 return First->ReadPreprocessorOptions(PPOpts, Complain, 213 SuggestedPredefines) || 214 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 215 } 216 217 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 218 unsigned Value) { 219 First->ReadCounter(M, Value); 220 Second->ReadCounter(M, Value); 221 } 222 223 bool ChainedASTReaderListener::needsInputFileVisitation() { 224 return First->needsInputFileVisitation() || 225 Second->needsInputFileVisitation(); 226 } 227 228 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 229 return First->needsSystemInputFileVisitation() || 230 Second->needsSystemInputFileVisitation(); 231 } 232 233 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 234 ModuleKind Kind) { 235 First->visitModuleFile(Filename, Kind); 236 Second->visitModuleFile(Filename, Kind); 237 } 238 239 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 240 bool isSystem, 241 bool isOverridden, 242 bool isExplicitModule) { 243 bool Continue = false; 244 if (First->needsInputFileVisitation() && 245 (!isSystem || First->needsSystemInputFileVisitation())) 246 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 247 isExplicitModule); 248 if (Second->needsInputFileVisitation() && 249 (!isSystem || Second->needsSystemInputFileVisitation())) 250 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 251 isExplicitModule); 252 return Continue; 253 } 254 255 void ChainedASTReaderListener::readModuleFileExtension( 256 const ModuleFileExtensionMetadata &Metadata) { 257 First->readModuleFileExtension(Metadata); 258 Second->readModuleFileExtension(Metadata); 259 } 260 261 //===----------------------------------------------------------------------===// 262 // PCH validator implementation 263 //===----------------------------------------------------------------------===// 264 265 ASTReaderListener::~ASTReaderListener() = default; 266 267 /// Compare the given set of language options against an existing set of 268 /// language options. 269 /// 270 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 271 /// \param AllowCompatibleDifferences If true, differences between compatible 272 /// language options will be permitted. 273 /// 274 /// \returns true if the languagae options mis-match, false otherwise. 275 static bool checkLanguageOptions(const LangOptions &LangOpts, 276 const LangOptions &ExistingLangOpts, 277 DiagnosticsEngine *Diags, 278 bool AllowCompatibleDifferences = true) { 279 #define LANGOPT(Name, Bits, Default, Description) \ 280 if (ExistingLangOpts.Name != LangOpts.Name) { \ 281 if (Diags) \ 282 Diags->Report(diag::err_pch_langopt_mismatch) \ 283 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 284 return true; \ 285 } 286 287 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 288 if (ExistingLangOpts.Name != LangOpts.Name) { \ 289 if (Diags) \ 290 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 291 << Description; \ 292 return true; \ 293 } 294 295 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 296 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 297 if (Diags) \ 298 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 299 << Description; \ 300 return true; \ 301 } 302 303 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 304 if (!AllowCompatibleDifferences) \ 305 LANGOPT(Name, Bits, Default, Description) 306 307 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 308 if (!AllowCompatibleDifferences) \ 309 ENUM_LANGOPT(Name, Bits, Default, Description) 310 311 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 312 if (!AllowCompatibleDifferences) \ 313 VALUE_LANGOPT(Name, Bits, Default, Description) 314 315 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 316 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 317 #define BENIGN_VALUE_LANGOPT(Name, Bits, Default, Description) 318 #include "clang/Basic/LangOptions.def" 319 320 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 321 if (Diags) 322 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 323 return true; 324 } 325 326 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 327 if (Diags) 328 Diags->Report(diag::err_pch_langopt_value_mismatch) 329 << "target Objective-C runtime"; 330 return true; 331 } 332 333 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 334 LangOpts.CommentOpts.BlockCommandNames) { 335 if (Diags) 336 Diags->Report(diag::err_pch_langopt_value_mismatch) 337 << "block command names"; 338 return true; 339 } 340 341 // Sanitizer feature mismatches are treated as compatible differences. If 342 // compatible differences aren't allowed, we still only want to check for 343 // mismatches of non-modular sanitizers (the only ones which can affect AST 344 // generation). 345 if (!AllowCompatibleDifferences) { 346 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 347 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 348 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 349 ExistingSanitizers.clear(ModularSanitizers); 350 ImportedSanitizers.clear(ModularSanitizers); 351 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 352 const std::string Flag = "-fsanitize="; 353 if (Diags) { 354 #define SANITIZER(NAME, ID) \ 355 { \ 356 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 357 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 358 if (InExistingModule != InImportedModule) \ 359 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 360 << InExistingModule << (Flag + NAME); \ 361 } 362 #include "clang/Basic/Sanitizers.def" 363 } 364 return true; 365 } 366 } 367 368 return false; 369 } 370 371 /// Compare the given set of target options against an existing set of 372 /// target options. 373 /// 374 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 375 /// 376 /// \returns true if the target options mis-match, false otherwise. 377 static bool checkTargetOptions(const TargetOptions &TargetOpts, 378 const TargetOptions &ExistingTargetOpts, 379 DiagnosticsEngine *Diags, 380 bool AllowCompatibleDifferences = true) { 381 #define CHECK_TARGET_OPT(Field, Name) \ 382 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 383 if (Diags) \ 384 Diags->Report(diag::err_pch_targetopt_mismatch) \ 385 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 386 return true; \ 387 } 388 389 // The triple and ABI must match exactly. 390 CHECK_TARGET_OPT(Triple, "target"); 391 CHECK_TARGET_OPT(ABI, "target ABI"); 392 393 // We can tolerate different CPUs in many cases, notably when one CPU 394 // supports a strict superset of another. When allowing compatible 395 // differences skip this check. 396 if (!AllowCompatibleDifferences) { 397 CHECK_TARGET_OPT(CPU, "target CPU"); 398 CHECK_TARGET_OPT(TuneCPU, "tune CPU"); 399 } 400 401 #undef CHECK_TARGET_OPT 402 403 // Compare feature sets. 404 SmallVector<StringRef, 4> ExistingFeatures( 405 ExistingTargetOpts.FeaturesAsWritten.begin(), 406 ExistingTargetOpts.FeaturesAsWritten.end()); 407 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 408 TargetOpts.FeaturesAsWritten.end()); 409 llvm::sort(ExistingFeatures); 410 llvm::sort(ReadFeatures); 411 412 // We compute the set difference in both directions explicitly so that we can 413 // diagnose the differences differently. 414 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 415 std::set_difference( 416 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 417 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 418 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 419 ExistingFeatures.begin(), ExistingFeatures.end(), 420 std::back_inserter(UnmatchedReadFeatures)); 421 422 // If we are allowing compatible differences and the read feature set is 423 // a strict subset of the existing feature set, there is nothing to diagnose. 424 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 425 return false; 426 427 if (Diags) { 428 for (StringRef Feature : UnmatchedReadFeatures) 429 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 430 << /* is-existing-feature */ false << Feature; 431 for (StringRef Feature : UnmatchedExistingFeatures) 432 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 433 << /* is-existing-feature */ true << Feature; 434 } 435 436 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 437 } 438 439 bool 440 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 441 bool Complain, 442 bool AllowCompatibleDifferences) { 443 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 444 return checkLanguageOptions(LangOpts, ExistingLangOpts, 445 Complain ? &Reader.Diags : nullptr, 446 AllowCompatibleDifferences); 447 } 448 449 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 450 bool Complain, 451 bool AllowCompatibleDifferences) { 452 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 453 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 454 Complain ? &Reader.Diags : nullptr, 455 AllowCompatibleDifferences); 456 } 457 458 namespace { 459 460 using MacroDefinitionsMap = 461 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 462 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 463 464 } // namespace 465 466 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 467 DiagnosticsEngine &Diags, 468 bool Complain) { 469 using Level = DiagnosticsEngine::Level; 470 471 // Check current mappings for new -Werror mappings, and the stored mappings 472 // for cases that were explicitly mapped to *not* be errors that are now 473 // errors because of options like -Werror. 474 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 475 476 for (DiagnosticsEngine *MappingSource : MappingSources) { 477 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 478 diag::kind DiagID = DiagIDMappingPair.first; 479 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 480 if (CurLevel < DiagnosticsEngine::Error) 481 continue; // not significant 482 Level StoredLevel = 483 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 484 if (StoredLevel < DiagnosticsEngine::Error) { 485 if (Complain) 486 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 487 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 488 return true; 489 } 490 } 491 } 492 493 return false; 494 } 495 496 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 497 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 498 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 499 return true; 500 return Ext >= diag::Severity::Error; 501 } 502 503 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 504 DiagnosticsEngine &Diags, 505 bool IsSystem, bool Complain) { 506 // Top-level options 507 if (IsSystem) { 508 if (Diags.getSuppressSystemWarnings()) 509 return false; 510 // If -Wsystem-headers was not enabled before, be conservative 511 if (StoredDiags.getSuppressSystemWarnings()) { 512 if (Complain) 513 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 514 return true; 515 } 516 } 517 518 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 519 if (Complain) 520 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 521 return true; 522 } 523 524 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 525 !StoredDiags.getEnableAllWarnings()) { 526 if (Complain) 527 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 528 return true; 529 } 530 531 if (isExtHandlingFromDiagsError(Diags) && 532 !isExtHandlingFromDiagsError(StoredDiags)) { 533 if (Complain) 534 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 535 return true; 536 } 537 538 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 539 } 540 541 /// Return the top import module if it is implicit, nullptr otherwise. 542 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 543 Preprocessor &PP) { 544 // If the original import came from a file explicitly generated by the user, 545 // don't check the diagnostic mappings. 546 // FIXME: currently this is approximated by checking whether this is not a 547 // module import of an implicitly-loaded module file. 548 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 549 // the transitive closure of its imports, since unrelated modules cannot be 550 // imported until after this module finishes validation. 551 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 552 while (!TopImport->ImportedBy.empty()) 553 TopImport = TopImport->ImportedBy[0]; 554 if (TopImport->Kind != MK_ImplicitModule) 555 return nullptr; 556 557 StringRef ModuleName = TopImport->ModuleName; 558 assert(!ModuleName.empty() && "diagnostic options read before module name"); 559 560 Module *M = 561 PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc); 562 assert(M && "missing module"); 563 return M; 564 } 565 566 bool PCHValidator::ReadDiagnosticOptions( 567 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 568 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 569 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 570 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 571 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 572 // This should never fail, because we would have processed these options 573 // before writing them to an ASTFile. 574 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 575 576 ModuleManager &ModuleMgr = Reader.getModuleManager(); 577 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 578 579 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 580 if (!TopM) 581 return false; 582 583 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 584 // contains the union of their flags. 585 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 586 Complain); 587 } 588 589 /// Collect the macro definitions provided by the given preprocessor 590 /// options. 591 static void 592 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 593 MacroDefinitionsMap &Macros, 594 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 595 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 596 StringRef Macro = PPOpts.Macros[I].first; 597 bool IsUndef = PPOpts.Macros[I].second; 598 599 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 600 StringRef MacroName = MacroPair.first; 601 StringRef MacroBody = MacroPair.second; 602 603 // For an #undef'd macro, we only care about the name. 604 if (IsUndef) { 605 if (MacroNames && !Macros.count(MacroName)) 606 MacroNames->push_back(MacroName); 607 608 Macros[MacroName] = std::make_pair("", true); 609 continue; 610 } 611 612 // For a #define'd macro, figure out the actual definition. 613 if (MacroName.size() == Macro.size()) 614 MacroBody = "1"; 615 else { 616 // Note: GCC drops anything following an end-of-line character. 617 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 618 MacroBody = MacroBody.substr(0, End); 619 } 620 621 if (MacroNames && !Macros.count(MacroName)) 622 MacroNames->push_back(MacroName); 623 Macros[MacroName] = std::make_pair(MacroBody, false); 624 } 625 } 626 627 /// Check the preprocessor options deserialized from the control block 628 /// against the preprocessor options in an existing preprocessor. 629 /// 630 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 631 /// \param Validate If true, validate preprocessor options. If false, allow 632 /// macros defined by \p ExistingPPOpts to override those defined by 633 /// \p PPOpts in SuggestedPredefines. 634 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 635 const PreprocessorOptions &ExistingPPOpts, 636 DiagnosticsEngine *Diags, 637 FileManager &FileMgr, 638 std::string &SuggestedPredefines, 639 const LangOptions &LangOpts, 640 bool Validate = true) { 641 // Check macro definitions. 642 MacroDefinitionsMap ASTFileMacros; 643 collectMacroDefinitions(PPOpts, ASTFileMacros); 644 MacroDefinitionsMap ExistingMacros; 645 SmallVector<StringRef, 4> ExistingMacroNames; 646 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 647 648 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 649 // Dig out the macro definition in the existing preprocessor options. 650 StringRef MacroName = ExistingMacroNames[I]; 651 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 652 653 // Check whether we know anything about this macro name or not. 654 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 655 ASTFileMacros.find(MacroName); 656 if (!Validate || Known == ASTFileMacros.end()) { 657 // FIXME: Check whether this identifier was referenced anywhere in the 658 // AST file. If so, we should reject the AST file. Unfortunately, this 659 // information isn't in the control block. What shall we do about it? 660 661 if (Existing.second) { 662 SuggestedPredefines += "#undef "; 663 SuggestedPredefines += MacroName.str(); 664 SuggestedPredefines += '\n'; 665 } else { 666 SuggestedPredefines += "#define "; 667 SuggestedPredefines += MacroName.str(); 668 SuggestedPredefines += ' '; 669 SuggestedPredefines += Existing.first.str(); 670 SuggestedPredefines += '\n'; 671 } 672 continue; 673 } 674 675 // If the macro was defined in one but undef'd in the other, we have a 676 // conflict. 677 if (Existing.second != Known->second.second) { 678 if (Diags) { 679 Diags->Report(diag::err_pch_macro_def_undef) 680 << MacroName << Known->second.second; 681 } 682 return true; 683 } 684 685 // If the macro was #undef'd in both, or if the macro bodies are identical, 686 // it's fine. 687 if (Existing.second || Existing.first == Known->second.first) 688 continue; 689 690 // The macro bodies differ; complain. 691 if (Diags) { 692 Diags->Report(diag::err_pch_macro_def_conflict) 693 << MacroName << Known->second.first << Existing.first; 694 } 695 return true; 696 } 697 698 // Check whether we're using predefines. 699 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 700 if (Diags) { 701 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 702 } 703 return true; 704 } 705 706 // Detailed record is important since it is used for the module cache hash. 707 if (LangOpts.Modules && 708 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 709 if (Diags) { 710 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 711 } 712 return true; 713 } 714 715 // Compute the #include and #include_macros lines we need. 716 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 717 StringRef File = ExistingPPOpts.Includes[I]; 718 719 if (!ExistingPPOpts.ImplicitPCHInclude.empty() && 720 !ExistingPPOpts.PCHThroughHeader.empty()) { 721 // In case the through header is an include, we must add all the includes 722 // to the predefines so the start point can be determined. 723 SuggestedPredefines += "#include \""; 724 SuggestedPredefines += File; 725 SuggestedPredefines += "\"\n"; 726 continue; 727 } 728 729 if (File == ExistingPPOpts.ImplicitPCHInclude) 730 continue; 731 732 if (llvm::is_contained(PPOpts.Includes, File)) 733 continue; 734 735 SuggestedPredefines += "#include \""; 736 SuggestedPredefines += File; 737 SuggestedPredefines += "\"\n"; 738 } 739 740 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 741 StringRef File = ExistingPPOpts.MacroIncludes[I]; 742 if (llvm::is_contained(PPOpts.MacroIncludes, File)) 743 continue; 744 745 SuggestedPredefines += "#__include_macros \""; 746 SuggestedPredefines += File; 747 SuggestedPredefines += "\"\n##\n"; 748 } 749 750 return false; 751 } 752 753 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 754 bool Complain, 755 std::string &SuggestedPredefines) { 756 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 757 758 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 759 Complain? &Reader.Diags : nullptr, 760 PP.getFileManager(), 761 SuggestedPredefines, 762 PP.getLangOpts()); 763 } 764 765 bool SimpleASTReaderListener::ReadPreprocessorOptions( 766 const PreprocessorOptions &PPOpts, 767 bool Complain, 768 std::string &SuggestedPredefines) { 769 return checkPreprocessorOptions(PPOpts, 770 PP.getPreprocessorOpts(), 771 nullptr, 772 PP.getFileManager(), 773 SuggestedPredefines, 774 PP.getLangOpts(), 775 false); 776 } 777 778 /// Check the header search options deserialized from the control block 779 /// against the header search options in an existing preprocessor. 780 /// 781 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 782 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 783 StringRef SpecificModuleCachePath, 784 StringRef ExistingModuleCachePath, 785 DiagnosticsEngine *Diags, 786 const LangOptions &LangOpts, 787 const PreprocessorOptions &PPOpts) { 788 if (LangOpts.Modules) { 789 if (SpecificModuleCachePath != ExistingModuleCachePath && 790 !PPOpts.AllowPCHWithDifferentModulesCachePath) { 791 if (Diags) 792 Diags->Report(diag::err_pch_modulecache_mismatch) 793 << SpecificModuleCachePath << ExistingModuleCachePath; 794 return true; 795 } 796 } 797 798 return false; 799 } 800 801 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 802 StringRef SpecificModuleCachePath, 803 bool Complain) { 804 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 805 PP.getHeaderSearchInfo().getModuleCachePath(), 806 Complain ? &Reader.Diags : nullptr, 807 PP.getLangOpts(), PP.getPreprocessorOpts()); 808 } 809 810 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 811 PP.setCounterValue(Value); 812 } 813 814 //===----------------------------------------------------------------------===// 815 // AST reader implementation 816 //===----------------------------------------------------------------------===// 817 818 static uint64_t readULEB(const unsigned char *&P) { 819 unsigned Length = 0; 820 const char *Error = nullptr; 821 822 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error); 823 if (Error) 824 llvm::report_fatal_error(Error); 825 P += Length; 826 return Val; 827 } 828 829 /// Read ULEB-encoded key length and data length. 830 static std::pair<unsigned, unsigned> 831 readULEBKeyDataLength(const unsigned char *&P) { 832 unsigned KeyLen = readULEB(P); 833 if ((unsigned)KeyLen != KeyLen) 834 llvm::report_fatal_error("key too large"); 835 836 unsigned DataLen = readULEB(P); 837 if ((unsigned)DataLen != DataLen) 838 llvm::report_fatal_error("data too large"); 839 840 return std::make_pair(KeyLen, DataLen); 841 } 842 843 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 844 bool TakeOwnership) { 845 DeserializationListener = Listener; 846 OwnsDeserializationListener = TakeOwnership; 847 } 848 849 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 850 return serialization::ComputeHash(Sel); 851 } 852 853 std::pair<unsigned, unsigned> 854 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 855 return readULEBKeyDataLength(d); 856 } 857 858 ASTSelectorLookupTrait::internal_key_type 859 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 860 using namespace llvm::support; 861 862 SelectorTable &SelTable = Reader.getContext().Selectors; 863 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 864 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 865 F, endian::readNext<uint32_t, little, unaligned>(d)); 866 if (N == 0) 867 return SelTable.getNullarySelector(FirstII); 868 else if (N == 1) 869 return SelTable.getUnarySelector(FirstII); 870 871 SmallVector<IdentifierInfo *, 16> Args; 872 Args.push_back(FirstII); 873 for (unsigned I = 1; I != N; ++I) 874 Args.push_back(Reader.getLocalIdentifier( 875 F, endian::readNext<uint32_t, little, unaligned>(d))); 876 877 return SelTable.getSelector(N, Args.data()); 878 } 879 880 ASTSelectorLookupTrait::data_type 881 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 882 unsigned DataLen) { 883 using namespace llvm::support; 884 885 data_type Result; 886 887 Result.ID = Reader.getGlobalSelectorID( 888 F, endian::readNext<uint32_t, little, unaligned>(d)); 889 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 890 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 891 Result.InstanceBits = FullInstanceBits & 0x3; 892 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 893 Result.FactoryBits = FullFactoryBits & 0x3; 894 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 895 unsigned NumInstanceMethods = FullInstanceBits >> 3; 896 unsigned NumFactoryMethods = FullFactoryBits >> 3; 897 898 // Load instance methods 899 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 900 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 901 F, endian::readNext<uint32_t, little, unaligned>(d))) 902 Result.Instance.push_back(Method); 903 } 904 905 // Load factory methods 906 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 907 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 908 F, endian::readNext<uint32_t, little, unaligned>(d))) 909 Result.Factory.push_back(Method); 910 } 911 912 return Result; 913 } 914 915 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 916 return llvm::djbHash(a); 917 } 918 919 std::pair<unsigned, unsigned> 920 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 921 return readULEBKeyDataLength(d); 922 } 923 924 ASTIdentifierLookupTraitBase::internal_key_type 925 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 926 assert(n >= 2 && d[n-1] == '\0'); 927 return StringRef((const char*) d, n-1); 928 } 929 930 /// Whether the given identifier is "interesting". 931 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 932 bool IsModule) { 933 return II.hadMacroDefinition() || II.isPoisoned() || 934 (!IsModule && II.getObjCOrBuiltinID()) || 935 II.hasRevertedTokenIDToIdentifier() || 936 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 937 II.getFETokenInfo()); 938 } 939 940 static bool readBit(unsigned &Bits) { 941 bool Value = Bits & 0x1; 942 Bits >>= 1; 943 return Value; 944 } 945 946 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 947 using namespace llvm::support; 948 949 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 950 return Reader.getGlobalIdentifierID(F, RawID >> 1); 951 } 952 953 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 954 if (!II.isFromAST()) { 955 II.setIsFromAST(); 956 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 957 if (isInterestingIdentifier(Reader, II, IsModule)) 958 II.setChangedSinceDeserialization(); 959 } 960 } 961 962 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 963 const unsigned char* d, 964 unsigned DataLen) { 965 using namespace llvm::support; 966 967 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 968 bool IsInteresting = RawID & 0x01; 969 970 // Wipe out the "is interesting" bit. 971 RawID = RawID >> 1; 972 973 // Build the IdentifierInfo and link the identifier ID with it. 974 IdentifierInfo *II = KnownII; 975 if (!II) { 976 II = &Reader.getIdentifierTable().getOwn(k); 977 KnownII = II; 978 } 979 markIdentifierFromAST(Reader, *II); 980 Reader.markIdentifierUpToDate(II); 981 982 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 983 if (!IsInteresting) { 984 // For uninteresting identifiers, there's nothing else to do. Just notify 985 // the reader that we've finished loading this identifier. 986 Reader.SetIdentifierInfo(ID, II); 987 return II; 988 } 989 990 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 991 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 992 bool CPlusPlusOperatorKeyword = readBit(Bits); 993 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 994 bool Poisoned = readBit(Bits); 995 bool ExtensionToken = readBit(Bits); 996 bool HadMacroDefinition = readBit(Bits); 997 998 assert(Bits == 0 && "Extra bits in the identifier?"); 999 DataLen -= 8; 1000 1001 // Set or check the various bits in the IdentifierInfo structure. 1002 // Token IDs are read-only. 1003 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 1004 II->revertTokenIDToIdentifier(); 1005 if (!F.isModule()) 1006 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 1007 assert(II->isExtensionToken() == ExtensionToken && 1008 "Incorrect extension token flag"); 1009 (void)ExtensionToken; 1010 if (Poisoned) 1011 II->setIsPoisoned(true); 1012 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 1013 "Incorrect C++ operator keyword flag"); 1014 (void)CPlusPlusOperatorKeyword; 1015 1016 // If this identifier is a macro, deserialize the macro 1017 // definition. 1018 if (HadMacroDefinition) { 1019 uint32_t MacroDirectivesOffset = 1020 endian::readNext<uint32_t, little, unaligned>(d); 1021 DataLen -= 4; 1022 1023 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 1024 } 1025 1026 Reader.SetIdentifierInfo(ID, II); 1027 1028 // Read all of the declarations visible at global scope with this 1029 // name. 1030 if (DataLen > 0) { 1031 SmallVector<uint32_t, 4> DeclIDs; 1032 for (; DataLen > 0; DataLen -= 4) 1033 DeclIDs.push_back(Reader.getGlobalDeclID( 1034 F, endian::readNext<uint32_t, little, unaligned>(d))); 1035 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1036 } 1037 1038 return II; 1039 } 1040 1041 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1042 : Kind(Name.getNameKind()) { 1043 switch (Kind) { 1044 case DeclarationName::Identifier: 1045 Data = (uint64_t)Name.getAsIdentifierInfo(); 1046 break; 1047 case DeclarationName::ObjCZeroArgSelector: 1048 case DeclarationName::ObjCOneArgSelector: 1049 case DeclarationName::ObjCMultiArgSelector: 1050 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1051 break; 1052 case DeclarationName::CXXOperatorName: 1053 Data = Name.getCXXOverloadedOperator(); 1054 break; 1055 case DeclarationName::CXXLiteralOperatorName: 1056 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1057 break; 1058 case DeclarationName::CXXDeductionGuideName: 1059 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1060 ->getDeclName().getAsIdentifierInfo(); 1061 break; 1062 case DeclarationName::CXXConstructorName: 1063 case DeclarationName::CXXDestructorName: 1064 case DeclarationName::CXXConversionFunctionName: 1065 case DeclarationName::CXXUsingDirective: 1066 Data = 0; 1067 break; 1068 } 1069 } 1070 1071 unsigned DeclarationNameKey::getHash() const { 1072 llvm::FoldingSetNodeID ID; 1073 ID.AddInteger(Kind); 1074 1075 switch (Kind) { 1076 case DeclarationName::Identifier: 1077 case DeclarationName::CXXLiteralOperatorName: 1078 case DeclarationName::CXXDeductionGuideName: 1079 ID.AddString(((IdentifierInfo*)Data)->getName()); 1080 break; 1081 case DeclarationName::ObjCZeroArgSelector: 1082 case DeclarationName::ObjCOneArgSelector: 1083 case DeclarationName::ObjCMultiArgSelector: 1084 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1085 break; 1086 case DeclarationName::CXXOperatorName: 1087 ID.AddInteger((OverloadedOperatorKind)Data); 1088 break; 1089 case DeclarationName::CXXConstructorName: 1090 case DeclarationName::CXXDestructorName: 1091 case DeclarationName::CXXConversionFunctionName: 1092 case DeclarationName::CXXUsingDirective: 1093 break; 1094 } 1095 1096 return ID.ComputeHash(); 1097 } 1098 1099 ModuleFile * 1100 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1101 using namespace llvm::support; 1102 1103 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1104 return Reader.getLocalModuleFile(F, ModuleFileID); 1105 } 1106 1107 std::pair<unsigned, unsigned> 1108 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1109 return readULEBKeyDataLength(d); 1110 } 1111 1112 ASTDeclContextNameLookupTrait::internal_key_type 1113 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1114 using namespace llvm::support; 1115 1116 auto Kind = (DeclarationName::NameKind)*d++; 1117 uint64_t Data; 1118 switch (Kind) { 1119 case DeclarationName::Identifier: 1120 case DeclarationName::CXXLiteralOperatorName: 1121 case DeclarationName::CXXDeductionGuideName: 1122 Data = (uint64_t)Reader.getLocalIdentifier( 1123 F, endian::readNext<uint32_t, little, unaligned>(d)); 1124 break; 1125 case DeclarationName::ObjCZeroArgSelector: 1126 case DeclarationName::ObjCOneArgSelector: 1127 case DeclarationName::ObjCMultiArgSelector: 1128 Data = 1129 (uint64_t)Reader.getLocalSelector( 1130 F, endian::readNext<uint32_t, little, unaligned>( 1131 d)).getAsOpaquePtr(); 1132 break; 1133 case DeclarationName::CXXOperatorName: 1134 Data = *d++; // OverloadedOperatorKind 1135 break; 1136 case DeclarationName::CXXConstructorName: 1137 case DeclarationName::CXXDestructorName: 1138 case DeclarationName::CXXConversionFunctionName: 1139 case DeclarationName::CXXUsingDirective: 1140 Data = 0; 1141 break; 1142 } 1143 1144 return DeclarationNameKey(Kind, Data); 1145 } 1146 1147 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1148 const unsigned char *d, 1149 unsigned DataLen, 1150 data_type_builder &Val) { 1151 using namespace llvm::support; 1152 1153 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1154 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1155 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1156 } 1157 } 1158 1159 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1160 BitstreamCursor &Cursor, 1161 uint64_t Offset, 1162 DeclContext *DC) { 1163 assert(Offset != 0); 1164 1165 SavedStreamPosition SavedPosition(Cursor); 1166 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1167 Error(std::move(Err)); 1168 return true; 1169 } 1170 1171 RecordData Record; 1172 StringRef Blob; 1173 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1174 if (!MaybeCode) { 1175 Error(MaybeCode.takeError()); 1176 return true; 1177 } 1178 unsigned Code = MaybeCode.get(); 1179 1180 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1181 if (!MaybeRecCode) { 1182 Error(MaybeRecCode.takeError()); 1183 return true; 1184 } 1185 unsigned RecCode = MaybeRecCode.get(); 1186 if (RecCode != DECL_CONTEXT_LEXICAL) { 1187 Error("Expected lexical block"); 1188 return true; 1189 } 1190 1191 assert(!isa<TranslationUnitDecl>(DC) && 1192 "expected a TU_UPDATE_LEXICAL record for TU"); 1193 // If we are handling a C++ class template instantiation, we can see multiple 1194 // lexical updates for the same record. It's important that we select only one 1195 // of them, so that field numbering works properly. Just pick the first one we 1196 // see. 1197 auto &Lex = LexicalDecls[DC]; 1198 if (!Lex.first) { 1199 Lex = std::make_pair( 1200 &M, llvm::makeArrayRef( 1201 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1202 Blob.data()), 1203 Blob.size() / 4)); 1204 } 1205 DC->setHasExternalLexicalStorage(true); 1206 return false; 1207 } 1208 1209 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1210 BitstreamCursor &Cursor, 1211 uint64_t Offset, 1212 DeclID ID) { 1213 assert(Offset != 0); 1214 1215 SavedStreamPosition SavedPosition(Cursor); 1216 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1217 Error(std::move(Err)); 1218 return true; 1219 } 1220 1221 RecordData Record; 1222 StringRef Blob; 1223 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1224 if (!MaybeCode) { 1225 Error(MaybeCode.takeError()); 1226 return true; 1227 } 1228 unsigned Code = MaybeCode.get(); 1229 1230 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1231 if (!MaybeRecCode) { 1232 Error(MaybeRecCode.takeError()); 1233 return true; 1234 } 1235 unsigned RecCode = MaybeRecCode.get(); 1236 if (RecCode != DECL_CONTEXT_VISIBLE) { 1237 Error("Expected visible lookup table block"); 1238 return true; 1239 } 1240 1241 // We can't safely determine the primary context yet, so delay attaching the 1242 // lookup table until we're done with recursive deserialization. 1243 auto *Data = (const unsigned char*)Blob.data(); 1244 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1245 return false; 1246 } 1247 1248 void ASTReader::Error(StringRef Msg) const { 1249 Error(diag::err_fe_pch_malformed, Msg); 1250 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1251 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1252 Diag(diag::note_module_cache_path) 1253 << PP.getHeaderSearchInfo().getModuleCachePath(); 1254 } 1255 } 1256 1257 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1258 StringRef Arg3) const { 1259 if (Diags.isDiagnosticInFlight()) 1260 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3); 1261 else 1262 Diag(DiagID) << Arg1 << Arg2 << Arg3; 1263 } 1264 1265 void ASTReader::Error(llvm::Error &&Err) const { 1266 llvm::Error RemainingErr = 1267 handleErrors(std::move(Err), [this](const DiagnosticError &E) { 1268 auto Diag = E.getDiagnostic().second; 1269 1270 // Ideally we'd just emit it, but have to handle a possible in-flight 1271 // diagnostic. Note that the location is currently ignored as well. 1272 auto NumArgs = Diag.getStorage()->NumDiagArgs; 1273 assert(NumArgs <= 3 && "Can only have up to 3 arguments"); 1274 StringRef Arg1, Arg2, Arg3; 1275 switch (NumArgs) { 1276 case 3: 1277 Arg3 = Diag.getStringArg(2); 1278 LLVM_FALLTHROUGH; 1279 case 2: 1280 Arg2 = Diag.getStringArg(1); 1281 LLVM_FALLTHROUGH; 1282 case 1: 1283 Arg1 = Diag.getStringArg(0); 1284 } 1285 Error(Diag.getDiagID(), Arg1, Arg2, Arg3); 1286 }); 1287 if (RemainingErr) 1288 Error(toString(std::move(RemainingErr))); 1289 } 1290 1291 //===----------------------------------------------------------------------===// 1292 // Source Manager Deserialization 1293 //===----------------------------------------------------------------------===// 1294 1295 /// Read the line table in the source manager block. 1296 void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) { 1297 unsigned Idx = 0; 1298 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1299 1300 // Parse the file names 1301 std::map<int, int> FileIDs; 1302 FileIDs[-1] = -1; // For unspecified filenames. 1303 for (unsigned I = 0; Record[Idx]; ++I) { 1304 // Extract the file name 1305 auto Filename = ReadPath(F, Record, Idx); 1306 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1307 } 1308 ++Idx; 1309 1310 // Parse the line entries 1311 std::vector<LineEntry> Entries; 1312 while (Idx < Record.size()) { 1313 int FID = Record[Idx++]; 1314 assert(FID >= 0 && "Serialized line entries for non-local file."); 1315 // Remap FileID from 1-based old view. 1316 FID += F.SLocEntryBaseID - 1; 1317 1318 // Extract the line entries 1319 unsigned NumEntries = Record[Idx++]; 1320 assert(NumEntries && "no line entries for file ID"); 1321 Entries.clear(); 1322 Entries.reserve(NumEntries); 1323 for (unsigned I = 0; I != NumEntries; ++I) { 1324 unsigned FileOffset = Record[Idx++]; 1325 unsigned LineNo = Record[Idx++]; 1326 int FilenameID = FileIDs[Record[Idx++]]; 1327 SrcMgr::CharacteristicKind FileKind 1328 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1329 unsigned IncludeOffset = Record[Idx++]; 1330 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1331 FileKind, IncludeOffset)); 1332 } 1333 LineTable.AddEntry(FileID::get(FID), Entries); 1334 } 1335 } 1336 1337 /// Read a source manager block 1338 llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1339 using namespace SrcMgr; 1340 1341 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1342 1343 // Set the source-location entry cursor to the current position in 1344 // the stream. This cursor will be used to read the contents of the 1345 // source manager block initially, and then lazily read 1346 // source-location entries as needed. 1347 SLocEntryCursor = F.Stream; 1348 1349 // The stream itself is going to skip over the source manager block. 1350 if (llvm::Error Err = F.Stream.SkipBlock()) 1351 return Err; 1352 1353 // Enter the source manager block. 1354 if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) 1355 return Err; 1356 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo(); 1357 1358 RecordData Record; 1359 while (true) { 1360 Expected<llvm::BitstreamEntry> MaybeE = 1361 SLocEntryCursor.advanceSkippingSubblocks(); 1362 if (!MaybeE) 1363 return MaybeE.takeError(); 1364 llvm::BitstreamEntry E = MaybeE.get(); 1365 1366 switch (E.Kind) { 1367 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1368 case llvm::BitstreamEntry::Error: 1369 return llvm::createStringError(std::errc::illegal_byte_sequence, 1370 "malformed block record in AST file"); 1371 case llvm::BitstreamEntry::EndBlock: 1372 return llvm::Error::success(); 1373 case llvm::BitstreamEntry::Record: 1374 // The interesting case. 1375 break; 1376 } 1377 1378 // Read a record. 1379 Record.clear(); 1380 StringRef Blob; 1381 Expected<unsigned> MaybeRecord = 1382 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1383 if (!MaybeRecord) 1384 return MaybeRecord.takeError(); 1385 switch (MaybeRecord.get()) { 1386 default: // Default behavior: ignore. 1387 break; 1388 1389 case SM_SLOC_FILE_ENTRY: 1390 case SM_SLOC_BUFFER_ENTRY: 1391 case SM_SLOC_EXPANSION_ENTRY: 1392 // Once we hit one of the source location entries, we're done. 1393 return llvm::Error::success(); 1394 } 1395 } 1396 } 1397 1398 /// If a header file is not found at the path that we expect it to be 1399 /// and the PCH file was moved from its original location, try to resolve the 1400 /// file by assuming that header+PCH were moved together and the header is in 1401 /// the same place relative to the PCH. 1402 static std::string 1403 resolveFileRelativeToOriginalDir(const std::string &Filename, 1404 const std::string &OriginalDir, 1405 const std::string &CurrDir) { 1406 assert(OriginalDir != CurrDir && 1407 "No point trying to resolve the file if the PCH dir didn't change"); 1408 1409 using namespace llvm::sys; 1410 1411 SmallString<128> filePath(Filename); 1412 fs::make_absolute(filePath); 1413 assert(path::is_absolute(OriginalDir)); 1414 SmallString<128> currPCHPath(CurrDir); 1415 1416 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1417 fileDirE = path::end(path::parent_path(filePath)); 1418 path::const_iterator origDirI = path::begin(OriginalDir), 1419 origDirE = path::end(OriginalDir); 1420 // Skip the common path components from filePath and OriginalDir. 1421 while (fileDirI != fileDirE && origDirI != origDirE && 1422 *fileDirI == *origDirI) { 1423 ++fileDirI; 1424 ++origDirI; 1425 } 1426 for (; origDirI != origDirE; ++origDirI) 1427 path::append(currPCHPath, ".."); 1428 path::append(currPCHPath, fileDirI, fileDirE); 1429 path::append(currPCHPath, path::filename(Filename)); 1430 return std::string(currPCHPath.str()); 1431 } 1432 1433 bool ASTReader::ReadSLocEntry(int ID) { 1434 if (ID == 0) 1435 return false; 1436 1437 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1438 Error("source location entry ID out-of-range for AST file"); 1439 return true; 1440 } 1441 1442 // Local helper to read the (possibly-compressed) buffer data following the 1443 // entry record. 1444 auto ReadBuffer = [this]( 1445 BitstreamCursor &SLocEntryCursor, 1446 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1447 RecordData Record; 1448 StringRef Blob; 1449 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1450 if (!MaybeCode) { 1451 Error(MaybeCode.takeError()); 1452 return nullptr; 1453 } 1454 unsigned Code = MaybeCode.get(); 1455 1456 Expected<unsigned> MaybeRecCode = 1457 SLocEntryCursor.readRecord(Code, Record, &Blob); 1458 if (!MaybeRecCode) { 1459 Error(MaybeRecCode.takeError()); 1460 return nullptr; 1461 } 1462 unsigned RecCode = MaybeRecCode.get(); 1463 1464 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1465 if (!llvm::zlib::isAvailable()) { 1466 Error("zlib is not available"); 1467 return nullptr; 1468 } 1469 SmallString<0> Uncompressed; 1470 if (llvm::Error E = 1471 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1472 Error("could not decompress embedded file contents: " + 1473 llvm::toString(std::move(E))); 1474 return nullptr; 1475 } 1476 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1477 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1478 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1479 } else { 1480 Error("AST record has invalid code"); 1481 return nullptr; 1482 } 1483 }; 1484 1485 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1486 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1487 F->SLocEntryOffsetsBase + 1488 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1489 Error(std::move(Err)); 1490 return true; 1491 } 1492 1493 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1494 SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset; 1495 1496 ++NumSLocEntriesRead; 1497 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1498 if (!MaybeEntry) { 1499 Error(MaybeEntry.takeError()); 1500 return true; 1501 } 1502 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1503 1504 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1505 Error("incorrectly-formatted source location entry in AST file"); 1506 return true; 1507 } 1508 1509 RecordData Record; 1510 StringRef Blob; 1511 Expected<unsigned> MaybeSLOC = 1512 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1513 if (!MaybeSLOC) { 1514 Error(MaybeSLOC.takeError()); 1515 return true; 1516 } 1517 switch (MaybeSLOC.get()) { 1518 default: 1519 Error("incorrectly-formatted source location entry in AST file"); 1520 return true; 1521 1522 case SM_SLOC_FILE_ENTRY: { 1523 // We will detect whether a file changed and return 'Failure' for it, but 1524 // we will also try to fail gracefully by setting up the SLocEntry. 1525 unsigned InputID = Record[4]; 1526 InputFile IF = getInputFile(*F, InputID); 1527 Optional<FileEntryRef> File = IF.getFile(); 1528 bool OverriddenBuffer = IF.isOverridden(); 1529 1530 // Note that we only check if a File was returned. If it was out-of-date 1531 // we have complained but we will continue creating a FileID to recover 1532 // gracefully. 1533 if (!File) 1534 return true; 1535 1536 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1537 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1538 // This is the module's main file. 1539 IncludeLoc = getImportLocation(F); 1540 } 1541 SrcMgr::CharacteristicKind 1542 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1543 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID, 1544 BaseOffset + Record[0]); 1545 SrcMgr::FileInfo &FileInfo = 1546 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1547 FileInfo.NumCreatedFIDs = Record[5]; 1548 if (Record[3]) 1549 FileInfo.setHasLineDirectives(); 1550 1551 unsigned NumFileDecls = Record[7]; 1552 if (NumFileDecls && ContextObj) { 1553 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1554 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1555 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1556 NumFileDecls)); 1557 } 1558 1559 const SrcMgr::ContentCache &ContentCache = 1560 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter)); 1561 if (OverriddenBuffer && !ContentCache.BufferOverridden && 1562 ContentCache.ContentsEntry == ContentCache.OrigEntry && 1563 !ContentCache.getBufferIfLoaded()) { 1564 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1565 if (!Buffer) 1566 return true; 1567 SourceMgr.overrideFileContents(*File, std::move(Buffer)); 1568 } 1569 1570 break; 1571 } 1572 1573 case SM_SLOC_BUFFER_ENTRY: { 1574 const char *Name = Blob.data(); 1575 unsigned Offset = Record[0]; 1576 SrcMgr::CharacteristicKind 1577 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1578 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1579 if (IncludeLoc.isInvalid() && F->isModule()) { 1580 IncludeLoc = getImportLocation(F); 1581 } 1582 1583 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1584 if (!Buffer) 1585 return true; 1586 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1587 BaseOffset + Offset, IncludeLoc); 1588 break; 1589 } 1590 1591 case SM_SLOC_EXPANSION_ENTRY: { 1592 LocSeq::State Seq; 1593 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1], Seq); 1594 SourceLocation ExpansionBegin = ReadSourceLocation(*F, Record[2], Seq); 1595 SourceLocation ExpansionEnd = ReadSourceLocation(*F, Record[3], Seq); 1596 SourceMgr.createExpansionLoc(SpellingLoc, ExpansionBegin, ExpansionEnd, 1597 Record[5], Record[4], ID, 1598 BaseOffset + Record[0]); 1599 break; 1600 } 1601 } 1602 1603 return false; 1604 } 1605 1606 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1607 if (ID == 0) 1608 return std::make_pair(SourceLocation(), ""); 1609 1610 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1611 Error("source location entry ID out-of-range for AST file"); 1612 return std::make_pair(SourceLocation(), ""); 1613 } 1614 1615 // Find which module file this entry lands in. 1616 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1617 if (!M->isModule()) 1618 return std::make_pair(SourceLocation(), ""); 1619 1620 // FIXME: Can we map this down to a particular submodule? That would be 1621 // ideal. 1622 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1623 } 1624 1625 /// Find the location where the module F is imported. 1626 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1627 if (F->ImportLoc.isValid()) 1628 return F->ImportLoc; 1629 1630 // Otherwise we have a PCH. It's considered to be "imported" at the first 1631 // location of its includer. 1632 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1633 // Main file is the importer. 1634 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1635 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1636 } 1637 return F->ImportedBy[0]->FirstLoc; 1638 } 1639 1640 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1641 /// the abbreviations that are at the top of the block and then leave the cursor 1642 /// pointing into the block. 1643 llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, 1644 unsigned BlockID, 1645 uint64_t *StartOfBlockOffset) { 1646 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) 1647 return Err; 1648 1649 if (StartOfBlockOffset) 1650 *StartOfBlockOffset = Cursor.GetCurrentBitNo(); 1651 1652 while (true) { 1653 uint64_t Offset = Cursor.GetCurrentBitNo(); 1654 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1655 if (!MaybeCode) 1656 return MaybeCode.takeError(); 1657 unsigned Code = MaybeCode.get(); 1658 1659 // We expect all abbrevs to be at the start of the block. 1660 if (Code != llvm::bitc::DEFINE_ABBREV) { 1661 if (llvm::Error Err = Cursor.JumpToBit(Offset)) 1662 return Err; 1663 return llvm::Error::success(); 1664 } 1665 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) 1666 return Err; 1667 } 1668 } 1669 1670 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1671 unsigned &Idx) { 1672 Token Tok; 1673 Tok.startToken(); 1674 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1675 Tok.setLength(Record[Idx++]); 1676 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1677 Tok.setIdentifierInfo(II); 1678 Tok.setKind((tok::TokenKind)Record[Idx++]); 1679 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1680 return Tok; 1681 } 1682 1683 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1684 BitstreamCursor &Stream = F.MacroCursor; 1685 1686 // Keep track of where we are in the stream, then jump back there 1687 // after reading this macro. 1688 SavedStreamPosition SavedPosition(Stream); 1689 1690 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1691 // FIXME this drops errors on the floor. 1692 consumeError(std::move(Err)); 1693 return nullptr; 1694 } 1695 RecordData Record; 1696 SmallVector<IdentifierInfo*, 16> MacroParams; 1697 MacroInfo *Macro = nullptr; 1698 llvm::MutableArrayRef<Token> MacroTokens; 1699 1700 while (true) { 1701 // Advance to the next record, but if we get to the end of the block, don't 1702 // pop it (removing all the abbreviations from the cursor) since we want to 1703 // be able to reseek within the block and read entries. 1704 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1705 Expected<llvm::BitstreamEntry> MaybeEntry = 1706 Stream.advanceSkippingSubblocks(Flags); 1707 if (!MaybeEntry) { 1708 Error(MaybeEntry.takeError()); 1709 return Macro; 1710 } 1711 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1712 1713 switch (Entry.Kind) { 1714 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1715 case llvm::BitstreamEntry::Error: 1716 Error("malformed block record in AST file"); 1717 return Macro; 1718 case llvm::BitstreamEntry::EndBlock: 1719 return Macro; 1720 case llvm::BitstreamEntry::Record: 1721 // The interesting case. 1722 break; 1723 } 1724 1725 // Read a record. 1726 Record.clear(); 1727 PreprocessorRecordTypes RecType; 1728 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1729 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1730 else { 1731 Error(MaybeRecType.takeError()); 1732 return Macro; 1733 } 1734 switch (RecType) { 1735 case PP_MODULE_MACRO: 1736 case PP_MACRO_DIRECTIVE_HISTORY: 1737 return Macro; 1738 1739 case PP_MACRO_OBJECT_LIKE: 1740 case PP_MACRO_FUNCTION_LIKE: { 1741 // If we already have a macro, that means that we've hit the end 1742 // of the definition of the macro we were looking for. We're 1743 // done. 1744 if (Macro) 1745 return Macro; 1746 1747 unsigned NextIndex = 1; // Skip identifier ID. 1748 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1749 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1750 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1751 MI->setIsUsed(Record[NextIndex++]); 1752 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1753 MacroTokens = MI->allocateTokens(Record[NextIndex++], 1754 PP.getPreprocessorAllocator()); 1755 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1756 // Decode function-like macro info. 1757 bool isC99VarArgs = Record[NextIndex++]; 1758 bool isGNUVarArgs = Record[NextIndex++]; 1759 bool hasCommaPasting = Record[NextIndex++]; 1760 MacroParams.clear(); 1761 unsigned NumArgs = Record[NextIndex++]; 1762 for (unsigned i = 0; i != NumArgs; ++i) 1763 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1764 1765 // Install function-like macro info. 1766 MI->setIsFunctionLike(); 1767 if (isC99VarArgs) MI->setIsC99Varargs(); 1768 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1769 if (hasCommaPasting) MI->setHasCommaPasting(); 1770 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1771 } 1772 1773 // Remember that we saw this macro last so that we add the tokens that 1774 // form its body to it. 1775 Macro = MI; 1776 1777 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1778 Record[NextIndex]) { 1779 // We have a macro definition. Register the association 1780 PreprocessedEntityID 1781 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1782 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1783 PreprocessingRecord::PPEntityID PPID = 1784 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1785 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1786 PPRec.getPreprocessedEntity(PPID)); 1787 if (PPDef) 1788 PPRec.RegisterMacroDefinition(Macro, PPDef); 1789 } 1790 1791 ++NumMacrosRead; 1792 break; 1793 } 1794 1795 case PP_TOKEN: { 1796 // If we see a TOKEN before a PP_MACRO_*, then the file is 1797 // erroneous, just pretend we didn't see this. 1798 if (!Macro) break; 1799 if (MacroTokens.empty()) { 1800 Error("unexpected number of macro tokens for a macro in AST file"); 1801 return Macro; 1802 } 1803 1804 unsigned Idx = 0; 1805 MacroTokens[0] = ReadToken(F, Record, Idx); 1806 MacroTokens = MacroTokens.drop_front(); 1807 break; 1808 } 1809 } 1810 } 1811 } 1812 1813 PreprocessedEntityID 1814 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1815 unsigned LocalID) const { 1816 if (!M.ModuleOffsetMap.empty()) 1817 ReadModuleOffsetMap(M); 1818 1819 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1820 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1821 assert(I != M.PreprocessedEntityRemap.end() 1822 && "Invalid index into preprocessed entity index remap"); 1823 1824 return LocalID + I->second; 1825 } 1826 1827 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1828 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1829 } 1830 1831 HeaderFileInfoTrait::internal_key_type 1832 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1833 internal_key_type ikey = {FE->getSize(), 1834 M.HasTimestamps ? FE->getModificationTime() : 0, 1835 FE->getName(), /*Imported*/ false}; 1836 return ikey; 1837 } 1838 1839 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1840 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1841 return false; 1842 1843 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1844 return true; 1845 1846 // Determine whether the actual files are equivalent. 1847 FileManager &FileMgr = Reader.getFileManager(); 1848 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1849 if (!Key.Imported) { 1850 if (auto File = FileMgr.getFile(Key.Filename)) 1851 return *File; 1852 return nullptr; 1853 } 1854 1855 std::string Resolved = std::string(Key.Filename); 1856 Reader.ResolveImportedPath(M, Resolved); 1857 if (auto File = FileMgr.getFile(Resolved)) 1858 return *File; 1859 return nullptr; 1860 }; 1861 1862 const FileEntry *FEA = GetFile(a); 1863 const FileEntry *FEB = GetFile(b); 1864 return FEA && FEA == FEB; 1865 } 1866 1867 std::pair<unsigned, unsigned> 1868 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1869 return readULEBKeyDataLength(d); 1870 } 1871 1872 HeaderFileInfoTrait::internal_key_type 1873 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1874 using namespace llvm::support; 1875 1876 internal_key_type ikey; 1877 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1878 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1879 ikey.Filename = (const char *)d; 1880 ikey.Imported = true; 1881 return ikey; 1882 } 1883 1884 HeaderFileInfoTrait::data_type 1885 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1886 unsigned DataLen) { 1887 using namespace llvm::support; 1888 1889 const unsigned char *End = d + DataLen; 1890 HeaderFileInfo HFI; 1891 unsigned Flags = *d++; 1892 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1893 HFI.isImport |= (Flags >> 5) & 0x01; 1894 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1895 HFI.DirInfo = (Flags >> 1) & 0x07; 1896 HFI.IndexHeaderMapHeader = Flags & 0x01; 1897 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1898 M, endian::readNext<uint32_t, little, unaligned>(d)); 1899 if (unsigned FrameworkOffset = 1900 endian::readNext<uint32_t, little, unaligned>(d)) { 1901 // The framework offset is 1 greater than the actual offset, 1902 // since 0 is used as an indicator for "no framework name". 1903 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1904 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1905 } 1906 1907 assert((End - d) % 4 == 0 && 1908 "Wrong data length in HeaderFileInfo deserialization"); 1909 while (d != End) { 1910 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1911 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1912 LocalSMID >>= 2; 1913 1914 // This header is part of a module. Associate it with the module to enable 1915 // implicit module import. 1916 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1917 Module *Mod = Reader.getSubmodule(GlobalSMID); 1918 FileManager &FileMgr = Reader.getFileManager(); 1919 ModuleMap &ModMap = 1920 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1921 1922 std::string Filename = std::string(key.Filename); 1923 if (key.Imported) 1924 Reader.ResolveImportedPath(M, Filename); 1925 // FIXME: NameAsWritten 1926 Module::Header H = {std::string(key.Filename), "", 1927 *FileMgr.getFile(Filename)}; 1928 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1929 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1930 } 1931 1932 // This HeaderFileInfo was externally loaded. 1933 HFI.External = true; 1934 HFI.IsValid = true; 1935 return HFI; 1936 } 1937 1938 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1939 uint32_t MacroDirectivesOffset) { 1940 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1941 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1942 } 1943 1944 void ASTReader::ReadDefinedMacros() { 1945 // Note that we are loading defined macros. 1946 Deserializing Macros(this); 1947 1948 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1949 BitstreamCursor &MacroCursor = I.MacroCursor; 1950 1951 // If there was no preprocessor block, skip this file. 1952 if (MacroCursor.getBitcodeBytes().empty()) 1953 continue; 1954 1955 BitstreamCursor Cursor = MacroCursor; 1956 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1957 Error(std::move(Err)); 1958 return; 1959 } 1960 1961 RecordData Record; 1962 while (true) { 1963 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1964 if (!MaybeE) { 1965 Error(MaybeE.takeError()); 1966 return; 1967 } 1968 llvm::BitstreamEntry E = MaybeE.get(); 1969 1970 switch (E.Kind) { 1971 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1972 case llvm::BitstreamEntry::Error: 1973 Error("malformed block record in AST file"); 1974 return; 1975 case llvm::BitstreamEntry::EndBlock: 1976 goto NextCursor; 1977 1978 case llvm::BitstreamEntry::Record: { 1979 Record.clear(); 1980 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1981 if (!MaybeRecord) { 1982 Error(MaybeRecord.takeError()); 1983 return; 1984 } 1985 switch (MaybeRecord.get()) { 1986 default: // Default behavior: ignore. 1987 break; 1988 1989 case PP_MACRO_OBJECT_LIKE: 1990 case PP_MACRO_FUNCTION_LIKE: { 1991 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1992 if (II->isOutOfDate()) 1993 updateOutOfDateIdentifier(*II); 1994 break; 1995 } 1996 1997 case PP_TOKEN: 1998 // Ignore tokens. 1999 break; 2000 } 2001 break; 2002 } 2003 } 2004 } 2005 NextCursor: ; 2006 } 2007 } 2008 2009 namespace { 2010 2011 /// Visitor class used to look up identifirs in an AST file. 2012 class IdentifierLookupVisitor { 2013 StringRef Name; 2014 unsigned NameHash; 2015 unsigned PriorGeneration; 2016 unsigned &NumIdentifierLookups; 2017 unsigned &NumIdentifierLookupHits; 2018 IdentifierInfo *Found = nullptr; 2019 2020 public: 2021 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2022 unsigned &NumIdentifierLookups, 2023 unsigned &NumIdentifierLookupHits) 2024 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2025 PriorGeneration(PriorGeneration), 2026 NumIdentifierLookups(NumIdentifierLookups), 2027 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2028 2029 bool operator()(ModuleFile &M) { 2030 // If we've already searched this module file, skip it now. 2031 if (M.Generation <= PriorGeneration) 2032 return true; 2033 2034 ASTIdentifierLookupTable *IdTable 2035 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2036 if (!IdTable) 2037 return false; 2038 2039 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2040 Found); 2041 ++NumIdentifierLookups; 2042 ASTIdentifierLookupTable::iterator Pos = 2043 IdTable->find_hashed(Name, NameHash, &Trait); 2044 if (Pos == IdTable->end()) 2045 return false; 2046 2047 // Dereferencing the iterator has the effect of building the 2048 // IdentifierInfo node and populating it with the various 2049 // declarations it needs. 2050 ++NumIdentifierLookupHits; 2051 Found = *Pos; 2052 return true; 2053 } 2054 2055 // Retrieve the identifier info found within the module 2056 // files. 2057 IdentifierInfo *getIdentifierInfo() const { return Found; } 2058 }; 2059 2060 } // namespace 2061 2062 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2063 // Note that we are loading an identifier. 2064 Deserializing AnIdentifier(this); 2065 2066 unsigned PriorGeneration = 0; 2067 if (getContext().getLangOpts().Modules) 2068 PriorGeneration = IdentifierGeneration[&II]; 2069 2070 // If there is a global index, look there first to determine which modules 2071 // provably do not have any results for this identifier. 2072 GlobalModuleIndex::HitSet Hits; 2073 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2074 if (!loadGlobalIndex()) { 2075 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2076 HitsPtr = &Hits; 2077 } 2078 } 2079 2080 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2081 NumIdentifierLookups, 2082 NumIdentifierLookupHits); 2083 ModuleMgr.visit(Visitor, HitsPtr); 2084 markIdentifierUpToDate(&II); 2085 } 2086 2087 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2088 if (!II) 2089 return; 2090 2091 II->setOutOfDate(false); 2092 2093 // Update the generation for this identifier. 2094 if (getContext().getLangOpts().Modules) 2095 IdentifierGeneration[II] = getGeneration(); 2096 } 2097 2098 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2099 const PendingMacroInfo &PMInfo) { 2100 ModuleFile &M = *PMInfo.M; 2101 2102 BitstreamCursor &Cursor = M.MacroCursor; 2103 SavedStreamPosition SavedPosition(Cursor); 2104 if (llvm::Error Err = 2105 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2106 Error(std::move(Err)); 2107 return; 2108 } 2109 2110 struct ModuleMacroRecord { 2111 SubmoduleID SubModID; 2112 MacroInfo *MI; 2113 SmallVector<SubmoduleID, 8> Overrides; 2114 }; 2115 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2116 2117 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2118 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2119 // macro histroy. 2120 RecordData Record; 2121 while (true) { 2122 Expected<llvm::BitstreamEntry> MaybeEntry = 2123 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2124 if (!MaybeEntry) { 2125 Error(MaybeEntry.takeError()); 2126 return; 2127 } 2128 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2129 2130 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2131 Error("malformed block record in AST file"); 2132 return; 2133 } 2134 2135 Record.clear(); 2136 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2137 if (!MaybePP) { 2138 Error(MaybePP.takeError()); 2139 return; 2140 } 2141 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2142 case PP_MACRO_DIRECTIVE_HISTORY: 2143 break; 2144 2145 case PP_MODULE_MACRO: { 2146 ModuleMacros.push_back(ModuleMacroRecord()); 2147 auto &Info = ModuleMacros.back(); 2148 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2149 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2150 for (int I = 2, N = Record.size(); I != N; ++I) 2151 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2152 continue; 2153 } 2154 2155 default: 2156 Error("malformed block record in AST file"); 2157 return; 2158 } 2159 2160 // We found the macro directive history; that's the last record 2161 // for this macro. 2162 break; 2163 } 2164 2165 // Module macros are listed in reverse dependency order. 2166 { 2167 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2168 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2169 for (auto &MMR : ModuleMacros) { 2170 Overrides.clear(); 2171 for (unsigned ModID : MMR.Overrides) { 2172 Module *Mod = getSubmodule(ModID); 2173 auto *Macro = PP.getModuleMacro(Mod, II); 2174 assert(Macro && "missing definition for overridden macro"); 2175 Overrides.push_back(Macro); 2176 } 2177 2178 bool Inserted = false; 2179 Module *Owner = getSubmodule(MMR.SubModID); 2180 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2181 } 2182 } 2183 2184 // Don't read the directive history for a module; we don't have anywhere 2185 // to put it. 2186 if (M.isModule()) 2187 return; 2188 2189 // Deserialize the macro directives history in reverse source-order. 2190 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2191 unsigned Idx = 0, N = Record.size(); 2192 while (Idx < N) { 2193 MacroDirective *MD = nullptr; 2194 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2195 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2196 switch (K) { 2197 case MacroDirective::MD_Define: { 2198 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2199 MD = PP.AllocateDefMacroDirective(MI, Loc); 2200 break; 2201 } 2202 case MacroDirective::MD_Undefine: 2203 MD = PP.AllocateUndefMacroDirective(Loc); 2204 break; 2205 case MacroDirective::MD_Visibility: 2206 bool isPublic = Record[Idx++]; 2207 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2208 break; 2209 } 2210 2211 if (!Latest) 2212 Latest = MD; 2213 if (Earliest) 2214 Earliest->setPrevious(MD); 2215 Earliest = MD; 2216 } 2217 2218 if (Latest) 2219 PP.setLoadedMacroDirective(II, Earliest, Latest); 2220 } 2221 2222 bool ASTReader::shouldDisableValidationForFile( 2223 const serialization::ModuleFile &M) const { 2224 if (DisableValidationKind == DisableValidationForModuleKind::None) 2225 return false; 2226 2227 // If a PCH is loaded and validation is disabled for PCH then disable 2228 // validation for the PCH and the modules it loads. 2229 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind); 2230 2231 switch (K) { 2232 case MK_MainFile: 2233 case MK_Preamble: 2234 case MK_PCH: 2235 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH); 2236 case MK_ImplicitModule: 2237 case MK_ExplicitModule: 2238 case MK_PrebuiltModule: 2239 return bool(DisableValidationKind & DisableValidationForModuleKind::Module); 2240 } 2241 2242 return false; 2243 } 2244 2245 ASTReader::InputFileInfo 2246 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2247 // Go find this input file. 2248 BitstreamCursor &Cursor = F.InputFilesCursor; 2249 SavedStreamPosition SavedPosition(Cursor); 2250 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2251 // FIXME this drops errors on the floor. 2252 consumeError(std::move(Err)); 2253 } 2254 2255 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2256 if (!MaybeCode) { 2257 // FIXME this drops errors on the floor. 2258 consumeError(MaybeCode.takeError()); 2259 } 2260 unsigned Code = MaybeCode.get(); 2261 RecordData Record; 2262 StringRef Blob; 2263 2264 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2265 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2266 "invalid record type for input file"); 2267 else { 2268 // FIXME this drops errors on the floor. 2269 consumeError(Maybe.takeError()); 2270 } 2271 2272 assert(Record[0] == ID && "Bogus stored ID or offset"); 2273 InputFileInfo R; 2274 R.StoredSize = static_cast<off_t>(Record[1]); 2275 R.StoredTime = static_cast<time_t>(Record[2]); 2276 R.Overridden = static_cast<bool>(Record[3]); 2277 R.Transient = static_cast<bool>(Record[4]); 2278 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2279 R.Filename = std::string(Blob); 2280 ResolveImportedPath(F, R.Filename); 2281 2282 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2283 if (!MaybeEntry) // FIXME this drops errors on the floor. 2284 consumeError(MaybeEntry.takeError()); 2285 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2286 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2287 "expected record type for input file hash"); 2288 2289 Record.clear(); 2290 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2291 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2292 "invalid record type for input file hash"); 2293 else { 2294 // FIXME this drops errors on the floor. 2295 consumeError(Maybe.takeError()); 2296 } 2297 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2298 static_cast<uint64_t>(Record[0]); 2299 return R; 2300 } 2301 2302 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2303 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2304 // If this ID is bogus, just return an empty input file. 2305 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2306 return InputFile(); 2307 2308 // If we've already loaded this input file, return it. 2309 if (F.InputFilesLoaded[ID-1].getFile()) 2310 return F.InputFilesLoaded[ID-1]; 2311 2312 if (F.InputFilesLoaded[ID-1].isNotFound()) 2313 return InputFile(); 2314 2315 // Go find this input file. 2316 BitstreamCursor &Cursor = F.InputFilesCursor; 2317 SavedStreamPosition SavedPosition(Cursor); 2318 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2319 // FIXME this drops errors on the floor. 2320 consumeError(std::move(Err)); 2321 } 2322 2323 InputFileInfo FI = readInputFileInfo(F, ID); 2324 off_t StoredSize = FI.StoredSize; 2325 time_t StoredTime = FI.StoredTime; 2326 bool Overridden = FI.Overridden; 2327 bool Transient = FI.Transient; 2328 StringRef Filename = FI.Filename; 2329 uint64_t StoredContentHash = FI.ContentHash; 2330 2331 OptionalFileEntryRefDegradesToFileEntryPtr File = 2332 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false)); 2333 2334 // If we didn't find the file, resolve it relative to the 2335 // original directory from which this AST file was created. 2336 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2337 F.OriginalDir != F.BaseDirectory) { 2338 std::string Resolved = resolveFileRelativeToOriginalDir( 2339 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2340 if (!Resolved.empty()) 2341 File = expectedToOptional(FileMgr.getFileRef(Resolved)); 2342 } 2343 2344 // For an overridden file, create a virtual file with the stored 2345 // size/timestamp. 2346 if ((Overridden || Transient) && !File) 2347 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime); 2348 2349 if (!File) { 2350 if (Complain) { 2351 std::string ErrorStr = "could not find file '"; 2352 ErrorStr += Filename; 2353 ErrorStr += "' referenced by AST file '"; 2354 ErrorStr += F.FileName; 2355 ErrorStr += "'"; 2356 Error(ErrorStr); 2357 } 2358 // Record that we didn't find the file. 2359 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2360 return InputFile(); 2361 } 2362 2363 // Check if there was a request to override the contents of the file 2364 // that was part of the precompiled header. Overriding such a file 2365 // can lead to problems when lexing using the source locations from the 2366 // PCH. 2367 SourceManager &SM = getSourceManager(); 2368 // FIXME: Reject if the overrides are different. 2369 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2370 if (Complain) 2371 Error(diag::err_fe_pch_file_overridden, Filename); 2372 2373 // After emitting the diagnostic, bypass the overriding file to recover 2374 // (this creates a separate FileEntry). 2375 File = SM.bypassFileContentsOverride(*File); 2376 if (!File) { 2377 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2378 return InputFile(); 2379 } 2380 } 2381 2382 struct Change { 2383 enum ModificationKind { 2384 Size, 2385 ModTime, 2386 Content, 2387 None, 2388 } Kind; 2389 llvm::Optional<int64_t> Old = llvm::None; 2390 llvm::Optional<int64_t> New = llvm::None; 2391 }; 2392 auto HasInputFileChanged = [&]() { 2393 if (StoredSize != File->getSize()) 2394 return Change{Change::Size, StoredSize, File->getSize()}; 2395 if (!shouldDisableValidationForFile(F) && StoredTime && 2396 StoredTime != File->getModificationTime()) { 2397 Change MTimeChange = {Change::ModTime, StoredTime, 2398 File->getModificationTime()}; 2399 2400 // In case the modification time changes but not the content, 2401 // accept the cached file as legit. 2402 if (ValidateASTInputFilesContent && 2403 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2404 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2405 if (!MemBuffOrError) { 2406 if (!Complain) 2407 return MTimeChange; 2408 std::string ErrorStr = "could not get buffer for file '"; 2409 ErrorStr += File->getName(); 2410 ErrorStr += "'"; 2411 Error(ErrorStr); 2412 return MTimeChange; 2413 } 2414 2415 // FIXME: hash_value is not guaranteed to be stable! 2416 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2417 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2418 return Change{Change::None}; 2419 2420 return Change{Change::Content}; 2421 } 2422 return MTimeChange; 2423 } 2424 return Change{Change::None}; 2425 }; 2426 2427 bool IsOutOfDate = false; 2428 auto FileChange = HasInputFileChanged(); 2429 // For an overridden file, there is nothing to validate. 2430 if (!Overridden && FileChange.Kind != Change::None) { 2431 if (Complain && !Diags.isDiagnosticInFlight()) { 2432 // Build a list of the PCH imports that got us here (in reverse). 2433 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2434 while (!ImportStack.back()->ImportedBy.empty()) 2435 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2436 2437 // The top-level PCH is stale. 2438 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2439 Diag(diag::err_fe_ast_file_modified) 2440 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind) 2441 << TopLevelPCHName << FileChange.Kind 2442 << (FileChange.Old && FileChange.New) 2443 << llvm::itostr(FileChange.Old.getValueOr(0)) 2444 << llvm::itostr(FileChange.New.getValueOr(0)); 2445 2446 // Print the import stack. 2447 if (ImportStack.size() > 1) { 2448 Diag(diag::note_pch_required_by) 2449 << Filename << ImportStack[0]->FileName; 2450 for (unsigned I = 1; I < ImportStack.size(); ++I) 2451 Diag(diag::note_pch_required_by) 2452 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2453 } 2454 2455 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2456 } 2457 2458 IsOutOfDate = true; 2459 } 2460 // FIXME: If the file is overridden and we've already opened it, 2461 // issue an error (or split it into a separate FileEntry). 2462 2463 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate); 2464 2465 // Note that we've loaded this input file. 2466 F.InputFilesLoaded[ID-1] = IF; 2467 return IF; 2468 } 2469 2470 /// If we are loading a relocatable PCH or module file, and the filename 2471 /// is not an absolute path, add the system or module root to the beginning of 2472 /// the file name. 2473 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2474 // Resolve relative to the base directory, if we have one. 2475 if (!M.BaseDirectory.empty()) 2476 return ResolveImportedPath(Filename, M.BaseDirectory); 2477 } 2478 2479 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2480 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2481 return; 2482 2483 SmallString<128> Buffer; 2484 llvm::sys::path::append(Buffer, Prefix, Filename); 2485 Filename.assign(Buffer.begin(), Buffer.end()); 2486 } 2487 2488 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2489 switch (ARR) { 2490 case ASTReader::Failure: return true; 2491 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2492 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2493 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2494 case ASTReader::ConfigurationMismatch: 2495 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2496 case ASTReader::HadErrors: return true; 2497 case ASTReader::Success: return false; 2498 } 2499 2500 llvm_unreachable("unknown ASTReadResult"); 2501 } 2502 2503 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2504 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2505 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2506 std::string &SuggestedPredefines) { 2507 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2508 // FIXME this drops errors on the floor. 2509 consumeError(std::move(Err)); 2510 return Failure; 2511 } 2512 2513 // Read all of the records in the options block. 2514 RecordData Record; 2515 ASTReadResult Result = Success; 2516 while (true) { 2517 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2518 if (!MaybeEntry) { 2519 // FIXME this drops errors on the floor. 2520 consumeError(MaybeEntry.takeError()); 2521 return Failure; 2522 } 2523 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2524 2525 switch (Entry.Kind) { 2526 case llvm::BitstreamEntry::Error: 2527 case llvm::BitstreamEntry::SubBlock: 2528 return Failure; 2529 2530 case llvm::BitstreamEntry::EndBlock: 2531 return Result; 2532 2533 case llvm::BitstreamEntry::Record: 2534 // The interesting case. 2535 break; 2536 } 2537 2538 // Read and process a record. 2539 Record.clear(); 2540 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2541 if (!MaybeRecordType) { 2542 // FIXME this drops errors on the floor. 2543 consumeError(MaybeRecordType.takeError()); 2544 return Failure; 2545 } 2546 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2547 case LANGUAGE_OPTIONS: { 2548 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2549 if (ParseLanguageOptions(Record, Complain, Listener, 2550 AllowCompatibleConfigurationMismatch)) 2551 Result = ConfigurationMismatch; 2552 break; 2553 } 2554 2555 case TARGET_OPTIONS: { 2556 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2557 if (ParseTargetOptions(Record, Complain, Listener, 2558 AllowCompatibleConfigurationMismatch)) 2559 Result = ConfigurationMismatch; 2560 break; 2561 } 2562 2563 case FILE_SYSTEM_OPTIONS: { 2564 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2565 if (!AllowCompatibleConfigurationMismatch && 2566 ParseFileSystemOptions(Record, Complain, Listener)) 2567 Result = ConfigurationMismatch; 2568 break; 2569 } 2570 2571 case HEADER_SEARCH_OPTIONS: { 2572 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2573 if (!AllowCompatibleConfigurationMismatch && 2574 ParseHeaderSearchOptions(Record, Complain, Listener)) 2575 Result = ConfigurationMismatch; 2576 break; 2577 } 2578 2579 case PREPROCESSOR_OPTIONS: 2580 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2581 if (!AllowCompatibleConfigurationMismatch && 2582 ParsePreprocessorOptions(Record, Complain, Listener, 2583 SuggestedPredefines)) 2584 Result = ConfigurationMismatch; 2585 break; 2586 } 2587 } 2588 } 2589 2590 ASTReader::ASTReadResult 2591 ASTReader::ReadControlBlock(ModuleFile &F, 2592 SmallVectorImpl<ImportedModule> &Loaded, 2593 const ModuleFile *ImportedBy, 2594 unsigned ClientLoadCapabilities) { 2595 BitstreamCursor &Stream = F.Stream; 2596 2597 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2598 Error(std::move(Err)); 2599 return Failure; 2600 } 2601 2602 // Lambda to read the unhashed control block the first time it's called. 2603 // 2604 // For PCM files, the unhashed control block cannot be read until after the 2605 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2606 // need to look ahead before reading the IMPORTS record. For consistency, 2607 // this block is always read somehow (see BitstreamEntry::EndBlock). 2608 bool HasReadUnhashedControlBlock = false; 2609 auto readUnhashedControlBlockOnce = [&]() { 2610 if (!HasReadUnhashedControlBlock) { 2611 HasReadUnhashedControlBlock = true; 2612 if (ASTReadResult Result = 2613 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2614 return Result; 2615 } 2616 return Success; 2617 }; 2618 2619 bool DisableValidation = shouldDisableValidationForFile(F); 2620 2621 // Read all of the records and blocks in the control block. 2622 RecordData Record; 2623 unsigned NumInputs = 0; 2624 unsigned NumUserInputs = 0; 2625 StringRef BaseDirectoryAsWritten; 2626 while (true) { 2627 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2628 if (!MaybeEntry) { 2629 Error(MaybeEntry.takeError()); 2630 return Failure; 2631 } 2632 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2633 2634 switch (Entry.Kind) { 2635 case llvm::BitstreamEntry::Error: 2636 Error("malformed block record in AST file"); 2637 return Failure; 2638 case llvm::BitstreamEntry::EndBlock: { 2639 // Validate the module before returning. This call catches an AST with 2640 // no module name and no imports. 2641 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2642 return Result; 2643 2644 // Validate input files. 2645 const HeaderSearchOptions &HSOpts = 2646 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2647 2648 // All user input files reside at the index range [0, NumUserInputs), and 2649 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2650 // loaded module files, ignore missing inputs. 2651 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2652 F.Kind != MK_PrebuiltModule) { 2653 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2654 2655 // If we are reading a module, we will create a verification timestamp, 2656 // so we verify all input files. Otherwise, verify only user input 2657 // files. 2658 2659 unsigned N = NumUserInputs; 2660 if (ValidateSystemInputs || 2661 (HSOpts.ModulesValidateOncePerBuildSession && 2662 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2663 F.Kind == MK_ImplicitModule)) 2664 N = NumInputs; 2665 2666 for (unsigned I = 0; I < N; ++I) { 2667 InputFile IF = getInputFile(F, I+1, Complain); 2668 if (!IF.getFile() || IF.isOutOfDate()) 2669 return OutOfDate; 2670 } 2671 } 2672 2673 if (Listener) 2674 Listener->visitModuleFile(F.FileName, F.Kind); 2675 2676 if (Listener && Listener->needsInputFileVisitation()) { 2677 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2678 : NumUserInputs; 2679 for (unsigned I = 0; I < N; ++I) { 2680 bool IsSystem = I >= NumUserInputs; 2681 InputFileInfo FI = readInputFileInfo(F, I+1); 2682 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2683 F.Kind == MK_ExplicitModule || 2684 F.Kind == MK_PrebuiltModule); 2685 } 2686 } 2687 2688 return Success; 2689 } 2690 2691 case llvm::BitstreamEntry::SubBlock: 2692 switch (Entry.ID) { 2693 case INPUT_FILES_BLOCK_ID: 2694 F.InputFilesCursor = Stream; 2695 if (llvm::Error Err = Stream.SkipBlock()) { 2696 Error(std::move(Err)); 2697 return Failure; 2698 } 2699 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2700 Error("malformed block record in AST file"); 2701 return Failure; 2702 } 2703 continue; 2704 2705 case OPTIONS_BLOCK_ID: 2706 // If we're reading the first module for this group, check its options 2707 // are compatible with ours. For modules it imports, no further checking 2708 // is required, because we checked them when we built it. 2709 if (Listener && !ImportedBy) { 2710 // Should we allow the configuration of the module file to differ from 2711 // the configuration of the current translation unit in a compatible 2712 // way? 2713 // 2714 // FIXME: Allow this for files explicitly specified with -include-pch. 2715 bool AllowCompatibleConfigurationMismatch = 2716 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2717 2718 ASTReadResult Result = 2719 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2720 AllowCompatibleConfigurationMismatch, *Listener, 2721 SuggestedPredefines); 2722 if (Result == Failure) { 2723 Error("malformed block record in AST file"); 2724 return Result; 2725 } 2726 2727 if (DisableValidation || 2728 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2729 Result = Success; 2730 2731 // If we can't load the module, exit early since we likely 2732 // will rebuild the module anyway. The stream may be in the 2733 // middle of a block. 2734 if (Result != Success) 2735 return Result; 2736 } else if (llvm::Error Err = Stream.SkipBlock()) { 2737 Error(std::move(Err)); 2738 return Failure; 2739 } 2740 continue; 2741 2742 default: 2743 if (llvm::Error Err = Stream.SkipBlock()) { 2744 Error(std::move(Err)); 2745 return Failure; 2746 } 2747 continue; 2748 } 2749 2750 case llvm::BitstreamEntry::Record: 2751 // The interesting case. 2752 break; 2753 } 2754 2755 // Read and process a record. 2756 Record.clear(); 2757 StringRef Blob; 2758 Expected<unsigned> MaybeRecordType = 2759 Stream.readRecord(Entry.ID, Record, &Blob); 2760 if (!MaybeRecordType) { 2761 Error(MaybeRecordType.takeError()); 2762 return Failure; 2763 } 2764 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2765 case METADATA: { 2766 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2767 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2768 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2769 : diag::err_pch_version_too_new); 2770 return VersionMismatch; 2771 } 2772 2773 bool hasErrors = Record[6]; 2774 if (hasErrors && !DisableValidation) { 2775 // If requested by the caller and the module hasn't already been read 2776 // or compiled, mark modules on error as out-of-date. 2777 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) && 2778 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2779 return OutOfDate; 2780 2781 if (!AllowASTWithCompilerErrors) { 2782 Diag(diag::err_pch_with_compiler_errors); 2783 return HadErrors; 2784 } 2785 } 2786 if (hasErrors) { 2787 Diags.ErrorOccurred = true; 2788 Diags.UncompilableErrorOccurred = true; 2789 Diags.UnrecoverableErrorOccurred = true; 2790 } 2791 2792 F.RelocatablePCH = Record[4]; 2793 // Relative paths in a relocatable PCH are relative to our sysroot. 2794 if (F.RelocatablePCH) 2795 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2796 2797 F.HasTimestamps = Record[5]; 2798 2799 const std::string &CurBranch = getClangFullRepositoryVersion(); 2800 StringRef ASTBranch = Blob; 2801 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2802 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2803 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2804 return VersionMismatch; 2805 } 2806 break; 2807 } 2808 2809 case IMPORTS: { 2810 // Validate the AST before processing any imports (otherwise, untangling 2811 // them can be error-prone and expensive). A module will have a name and 2812 // will already have been validated, but this catches the PCH case. 2813 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2814 return Result; 2815 2816 // Load each of the imported PCH files. 2817 unsigned Idx = 0, N = Record.size(); 2818 while (Idx < N) { 2819 // Read information about the AST file. 2820 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2821 // The import location will be the local one for now; we will adjust 2822 // all import locations of module imports after the global source 2823 // location info are setup, in ReadAST. 2824 SourceLocation ImportLoc = 2825 ReadUntranslatedSourceLocation(Record[Idx++]); 2826 off_t StoredSize = (off_t)Record[Idx++]; 2827 time_t StoredModTime = (time_t)Record[Idx++]; 2828 auto FirstSignatureByte = Record.begin() + Idx; 2829 ASTFileSignature StoredSignature = ASTFileSignature::create( 2830 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size); 2831 Idx += ASTFileSignature::size; 2832 2833 std::string ImportedName = ReadString(Record, Idx); 2834 std::string ImportedFile; 2835 2836 // For prebuilt and explicit modules first consult the file map for 2837 // an override. Note that here we don't search prebuilt module 2838 // directories, only the explicit name to file mappings. Also, we will 2839 // still verify the size/signature making sure it is essentially the 2840 // same file but perhaps in a different location. 2841 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2842 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2843 ImportedName, /*FileMapOnly*/ true); 2844 2845 if (ImportedFile.empty()) 2846 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2847 // ModuleCache as when writing. 2848 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2849 else 2850 SkipPath(Record, Idx); 2851 2852 // If our client can't cope with us being out of date, we can't cope with 2853 // our dependency being missing. 2854 unsigned Capabilities = ClientLoadCapabilities; 2855 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2856 Capabilities &= ~ARR_Missing; 2857 2858 // Load the AST file. 2859 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2860 Loaded, StoredSize, StoredModTime, 2861 StoredSignature, Capabilities); 2862 2863 // If we diagnosed a problem, produce a backtrace. 2864 bool recompilingFinalized = 2865 Result == OutOfDate && (Capabilities & ARR_OutOfDate) && 2866 getModuleManager().getModuleCache().isPCMFinal(F.FileName); 2867 if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized) 2868 Diag(diag::note_module_file_imported_by) 2869 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2870 if (recompilingFinalized) 2871 Diag(diag::note_module_file_conflict); 2872 2873 switch (Result) { 2874 case Failure: return Failure; 2875 // If we have to ignore the dependency, we'll have to ignore this too. 2876 case Missing: 2877 case OutOfDate: return OutOfDate; 2878 case VersionMismatch: return VersionMismatch; 2879 case ConfigurationMismatch: return ConfigurationMismatch; 2880 case HadErrors: return HadErrors; 2881 case Success: break; 2882 } 2883 } 2884 break; 2885 } 2886 2887 case ORIGINAL_FILE: 2888 F.OriginalSourceFileID = FileID::get(Record[0]); 2889 F.ActualOriginalSourceFileName = std::string(Blob); 2890 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2891 ResolveImportedPath(F, F.OriginalSourceFileName); 2892 break; 2893 2894 case ORIGINAL_FILE_ID: 2895 F.OriginalSourceFileID = FileID::get(Record[0]); 2896 break; 2897 2898 case ORIGINAL_PCH_DIR: 2899 F.OriginalDir = std::string(Blob); 2900 ResolveImportedPath(F, F.OriginalDir); 2901 break; 2902 2903 case MODULE_NAME: 2904 F.ModuleName = std::string(Blob); 2905 Diag(diag::remark_module_import) 2906 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2907 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2908 if (Listener) 2909 Listener->ReadModuleName(F.ModuleName); 2910 2911 // Validate the AST as soon as we have a name so we can exit early on 2912 // failure. 2913 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2914 return Result; 2915 2916 break; 2917 2918 case MODULE_DIRECTORY: { 2919 // Save the BaseDirectory as written in the PCM for computing the module 2920 // filename for the ModuleCache. 2921 BaseDirectoryAsWritten = Blob; 2922 assert(!F.ModuleName.empty() && 2923 "MODULE_DIRECTORY found before MODULE_NAME"); 2924 // If we've already loaded a module map file covering this module, we may 2925 // have a better path for it (relative to the current build). 2926 Module *M = PP.getHeaderSearchInfo().lookupModule( 2927 F.ModuleName, SourceLocation(), /*AllowSearch*/ true, 2928 /*AllowExtraModuleMapSearch*/ true); 2929 if (M && M->Directory) { 2930 // If we're implicitly loading a module, the base directory can't 2931 // change between the build and use. 2932 // Don't emit module relocation error if we have -fno-validate-pch 2933 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 2934 DisableValidationForModuleKind::Module) && 2935 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2936 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2937 if (!BuildDir || *BuildDir != M->Directory) { 2938 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2939 Diag(diag::err_imported_module_relocated) 2940 << F.ModuleName << Blob << M->Directory->getName(); 2941 return OutOfDate; 2942 } 2943 } 2944 F.BaseDirectory = std::string(M->Directory->getName()); 2945 } else { 2946 F.BaseDirectory = std::string(Blob); 2947 } 2948 break; 2949 } 2950 2951 case MODULE_MAP_FILE: 2952 if (ASTReadResult Result = 2953 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2954 return Result; 2955 break; 2956 2957 case INPUT_FILE_OFFSETS: 2958 NumInputs = Record[0]; 2959 NumUserInputs = Record[1]; 2960 F.InputFileOffsets = 2961 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2962 F.InputFilesLoaded.resize(NumInputs); 2963 F.NumUserInputFiles = NumUserInputs; 2964 break; 2965 } 2966 } 2967 } 2968 2969 void ASTReader::readIncludedFiles(ModuleFile &F, StringRef Blob, 2970 Preprocessor &PP) { 2971 using namespace llvm::support; 2972 2973 const unsigned char *D = (const unsigned char *)Blob.data(); 2974 unsigned FileCount = endian::readNext<uint32_t, little, unaligned>(D); 2975 2976 for (unsigned I = 0; I < FileCount; ++I) { 2977 size_t ID = endian::readNext<uint32_t, little, unaligned>(D); 2978 InputFileInfo IFI = readInputFileInfo(F, ID); 2979 if (llvm::ErrorOr<const FileEntry *> File = 2980 PP.getFileManager().getFile(IFI.Filename)) 2981 PP.getIncludedFiles().insert(*File); 2982 } 2983 } 2984 2985 llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, 2986 unsigned ClientLoadCapabilities) { 2987 BitstreamCursor &Stream = F.Stream; 2988 2989 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) 2990 return Err; 2991 F.ASTBlockStartOffset = Stream.GetCurrentBitNo(); 2992 2993 // Read all of the records and blocks for the AST file. 2994 RecordData Record; 2995 while (true) { 2996 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2997 if (!MaybeEntry) 2998 return MaybeEntry.takeError(); 2999 llvm::BitstreamEntry Entry = MaybeEntry.get(); 3000 3001 switch (Entry.Kind) { 3002 case llvm::BitstreamEntry::Error: 3003 return llvm::createStringError( 3004 std::errc::illegal_byte_sequence, 3005 "error at end of module block in AST file"); 3006 case llvm::BitstreamEntry::EndBlock: 3007 // Outside of C++, we do not store a lookup map for the translation unit. 3008 // Instead, mark it as needing a lookup map to be built if this module 3009 // contains any declarations lexically within it (which it always does!). 3010 // This usually has no cost, since we very rarely need the lookup map for 3011 // the translation unit outside C++. 3012 if (ASTContext *Ctx = ContextObj) { 3013 DeclContext *DC = Ctx->getTranslationUnitDecl(); 3014 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 3015 DC->setMustBuildLookupTable(); 3016 } 3017 3018 return llvm::Error::success(); 3019 case llvm::BitstreamEntry::SubBlock: 3020 switch (Entry.ID) { 3021 case DECLTYPES_BLOCK_ID: 3022 // We lazily load the decls block, but we want to set up the 3023 // DeclsCursor cursor to point into it. Clone our current bitcode 3024 // cursor to it, enter the block and read the abbrevs in that block. 3025 // With the main cursor, we just skip over it. 3026 F.DeclsCursor = Stream; 3027 if (llvm::Error Err = Stream.SkipBlock()) 3028 return Err; 3029 if (llvm::Error Err = ReadBlockAbbrevs( 3030 F.DeclsCursor, DECLTYPES_BLOCK_ID, &F.DeclsBlockStartOffset)) 3031 return Err; 3032 break; 3033 3034 case PREPROCESSOR_BLOCK_ID: 3035 F.MacroCursor = Stream; 3036 if (!PP.getExternalSource()) 3037 PP.setExternalSource(this); 3038 3039 if (llvm::Error Err = Stream.SkipBlock()) 3040 return Err; 3041 if (llvm::Error Err = 3042 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) 3043 return Err; 3044 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 3045 break; 3046 3047 case PREPROCESSOR_DETAIL_BLOCK_ID: 3048 F.PreprocessorDetailCursor = Stream; 3049 3050 if (llvm::Error Err = Stream.SkipBlock()) { 3051 return Err; 3052 } 3053 if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3054 PREPROCESSOR_DETAIL_BLOCK_ID)) 3055 return Err; 3056 F.PreprocessorDetailStartOffset 3057 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3058 3059 if (!PP.getPreprocessingRecord()) 3060 PP.createPreprocessingRecord(); 3061 if (!PP.getPreprocessingRecord()->getExternalSource()) 3062 PP.getPreprocessingRecord()->SetExternalSource(*this); 3063 break; 3064 3065 case SOURCE_MANAGER_BLOCK_ID: 3066 if (llvm::Error Err = ReadSourceManagerBlock(F)) 3067 return Err; 3068 break; 3069 3070 case SUBMODULE_BLOCK_ID: 3071 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3072 return Err; 3073 break; 3074 3075 case COMMENTS_BLOCK_ID: { 3076 BitstreamCursor C = Stream; 3077 3078 if (llvm::Error Err = Stream.SkipBlock()) 3079 return Err; 3080 if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) 3081 return Err; 3082 CommentsCursors.push_back(std::make_pair(C, &F)); 3083 break; 3084 } 3085 3086 default: 3087 if (llvm::Error Err = Stream.SkipBlock()) 3088 return Err; 3089 break; 3090 } 3091 continue; 3092 3093 case llvm::BitstreamEntry::Record: 3094 // The interesting case. 3095 break; 3096 } 3097 3098 // Read and process a record. 3099 Record.clear(); 3100 StringRef Blob; 3101 Expected<unsigned> MaybeRecordType = 3102 Stream.readRecord(Entry.ID, Record, &Blob); 3103 if (!MaybeRecordType) 3104 return MaybeRecordType.takeError(); 3105 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3106 3107 // If we're not loading an AST context, we don't care about most records. 3108 if (!ContextObj) { 3109 switch (RecordType) { 3110 case IDENTIFIER_TABLE: 3111 case IDENTIFIER_OFFSET: 3112 case INTERESTING_IDENTIFIERS: 3113 case STATISTICS: 3114 case PP_ASSUME_NONNULL_LOC: 3115 case PP_CONDITIONAL_STACK: 3116 case PP_COUNTER_VALUE: 3117 case SOURCE_LOCATION_OFFSETS: 3118 case MODULE_OFFSET_MAP: 3119 case SOURCE_MANAGER_LINE_TABLE: 3120 case SOURCE_LOCATION_PRELOADS: 3121 case PPD_ENTITIES_OFFSETS: 3122 case HEADER_SEARCH_TABLE: 3123 case IMPORTED_MODULES: 3124 case MACRO_OFFSET: 3125 break; 3126 default: 3127 continue; 3128 } 3129 } 3130 3131 switch (RecordType) { 3132 default: // Default behavior: ignore. 3133 break; 3134 3135 case TYPE_OFFSET: { 3136 if (F.LocalNumTypes != 0) 3137 return llvm::createStringError( 3138 std::errc::illegal_byte_sequence, 3139 "duplicate TYPE_OFFSET record in AST file"); 3140 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data()); 3141 F.LocalNumTypes = Record[0]; 3142 unsigned LocalBaseTypeIndex = Record[1]; 3143 F.BaseTypeIndex = getTotalNumTypes(); 3144 3145 if (F.LocalNumTypes > 0) { 3146 // Introduce the global -> local mapping for types within this module. 3147 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3148 3149 // Introduce the local -> global mapping for types within this module. 3150 F.TypeRemap.insertOrReplace( 3151 std::make_pair(LocalBaseTypeIndex, 3152 F.BaseTypeIndex - LocalBaseTypeIndex)); 3153 3154 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3155 } 3156 break; 3157 } 3158 3159 case DECL_OFFSET: { 3160 if (F.LocalNumDecls != 0) 3161 return llvm::createStringError( 3162 std::errc::illegal_byte_sequence, 3163 "duplicate DECL_OFFSET record in AST file"); 3164 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3165 F.LocalNumDecls = Record[0]; 3166 unsigned LocalBaseDeclID = Record[1]; 3167 F.BaseDeclID = getTotalNumDecls(); 3168 3169 if (F.LocalNumDecls > 0) { 3170 // Introduce the global -> local mapping for declarations within this 3171 // module. 3172 GlobalDeclMap.insert( 3173 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3174 3175 // Introduce the local -> global mapping for declarations within this 3176 // module. 3177 F.DeclRemap.insertOrReplace( 3178 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3179 3180 // Introduce the global -> local mapping for declarations within this 3181 // module. 3182 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3183 3184 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3185 } 3186 break; 3187 } 3188 3189 case TU_UPDATE_LEXICAL: { 3190 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3191 LexicalContents Contents( 3192 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3193 Blob.data()), 3194 static_cast<unsigned int>(Blob.size() / 4)); 3195 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3196 TU->setHasExternalLexicalStorage(true); 3197 break; 3198 } 3199 3200 case UPDATE_VISIBLE: { 3201 unsigned Idx = 0; 3202 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3203 auto *Data = (const unsigned char*)Blob.data(); 3204 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3205 // If we've already loaded the decl, perform the updates when we finish 3206 // loading this block. 3207 if (Decl *D = GetExistingDecl(ID)) 3208 PendingUpdateRecords.push_back( 3209 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3210 break; 3211 } 3212 3213 case IDENTIFIER_TABLE: 3214 F.IdentifierTableData = 3215 reinterpret_cast<const unsigned char *>(Blob.data()); 3216 if (Record[0]) { 3217 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3218 F.IdentifierTableData + Record[0], 3219 F.IdentifierTableData + sizeof(uint32_t), 3220 F.IdentifierTableData, 3221 ASTIdentifierLookupTrait(*this, F)); 3222 3223 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3224 } 3225 break; 3226 3227 case IDENTIFIER_OFFSET: { 3228 if (F.LocalNumIdentifiers != 0) 3229 return llvm::createStringError( 3230 std::errc::illegal_byte_sequence, 3231 "duplicate IDENTIFIER_OFFSET record in AST file"); 3232 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3233 F.LocalNumIdentifiers = Record[0]; 3234 unsigned LocalBaseIdentifierID = Record[1]; 3235 F.BaseIdentifierID = getTotalNumIdentifiers(); 3236 3237 if (F.LocalNumIdentifiers > 0) { 3238 // Introduce the global -> local mapping for identifiers within this 3239 // module. 3240 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3241 &F)); 3242 3243 // Introduce the local -> global mapping for identifiers within this 3244 // module. 3245 F.IdentifierRemap.insertOrReplace( 3246 std::make_pair(LocalBaseIdentifierID, 3247 F.BaseIdentifierID - LocalBaseIdentifierID)); 3248 3249 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3250 + F.LocalNumIdentifiers); 3251 } 3252 break; 3253 } 3254 3255 case INTERESTING_IDENTIFIERS: 3256 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3257 break; 3258 3259 case EAGERLY_DESERIALIZED_DECLS: 3260 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3261 // about "interesting" decls (for instance, if we're building a module). 3262 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3263 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3264 break; 3265 3266 case MODULAR_CODEGEN_DECLS: 3267 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3268 // them (ie: if we're not codegenerating this module). 3269 if (F.Kind == MK_MainFile || 3270 getContext().getLangOpts().BuildingPCHWithObjectFile) 3271 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3272 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3273 break; 3274 3275 case SPECIAL_TYPES: 3276 if (SpecialTypes.empty()) { 3277 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3278 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3279 break; 3280 } 3281 3282 if (SpecialTypes.size() != Record.size()) 3283 return llvm::createStringError(std::errc::illegal_byte_sequence, 3284 "invalid special-types record"); 3285 3286 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3287 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3288 if (!SpecialTypes[I]) 3289 SpecialTypes[I] = ID; 3290 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3291 // merge step? 3292 } 3293 break; 3294 3295 case STATISTICS: 3296 TotalNumStatements += Record[0]; 3297 TotalNumMacros += Record[1]; 3298 TotalLexicalDeclContexts += Record[2]; 3299 TotalVisibleDeclContexts += Record[3]; 3300 break; 3301 3302 case UNUSED_FILESCOPED_DECLS: 3303 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3304 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3305 break; 3306 3307 case DELEGATING_CTORS: 3308 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3309 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3310 break; 3311 3312 case WEAK_UNDECLARED_IDENTIFIERS: 3313 if (Record.size() % 3 != 0) 3314 return llvm::createStringError(std::errc::illegal_byte_sequence, 3315 "invalid weak identifiers record"); 3316 3317 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3318 // files. This isn't the way to do it :) 3319 WeakUndeclaredIdentifiers.clear(); 3320 3321 // Translate the weak, undeclared identifiers into global IDs. 3322 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3323 WeakUndeclaredIdentifiers.push_back( 3324 getGlobalIdentifierID(F, Record[I++])); 3325 WeakUndeclaredIdentifiers.push_back( 3326 getGlobalIdentifierID(F, Record[I++])); 3327 WeakUndeclaredIdentifiers.push_back( 3328 ReadSourceLocation(F, Record, I).getRawEncoding()); 3329 } 3330 break; 3331 3332 case SELECTOR_OFFSETS: { 3333 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3334 F.LocalNumSelectors = Record[0]; 3335 unsigned LocalBaseSelectorID = Record[1]; 3336 F.BaseSelectorID = getTotalNumSelectors(); 3337 3338 if (F.LocalNumSelectors > 0) { 3339 // Introduce the global -> local mapping for selectors within this 3340 // module. 3341 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3342 3343 // Introduce the local -> global mapping for selectors within this 3344 // module. 3345 F.SelectorRemap.insertOrReplace( 3346 std::make_pair(LocalBaseSelectorID, 3347 F.BaseSelectorID - LocalBaseSelectorID)); 3348 3349 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3350 } 3351 break; 3352 } 3353 3354 case METHOD_POOL: 3355 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3356 if (Record[0]) 3357 F.SelectorLookupTable 3358 = ASTSelectorLookupTable::Create( 3359 F.SelectorLookupTableData + Record[0], 3360 F.SelectorLookupTableData, 3361 ASTSelectorLookupTrait(*this, F)); 3362 TotalNumMethodPoolEntries += Record[1]; 3363 break; 3364 3365 case REFERENCED_SELECTOR_POOL: 3366 if (!Record.empty()) { 3367 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3368 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3369 Record[Idx++])); 3370 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3371 getRawEncoding()); 3372 } 3373 } 3374 break; 3375 3376 case PP_ASSUME_NONNULL_LOC: { 3377 unsigned Idx = 0; 3378 if (!Record.empty()) 3379 PP.setPreambleRecordedPragmaAssumeNonNullLoc( 3380 ReadSourceLocation(F, Record, Idx)); 3381 break; 3382 } 3383 3384 case PP_CONDITIONAL_STACK: 3385 if (!Record.empty()) { 3386 unsigned Idx = 0, End = Record.size() - 1; 3387 bool ReachedEOFWhileSkipping = Record[Idx++]; 3388 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3389 if (ReachedEOFWhileSkipping) { 3390 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3391 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3392 bool FoundNonSkipPortion = Record[Idx++]; 3393 bool FoundElse = Record[Idx++]; 3394 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3395 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3396 FoundElse, ElseLoc); 3397 } 3398 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3399 while (Idx < End) { 3400 auto Loc = ReadSourceLocation(F, Record, Idx); 3401 bool WasSkipping = Record[Idx++]; 3402 bool FoundNonSkip = Record[Idx++]; 3403 bool FoundElse = Record[Idx++]; 3404 ConditionalStack.push_back( 3405 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3406 } 3407 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3408 } 3409 break; 3410 3411 case PP_COUNTER_VALUE: 3412 if (!Record.empty() && Listener) 3413 Listener->ReadCounter(F, Record[0]); 3414 break; 3415 3416 case FILE_SORTED_DECLS: 3417 F.FileSortedDecls = (const DeclID *)Blob.data(); 3418 F.NumFileSortedDecls = Record[0]; 3419 break; 3420 3421 case SOURCE_LOCATION_OFFSETS: { 3422 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3423 F.LocalNumSLocEntries = Record[0]; 3424 SourceLocation::UIntTy SLocSpaceSize = Record[1]; 3425 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset; 3426 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3427 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3428 SLocSpaceSize); 3429 if (!F.SLocEntryBaseID) 3430 return llvm::createStringError(std::errc::invalid_argument, 3431 "ran out of source locations"); 3432 // Make our entry in the range map. BaseID is negative and growing, so 3433 // we invert it. Because we invert it, though, we need the other end of 3434 // the range. 3435 unsigned RangeStart = 3436 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3437 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3438 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3439 3440 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3441 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0); 3442 GlobalSLocOffsetMap.insert( 3443 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3444 - SLocSpaceSize,&F)); 3445 3446 // Initialize the remapping table. 3447 // Invalid stays invalid. 3448 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3449 // This module. Base was 2 when being compiled. 3450 F.SLocRemap.insertOrReplace(std::make_pair( 3451 2U, static_cast<SourceLocation::IntTy>(F.SLocEntryBaseOffset - 2))); 3452 3453 TotalNumSLocEntries += F.LocalNumSLocEntries; 3454 break; 3455 } 3456 3457 case MODULE_OFFSET_MAP: 3458 F.ModuleOffsetMap = Blob; 3459 break; 3460 3461 case SOURCE_MANAGER_LINE_TABLE: 3462 ParseLineTable(F, Record); 3463 break; 3464 3465 case SOURCE_LOCATION_PRELOADS: { 3466 // Need to transform from the local view (1-based IDs) to the global view, 3467 // which is based off F.SLocEntryBaseID. 3468 if (!F.PreloadSLocEntries.empty()) 3469 return llvm::createStringError( 3470 std::errc::illegal_byte_sequence, 3471 "Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3472 3473 F.PreloadSLocEntries.swap(Record); 3474 break; 3475 } 3476 3477 case EXT_VECTOR_DECLS: 3478 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3479 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3480 break; 3481 3482 case VTABLE_USES: 3483 if (Record.size() % 3 != 0) 3484 return llvm::createStringError(std::errc::illegal_byte_sequence, 3485 "Invalid VTABLE_USES record"); 3486 3487 // Later tables overwrite earlier ones. 3488 // FIXME: Modules will have some trouble with this. This is clearly not 3489 // the right way to do this. 3490 VTableUses.clear(); 3491 3492 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3493 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3494 VTableUses.push_back( 3495 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3496 VTableUses.push_back(Record[Idx++]); 3497 } 3498 break; 3499 3500 case PENDING_IMPLICIT_INSTANTIATIONS: 3501 if (PendingInstantiations.size() % 2 != 0) 3502 return llvm::createStringError( 3503 std::errc::illegal_byte_sequence, 3504 "Invalid existing PendingInstantiations"); 3505 3506 if (Record.size() % 2 != 0) 3507 return llvm::createStringError( 3508 std::errc::illegal_byte_sequence, 3509 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3510 3511 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3512 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3513 PendingInstantiations.push_back( 3514 ReadSourceLocation(F, Record, I).getRawEncoding()); 3515 } 3516 break; 3517 3518 case SEMA_DECL_REFS: 3519 if (Record.size() != 3) 3520 return llvm::createStringError(std::errc::illegal_byte_sequence, 3521 "Invalid SEMA_DECL_REFS block"); 3522 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3523 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3524 break; 3525 3526 case PPD_ENTITIES_OFFSETS: { 3527 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3528 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3529 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3530 3531 unsigned LocalBasePreprocessedEntityID = Record[0]; 3532 3533 unsigned StartingID; 3534 if (!PP.getPreprocessingRecord()) 3535 PP.createPreprocessingRecord(); 3536 if (!PP.getPreprocessingRecord()->getExternalSource()) 3537 PP.getPreprocessingRecord()->SetExternalSource(*this); 3538 StartingID 3539 = PP.getPreprocessingRecord() 3540 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3541 F.BasePreprocessedEntityID = StartingID; 3542 3543 if (F.NumPreprocessedEntities > 0) { 3544 // Introduce the global -> local mapping for preprocessed entities in 3545 // this module. 3546 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3547 3548 // Introduce the local -> global mapping for preprocessed entities in 3549 // this module. 3550 F.PreprocessedEntityRemap.insertOrReplace( 3551 std::make_pair(LocalBasePreprocessedEntityID, 3552 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3553 } 3554 3555 break; 3556 } 3557 3558 case PPD_SKIPPED_RANGES: { 3559 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3560 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3561 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3562 3563 if (!PP.getPreprocessingRecord()) 3564 PP.createPreprocessingRecord(); 3565 if (!PP.getPreprocessingRecord()->getExternalSource()) 3566 PP.getPreprocessingRecord()->SetExternalSource(*this); 3567 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3568 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3569 3570 if (F.NumPreprocessedSkippedRanges > 0) 3571 GlobalSkippedRangeMap.insert( 3572 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3573 break; 3574 } 3575 3576 case DECL_UPDATE_OFFSETS: 3577 if (Record.size() % 2 != 0) 3578 return llvm::createStringError( 3579 std::errc::illegal_byte_sequence, 3580 "invalid DECL_UPDATE_OFFSETS block in AST file"); 3581 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3582 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3583 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3584 3585 // If we've already loaded the decl, perform the updates when we finish 3586 // loading this block. 3587 if (Decl *D = GetExistingDecl(ID)) 3588 PendingUpdateRecords.push_back( 3589 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3590 } 3591 break; 3592 3593 case OBJC_CATEGORIES_MAP: 3594 if (F.LocalNumObjCCategoriesInMap != 0) 3595 return llvm::createStringError( 3596 std::errc::illegal_byte_sequence, 3597 "duplicate OBJC_CATEGORIES_MAP record in AST file"); 3598 3599 F.LocalNumObjCCategoriesInMap = Record[0]; 3600 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3601 break; 3602 3603 case OBJC_CATEGORIES: 3604 F.ObjCCategories.swap(Record); 3605 break; 3606 3607 case CUDA_SPECIAL_DECL_REFS: 3608 // Later tables overwrite earlier ones. 3609 // FIXME: Modules will have trouble with this. 3610 CUDASpecialDeclRefs.clear(); 3611 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3612 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3613 break; 3614 3615 case HEADER_SEARCH_TABLE: 3616 F.HeaderFileInfoTableData = Blob.data(); 3617 F.LocalNumHeaderFileInfos = Record[1]; 3618 if (Record[0]) { 3619 F.HeaderFileInfoTable 3620 = HeaderFileInfoLookupTable::Create( 3621 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3622 (const unsigned char *)F.HeaderFileInfoTableData, 3623 HeaderFileInfoTrait(*this, F, 3624 &PP.getHeaderSearchInfo(), 3625 Blob.data() + Record[2])); 3626 3627 PP.getHeaderSearchInfo().SetExternalSource(this); 3628 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3629 PP.getHeaderSearchInfo().SetExternalLookup(this); 3630 } 3631 break; 3632 3633 case FP_PRAGMA_OPTIONS: 3634 // Later tables overwrite earlier ones. 3635 FPPragmaOptions.swap(Record); 3636 break; 3637 3638 case OPENCL_EXTENSIONS: 3639 for (unsigned I = 0, E = Record.size(); I != E; ) { 3640 auto Name = ReadString(Record, I); 3641 auto &OptInfo = OpenCLExtensions.OptMap[Name]; 3642 OptInfo.Supported = Record[I++] != 0; 3643 OptInfo.Enabled = Record[I++] != 0; 3644 OptInfo.WithPragma = Record[I++] != 0; 3645 OptInfo.Avail = Record[I++]; 3646 OptInfo.Core = Record[I++]; 3647 OptInfo.Opt = Record[I++]; 3648 } 3649 break; 3650 3651 case TENTATIVE_DEFINITIONS: 3652 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3653 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3654 break; 3655 3656 case KNOWN_NAMESPACES: 3657 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3658 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3659 break; 3660 3661 case UNDEFINED_BUT_USED: 3662 if (UndefinedButUsed.size() % 2 != 0) 3663 return llvm::createStringError(std::errc::illegal_byte_sequence, 3664 "Invalid existing UndefinedButUsed"); 3665 3666 if (Record.size() % 2 != 0) 3667 return llvm::createStringError(std::errc::illegal_byte_sequence, 3668 "invalid undefined-but-used record"); 3669 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3670 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3671 UndefinedButUsed.push_back( 3672 ReadSourceLocation(F, Record, I).getRawEncoding()); 3673 } 3674 break; 3675 3676 case DELETE_EXPRS_TO_ANALYZE: 3677 for (unsigned I = 0, N = Record.size(); I != N;) { 3678 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3679 const uint64_t Count = Record[I++]; 3680 DelayedDeleteExprs.push_back(Count); 3681 for (uint64_t C = 0; C < Count; ++C) { 3682 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3683 bool IsArrayForm = Record[I++] == 1; 3684 DelayedDeleteExprs.push_back(IsArrayForm); 3685 } 3686 } 3687 break; 3688 3689 case IMPORTED_MODULES: 3690 if (!F.isModule()) { 3691 // If we aren't loading a module (which has its own exports), make 3692 // all of the imported modules visible. 3693 // FIXME: Deal with macros-only imports. 3694 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3695 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3696 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3697 if (GlobalID) { 3698 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3699 if (DeserializationListener) 3700 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3701 } 3702 } 3703 } 3704 break; 3705 3706 case MACRO_OFFSET: { 3707 if (F.LocalNumMacros != 0) 3708 return llvm::createStringError( 3709 std::errc::illegal_byte_sequence, 3710 "duplicate MACRO_OFFSET record in AST file"); 3711 F.MacroOffsets = (const uint32_t *)Blob.data(); 3712 F.LocalNumMacros = Record[0]; 3713 unsigned LocalBaseMacroID = Record[1]; 3714 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset; 3715 F.BaseMacroID = getTotalNumMacros(); 3716 3717 if (F.LocalNumMacros > 0) { 3718 // Introduce the global -> local mapping for macros within this module. 3719 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3720 3721 // Introduce the local -> global mapping for macros within this module. 3722 F.MacroRemap.insertOrReplace( 3723 std::make_pair(LocalBaseMacroID, 3724 F.BaseMacroID - LocalBaseMacroID)); 3725 3726 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3727 } 3728 break; 3729 } 3730 3731 case PP_INCLUDED_FILES: 3732 readIncludedFiles(F, Blob, PP); 3733 break; 3734 3735 case LATE_PARSED_TEMPLATE: 3736 LateParsedTemplates.emplace_back( 3737 std::piecewise_construct, std::forward_as_tuple(&F), 3738 std::forward_as_tuple(Record.begin(), Record.end())); 3739 break; 3740 3741 case OPTIMIZE_PRAGMA_OPTIONS: 3742 if (Record.size() != 1) 3743 return llvm::createStringError(std::errc::illegal_byte_sequence, 3744 "invalid pragma optimize record"); 3745 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3746 break; 3747 3748 case MSSTRUCT_PRAGMA_OPTIONS: 3749 if (Record.size() != 1) 3750 return llvm::createStringError(std::errc::illegal_byte_sequence, 3751 "invalid pragma ms_struct record"); 3752 PragmaMSStructState = Record[0]; 3753 break; 3754 3755 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3756 if (Record.size() != 2) 3757 return llvm::createStringError( 3758 std::errc::illegal_byte_sequence, 3759 "invalid pragma pointers to members record"); 3760 PragmaMSPointersToMembersState = Record[0]; 3761 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3762 break; 3763 3764 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3765 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3766 UnusedLocalTypedefNameCandidates.push_back( 3767 getGlobalDeclID(F, Record[I])); 3768 break; 3769 3770 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3771 if (Record.size() != 1) 3772 return llvm::createStringError(std::errc::illegal_byte_sequence, 3773 "invalid cuda pragma options record"); 3774 ForceCUDAHostDeviceDepth = Record[0]; 3775 break; 3776 3777 case ALIGN_PACK_PRAGMA_OPTIONS: { 3778 if (Record.size() < 3) 3779 return llvm::createStringError(std::errc::illegal_byte_sequence, 3780 "invalid pragma pack record"); 3781 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]); 3782 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3783 unsigned NumStackEntries = Record[2]; 3784 unsigned Idx = 3; 3785 // Reset the stack when importing a new module. 3786 PragmaAlignPackStack.clear(); 3787 for (unsigned I = 0; I < NumStackEntries; ++I) { 3788 PragmaAlignPackStackEntry Entry; 3789 Entry.Value = ReadAlignPackInfo(Record[Idx++]); 3790 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3791 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3792 PragmaAlignPackStrings.push_back(ReadString(Record, Idx)); 3793 Entry.SlotLabel = PragmaAlignPackStrings.back(); 3794 PragmaAlignPackStack.push_back(Entry); 3795 } 3796 break; 3797 } 3798 3799 case FLOAT_CONTROL_PRAGMA_OPTIONS: { 3800 if (Record.size() < 3) 3801 return llvm::createStringError(std::errc::illegal_byte_sequence, 3802 "invalid pragma float control record"); 3803 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]); 3804 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3805 unsigned NumStackEntries = Record[2]; 3806 unsigned Idx = 3; 3807 // Reset the stack when importing a new module. 3808 FpPragmaStack.clear(); 3809 for (unsigned I = 0; I < NumStackEntries; ++I) { 3810 FpPragmaStackEntry Entry; 3811 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]); 3812 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3813 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3814 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3815 Entry.SlotLabel = FpPragmaStrings.back(); 3816 FpPragmaStack.push_back(Entry); 3817 } 3818 break; 3819 } 3820 3821 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3822 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3823 DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I])); 3824 break; 3825 } 3826 } 3827 } 3828 3829 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3830 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3831 3832 // Additional remapping information. 3833 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3834 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3835 F.ModuleOffsetMap = StringRef(); 3836 3837 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3838 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3839 F.SLocRemap.insert(std::make_pair(0U, 0)); 3840 F.SLocRemap.insert(std::make_pair(2U, 1)); 3841 } 3842 3843 // Continuous range maps we may be updating in our module. 3844 using SLocRemapBuilder = 3845 ContinuousRangeMap<SourceLocation::UIntTy, SourceLocation::IntTy, 3846 2>::Builder; 3847 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3848 SLocRemapBuilder SLocRemap(F.SLocRemap); 3849 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3850 RemapBuilder MacroRemap(F.MacroRemap); 3851 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3852 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3853 RemapBuilder SelectorRemap(F.SelectorRemap); 3854 RemapBuilder DeclRemap(F.DeclRemap); 3855 RemapBuilder TypeRemap(F.TypeRemap); 3856 3857 while (Data < DataEnd) { 3858 // FIXME: Looking up dependency modules by filename is horrible. Let's 3859 // start fixing this with prebuilt, explicit and implicit modules and see 3860 // how it goes... 3861 using namespace llvm::support; 3862 ModuleKind Kind = static_cast<ModuleKind>( 3863 endian::readNext<uint8_t, little, unaligned>(Data)); 3864 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3865 StringRef Name = StringRef((const char*)Data, Len); 3866 Data += Len; 3867 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule || 3868 Kind == MK_ImplicitModule 3869 ? ModuleMgr.lookupByModuleName(Name) 3870 : ModuleMgr.lookupByFileName(Name)); 3871 if (!OM) { 3872 std::string Msg = 3873 "SourceLocation remap refers to unknown module, cannot find "; 3874 Msg.append(std::string(Name)); 3875 Error(Msg); 3876 return; 3877 } 3878 3879 SourceLocation::UIntTy SLocOffset = 3880 endian::readNext<uint32_t, little, unaligned>(Data); 3881 uint32_t IdentifierIDOffset = 3882 endian::readNext<uint32_t, little, unaligned>(Data); 3883 uint32_t MacroIDOffset = 3884 endian::readNext<uint32_t, little, unaligned>(Data); 3885 uint32_t PreprocessedEntityIDOffset = 3886 endian::readNext<uint32_t, little, unaligned>(Data); 3887 uint32_t SubmoduleIDOffset = 3888 endian::readNext<uint32_t, little, unaligned>(Data); 3889 uint32_t SelectorIDOffset = 3890 endian::readNext<uint32_t, little, unaligned>(Data); 3891 uint32_t DeclIDOffset = 3892 endian::readNext<uint32_t, little, unaligned>(Data); 3893 uint32_t TypeIndexOffset = 3894 endian::readNext<uint32_t, little, unaligned>(Data); 3895 3896 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3897 RemapBuilder &Remap) { 3898 constexpr uint32_t None = std::numeric_limits<uint32_t>::max(); 3899 if (Offset != None) 3900 Remap.insert(std::make_pair(Offset, 3901 static_cast<int>(BaseOffset - Offset))); 3902 }; 3903 3904 constexpr SourceLocation::UIntTy SLocNone = 3905 std::numeric_limits<SourceLocation::UIntTy>::max(); 3906 if (SLocOffset != SLocNone) 3907 SLocRemap.insert(std::make_pair( 3908 SLocOffset, static_cast<SourceLocation::IntTy>( 3909 OM->SLocEntryBaseOffset - SLocOffset))); 3910 3911 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3912 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3913 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3914 PreprocessedEntityRemap); 3915 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3916 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3917 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3918 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3919 3920 // Global -> local mappings. 3921 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3922 } 3923 } 3924 3925 ASTReader::ASTReadResult 3926 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3927 const ModuleFile *ImportedBy, 3928 unsigned ClientLoadCapabilities) { 3929 unsigned Idx = 0; 3930 F.ModuleMapPath = ReadPath(F, Record, Idx); 3931 3932 // Try to resolve ModuleName in the current header search context and 3933 // verify that it is found in the same module map file as we saved. If the 3934 // top-level AST file is a main file, skip this check because there is no 3935 // usable header search context. 3936 assert(!F.ModuleName.empty() && 3937 "MODULE_NAME should come before MODULE_MAP_FILE"); 3938 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3939 // An implicitly-loaded module file should have its module listed in some 3940 // module map file that we've already loaded. 3941 Module *M = 3942 PP.getHeaderSearchInfo().lookupModule(F.ModuleName, F.ImportLoc); 3943 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3944 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3945 // Don't emit module relocation error if we have -fno-validate-pch 3946 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 3947 DisableValidationForModuleKind::Module) && 3948 !ModMap) { 3949 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) { 3950 if (auto ASTFE = M ? M->getASTFile() : None) { 3951 // This module was defined by an imported (explicit) module. 3952 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3953 << ASTFE->getName(); 3954 } else { 3955 // This module was built with a different module map. 3956 Diag(diag::err_imported_module_not_found) 3957 << F.ModuleName << F.FileName 3958 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3959 << !ImportedBy; 3960 // In case it was imported by a PCH, there's a chance the user is 3961 // just missing to include the search path to the directory containing 3962 // the modulemap. 3963 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3964 Diag(diag::note_imported_by_pch_module_not_found) 3965 << llvm::sys::path::parent_path(F.ModuleMapPath); 3966 } 3967 } 3968 return OutOfDate; 3969 } 3970 3971 assert(M && M->Name == F.ModuleName && "found module with different name"); 3972 3973 // Check the primary module map file. 3974 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3975 if (!StoredModMap || *StoredModMap != ModMap) { 3976 assert(ModMap && "found module is missing module map file"); 3977 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3978 "top-level import should be verified"); 3979 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3980 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3981 Diag(diag::err_imported_module_modmap_changed) 3982 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3983 << ModMap->getName() << F.ModuleMapPath << NotImported; 3984 return OutOfDate; 3985 } 3986 3987 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3988 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3989 // FIXME: we should use input files rather than storing names. 3990 std::string Filename = ReadPath(F, Record, Idx); 3991 auto SF = FileMgr.getFile(Filename, false, false); 3992 if (!SF) { 3993 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3994 Error("could not find file '" + Filename +"' referenced by AST file"); 3995 return OutOfDate; 3996 } 3997 AdditionalStoredMaps.insert(*SF); 3998 } 3999 4000 // Check any additional module map files (e.g. module.private.modulemap) 4001 // that are not in the pcm. 4002 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 4003 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 4004 // Remove files that match 4005 // Note: SmallPtrSet::erase is really remove 4006 if (!AdditionalStoredMaps.erase(ModMap)) { 4007 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 4008 Diag(diag::err_module_different_modmap) 4009 << F.ModuleName << /*new*/0 << ModMap->getName(); 4010 return OutOfDate; 4011 } 4012 } 4013 } 4014 4015 // Check any additional module map files that are in the pcm, but not 4016 // found in header search. Cases that match are already removed. 4017 for (const FileEntry *ModMap : AdditionalStoredMaps) { 4018 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 4019 Diag(diag::err_module_different_modmap) 4020 << F.ModuleName << /*not new*/1 << ModMap->getName(); 4021 return OutOfDate; 4022 } 4023 } 4024 4025 if (Listener) 4026 Listener->ReadModuleMapFile(F.ModuleMapPath); 4027 return Success; 4028 } 4029 4030 /// Move the given method to the back of the global list of methods. 4031 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4032 // Find the entry for this selector in the method pool. 4033 Sema::GlobalMethodPool::iterator Known 4034 = S.MethodPool.find(Method->getSelector()); 4035 if (Known == S.MethodPool.end()) 4036 return; 4037 4038 // Retrieve the appropriate method list. 4039 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4040 : Known->second.second; 4041 bool Found = false; 4042 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4043 if (!Found) { 4044 if (List->getMethod() == Method) { 4045 Found = true; 4046 } else { 4047 // Keep searching. 4048 continue; 4049 } 4050 } 4051 4052 if (List->getNext()) 4053 List->setMethod(List->getNext()->getMethod()); 4054 else 4055 List->setMethod(Method); 4056 } 4057 } 4058 4059 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4060 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4061 for (Decl *D : Names) { 4062 bool wasHidden = !D->isUnconditionallyVisible(); 4063 D->setVisibleDespiteOwningModule(); 4064 4065 if (wasHidden && SemaObj) { 4066 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4067 moveMethodToBackOfGlobalList(*SemaObj, Method); 4068 } 4069 } 4070 } 4071 } 4072 4073 void ASTReader::makeModuleVisible(Module *Mod, 4074 Module::NameVisibilityKind NameVisibility, 4075 SourceLocation ImportLoc) { 4076 llvm::SmallPtrSet<Module *, 4> Visited; 4077 SmallVector<Module *, 4> Stack; 4078 Stack.push_back(Mod); 4079 while (!Stack.empty()) { 4080 Mod = Stack.pop_back_val(); 4081 4082 if (NameVisibility <= Mod->NameVisibility) { 4083 // This module already has this level of visibility (or greater), so 4084 // there is nothing more to do. 4085 continue; 4086 } 4087 4088 if (Mod->isUnimportable()) { 4089 // Modules that aren't importable cannot be made visible. 4090 continue; 4091 } 4092 4093 // Update the module's name visibility. 4094 Mod->NameVisibility = NameVisibility; 4095 4096 // If we've already deserialized any names from this module, 4097 // mark them as visible. 4098 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4099 if (Hidden != HiddenNamesMap.end()) { 4100 auto HiddenNames = std::move(*Hidden); 4101 HiddenNamesMap.erase(Hidden); 4102 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4103 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4104 "making names visible added hidden names"); 4105 } 4106 4107 // Push any exported modules onto the stack to be marked as visible. 4108 SmallVector<Module *, 16> Exports; 4109 Mod->getExportedModules(Exports); 4110 for (SmallVectorImpl<Module *>::iterator 4111 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4112 Module *Exported = *I; 4113 if (Visited.insert(Exported).second) 4114 Stack.push_back(Exported); 4115 } 4116 } 4117 } 4118 4119 /// We've merged the definition \p MergedDef into the existing definition 4120 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4121 /// visible. 4122 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4123 NamedDecl *MergedDef) { 4124 if (!Def->isUnconditionallyVisible()) { 4125 // If MergedDef is visible or becomes visible, make the definition visible. 4126 if (MergedDef->isUnconditionallyVisible()) 4127 Def->setVisibleDespiteOwningModule(); 4128 else { 4129 getContext().mergeDefinitionIntoModule( 4130 Def, MergedDef->getImportedOwningModule(), 4131 /*NotifyListeners*/ false); 4132 PendingMergedDefinitionsToDeduplicate.insert(Def); 4133 } 4134 } 4135 } 4136 4137 bool ASTReader::loadGlobalIndex() { 4138 if (GlobalIndex) 4139 return false; 4140 4141 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4142 !PP.getLangOpts().Modules) 4143 return true; 4144 4145 // Try to load the global index. 4146 TriedLoadingGlobalIndex = true; 4147 StringRef ModuleCachePath 4148 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4149 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4150 GlobalModuleIndex::readIndex(ModuleCachePath); 4151 if (llvm::Error Err = std::move(Result.second)) { 4152 assert(!Result.first); 4153 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4154 return true; 4155 } 4156 4157 GlobalIndex.reset(Result.first); 4158 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4159 return false; 4160 } 4161 4162 bool ASTReader::isGlobalIndexUnavailable() const { 4163 return PP.getLangOpts().Modules && UseGlobalIndex && 4164 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4165 } 4166 4167 static void updateModuleTimestamp(ModuleFile &MF) { 4168 // Overwrite the timestamp file contents so that file's mtime changes. 4169 std::string TimestampFilename = MF.getTimestampFilename(); 4170 std::error_code EC; 4171 llvm::raw_fd_ostream OS(TimestampFilename, EC, 4172 llvm::sys::fs::OF_TextWithCRLF); 4173 if (EC) 4174 return; 4175 OS << "Timestamp file\n"; 4176 OS.close(); 4177 OS.clear_error(); // Avoid triggering a fatal error. 4178 } 4179 4180 /// Given a cursor at the start of an AST file, scan ahead and drop the 4181 /// cursor into the start of the given block ID, returning false on success and 4182 /// true on failure. 4183 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4184 while (true) { 4185 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4186 if (!MaybeEntry) { 4187 // FIXME this drops errors on the floor. 4188 consumeError(MaybeEntry.takeError()); 4189 return true; 4190 } 4191 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4192 4193 switch (Entry.Kind) { 4194 case llvm::BitstreamEntry::Error: 4195 case llvm::BitstreamEntry::EndBlock: 4196 return true; 4197 4198 case llvm::BitstreamEntry::Record: 4199 // Ignore top-level records. 4200 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4201 break; 4202 else { 4203 // FIXME this drops errors on the floor. 4204 consumeError(Skipped.takeError()); 4205 return true; 4206 } 4207 4208 case llvm::BitstreamEntry::SubBlock: 4209 if (Entry.ID == BlockID) { 4210 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4211 // FIXME this drops the error on the floor. 4212 consumeError(std::move(Err)); 4213 return true; 4214 } 4215 // Found it! 4216 return false; 4217 } 4218 4219 if (llvm::Error Err = Cursor.SkipBlock()) { 4220 // FIXME this drops the error on the floor. 4221 consumeError(std::move(Err)); 4222 return true; 4223 } 4224 } 4225 } 4226 } 4227 4228 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4229 ModuleKind Type, 4230 SourceLocation ImportLoc, 4231 unsigned ClientLoadCapabilities, 4232 SmallVectorImpl<ImportedSubmodule> *Imported) { 4233 llvm::SaveAndRestore<SourceLocation> 4234 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4235 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII( 4236 CurrentDeserializingModuleKind, Type); 4237 4238 // Defer any pending actions until we get to the end of reading the AST file. 4239 Deserializing AnASTFile(this); 4240 4241 // Bump the generation number. 4242 unsigned PreviousGeneration = 0; 4243 if (ContextObj) 4244 PreviousGeneration = incrementGeneration(*ContextObj); 4245 4246 unsigned NumModules = ModuleMgr.size(); 4247 SmallVector<ImportedModule, 4> Loaded; 4248 if (ASTReadResult ReadResult = 4249 ReadASTCore(FileName, Type, ImportLoc, 4250 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(), 4251 ClientLoadCapabilities)) { 4252 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4253 PP.getLangOpts().Modules 4254 ? &PP.getHeaderSearchInfo().getModuleMap() 4255 : nullptr); 4256 4257 // If we find that any modules are unusable, the global index is going 4258 // to be out-of-date. Just remove it. 4259 GlobalIndex.reset(); 4260 ModuleMgr.setGlobalIndex(nullptr); 4261 return ReadResult; 4262 } 4263 4264 // Here comes stuff that we only do once the entire chain is loaded. Do *not* 4265 // remove modules from this point. Various fields are updated during reading 4266 // the AST block and removing the modules would result in dangling pointers. 4267 // They are generally only incidentally dereferenced, ie. a binary search 4268 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to 4269 // be dereferenced but it wouldn't actually be used. 4270 4271 // Load the AST blocks of all of the modules that we loaded. We can still 4272 // hit errors parsing the ASTs at this point. 4273 for (ImportedModule &M : Loaded) { 4274 ModuleFile &F = *M.Mod; 4275 4276 // Read the AST block. 4277 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) { 4278 Error(std::move(Err)); 4279 return Failure; 4280 } 4281 4282 // The AST block should always have a definition for the main module. 4283 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4284 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4285 return Failure; 4286 } 4287 4288 // Read the extension blocks. 4289 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4290 if (llvm::Error Err = ReadExtensionBlock(F)) { 4291 Error(std::move(Err)); 4292 return Failure; 4293 } 4294 } 4295 4296 // Once read, set the ModuleFile bit base offset and update the size in 4297 // bits of all files we've seen. 4298 F.GlobalBitOffset = TotalModulesSizeInBits; 4299 TotalModulesSizeInBits += F.SizeInBits; 4300 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4301 } 4302 4303 // Preload source locations and interesting indentifiers. 4304 for (ImportedModule &M : Loaded) { 4305 ModuleFile &F = *M.Mod; 4306 4307 // Preload SLocEntries. 4308 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4309 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4310 // Load it through the SourceManager and don't call ReadSLocEntry() 4311 // directly because the entry may have already been loaded in which case 4312 // calling ReadSLocEntry() directly would trigger an assertion in 4313 // SourceManager. 4314 SourceMgr.getLoadedSLocEntryByID(Index); 4315 } 4316 4317 // Map the original source file ID into the ID space of the current 4318 // compilation. 4319 if (F.OriginalSourceFileID.isValid()) { 4320 F.OriginalSourceFileID = FileID::get( 4321 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4322 } 4323 4324 // Preload all the pending interesting identifiers by marking them out of 4325 // date. 4326 for (auto Offset : F.PreloadIdentifierOffsets) { 4327 const unsigned char *Data = F.IdentifierTableData + Offset; 4328 4329 ASTIdentifierLookupTrait Trait(*this, F); 4330 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4331 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4332 auto &II = PP.getIdentifierTable().getOwn(Key); 4333 II.setOutOfDate(true); 4334 4335 // Mark this identifier as being from an AST file so that we can track 4336 // whether we need to serialize it. 4337 markIdentifierFromAST(*this, II); 4338 4339 // Associate the ID with the identifier so that the writer can reuse it. 4340 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4341 SetIdentifierInfo(ID, &II); 4342 } 4343 } 4344 4345 // Setup the import locations and notify the module manager that we've 4346 // committed to these module files. 4347 for (ImportedModule &M : Loaded) { 4348 ModuleFile &F = *M.Mod; 4349 4350 ModuleMgr.moduleFileAccepted(&F); 4351 4352 // Set the import location. 4353 F.DirectImportLoc = ImportLoc; 4354 // FIXME: We assume that locations from PCH / preamble do not need 4355 // any translation. 4356 if (!M.ImportedBy) 4357 F.ImportLoc = M.ImportLoc; 4358 else 4359 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4360 } 4361 4362 if (!PP.getLangOpts().CPlusPlus || 4363 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4364 Type != MK_PrebuiltModule)) { 4365 // Mark all of the identifiers in the identifier table as being out of date, 4366 // so that various accessors know to check the loaded modules when the 4367 // identifier is used. 4368 // 4369 // For C++ modules, we don't need information on many identifiers (just 4370 // those that provide macros or are poisoned), so we mark all of 4371 // the interesting ones via PreloadIdentifierOffsets. 4372 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4373 IdEnd = PP.getIdentifierTable().end(); 4374 Id != IdEnd; ++Id) 4375 Id->second->setOutOfDate(true); 4376 } 4377 // Mark selectors as out of date. 4378 for (auto Sel : SelectorGeneration) 4379 SelectorOutOfDate[Sel.first] = true; 4380 4381 // Resolve any unresolved module exports. 4382 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4383 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4384 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4385 Module *ResolvedMod = getSubmodule(GlobalID); 4386 4387 switch (Unresolved.Kind) { 4388 case UnresolvedModuleRef::Conflict: 4389 if (ResolvedMod) { 4390 Module::Conflict Conflict; 4391 Conflict.Other = ResolvedMod; 4392 Conflict.Message = Unresolved.String.str(); 4393 Unresolved.Mod->Conflicts.push_back(Conflict); 4394 } 4395 continue; 4396 4397 case UnresolvedModuleRef::Import: 4398 if (ResolvedMod) 4399 Unresolved.Mod->Imports.insert(ResolvedMod); 4400 continue; 4401 4402 case UnresolvedModuleRef::Export: 4403 if (ResolvedMod || Unresolved.IsWildcard) 4404 Unresolved.Mod->Exports.push_back( 4405 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4406 continue; 4407 } 4408 } 4409 UnresolvedModuleRefs.clear(); 4410 4411 if (Imported) 4412 Imported->append(ImportedModules.begin(), 4413 ImportedModules.end()); 4414 4415 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4416 // Might be unnecessary as use declarations are only used to build the 4417 // module itself. 4418 4419 if (ContextObj) 4420 InitializeContext(); 4421 4422 if (SemaObj) 4423 UpdateSema(); 4424 4425 if (DeserializationListener) 4426 DeserializationListener->ReaderInitialized(this); 4427 4428 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4429 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4430 // If this AST file is a precompiled preamble, then set the 4431 // preamble file ID of the source manager to the file source file 4432 // from which the preamble was built. 4433 if (Type == MK_Preamble) { 4434 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4435 } else if (Type == MK_MainFile) { 4436 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4437 } 4438 } 4439 4440 // For any Objective-C class definitions we have already loaded, make sure 4441 // that we load any additional categories. 4442 if (ContextObj) { 4443 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4444 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4445 ObjCClassesLoaded[I], 4446 PreviousGeneration); 4447 } 4448 } 4449 4450 if (PP.getHeaderSearchInfo() 4451 .getHeaderSearchOpts() 4452 .ModulesValidateOncePerBuildSession) { 4453 // Now we are certain that the module and all modules it depends on are 4454 // up to date. Create or update timestamp files for modules that are 4455 // located in the module cache (not for PCH files that could be anywhere 4456 // in the filesystem). 4457 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4458 ImportedModule &M = Loaded[I]; 4459 if (M.Mod->Kind == MK_ImplicitModule) { 4460 updateModuleTimestamp(*M.Mod); 4461 } 4462 } 4463 } 4464 4465 return Success; 4466 } 4467 4468 static ASTFileSignature readASTFileSignature(StringRef PCH); 4469 4470 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4471 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4472 // FIXME checking magic headers is done in other places such as 4473 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4474 // always done the same. Unify it all with a helper. 4475 if (!Stream.canSkipToPos(4)) 4476 return llvm::createStringError(std::errc::illegal_byte_sequence, 4477 "file too small to contain AST file magic"); 4478 for (unsigned C : {'C', 'P', 'C', 'H'}) 4479 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4480 if (Res.get() != C) 4481 return llvm::createStringError( 4482 std::errc::illegal_byte_sequence, 4483 "file doesn't start with AST file magic"); 4484 } else 4485 return Res.takeError(); 4486 return llvm::Error::success(); 4487 } 4488 4489 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4490 switch (Kind) { 4491 case MK_PCH: 4492 return 0; // PCH 4493 case MK_ImplicitModule: 4494 case MK_ExplicitModule: 4495 case MK_PrebuiltModule: 4496 return 1; // module 4497 case MK_MainFile: 4498 case MK_Preamble: 4499 return 2; // main source file 4500 } 4501 llvm_unreachable("unknown module kind"); 4502 } 4503 4504 ASTReader::ASTReadResult 4505 ASTReader::ReadASTCore(StringRef FileName, 4506 ModuleKind Type, 4507 SourceLocation ImportLoc, 4508 ModuleFile *ImportedBy, 4509 SmallVectorImpl<ImportedModule> &Loaded, 4510 off_t ExpectedSize, time_t ExpectedModTime, 4511 ASTFileSignature ExpectedSignature, 4512 unsigned ClientLoadCapabilities) { 4513 ModuleFile *M; 4514 std::string ErrorStr; 4515 ModuleManager::AddModuleResult AddResult 4516 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4517 getGeneration(), ExpectedSize, ExpectedModTime, 4518 ExpectedSignature, readASTFileSignature, 4519 M, ErrorStr); 4520 4521 switch (AddResult) { 4522 case ModuleManager::AlreadyLoaded: 4523 Diag(diag::remark_module_import) 4524 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4525 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4526 return Success; 4527 4528 case ModuleManager::NewlyLoaded: 4529 // Load module file below. 4530 break; 4531 4532 case ModuleManager::Missing: 4533 // The module file was missing; if the client can handle that, return 4534 // it. 4535 if (ClientLoadCapabilities & ARR_Missing) 4536 return Missing; 4537 4538 // Otherwise, return an error. 4539 Diag(diag::err_ast_file_not_found) 4540 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4541 << ErrorStr; 4542 return Failure; 4543 4544 case ModuleManager::OutOfDate: 4545 // We couldn't load the module file because it is out-of-date. If the 4546 // client can handle out-of-date, return it. 4547 if (ClientLoadCapabilities & ARR_OutOfDate) 4548 return OutOfDate; 4549 4550 // Otherwise, return an error. 4551 Diag(diag::err_ast_file_out_of_date) 4552 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4553 << ErrorStr; 4554 return Failure; 4555 } 4556 4557 assert(M && "Missing module file"); 4558 4559 bool ShouldFinalizePCM = false; 4560 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4561 auto &MC = getModuleManager().getModuleCache(); 4562 if (ShouldFinalizePCM) 4563 MC.finalizePCM(FileName); 4564 else 4565 MC.tryToDropPCM(FileName); 4566 }); 4567 ModuleFile &F = *M; 4568 BitstreamCursor &Stream = F.Stream; 4569 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4570 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4571 4572 // Sniff for the signature. 4573 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4574 Diag(diag::err_ast_file_invalid) 4575 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4576 return Failure; 4577 } 4578 4579 // This is used for compatibility with older PCH formats. 4580 bool HaveReadControlBlock = false; 4581 while (true) { 4582 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4583 if (!MaybeEntry) { 4584 Error(MaybeEntry.takeError()); 4585 return Failure; 4586 } 4587 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4588 4589 switch (Entry.Kind) { 4590 case llvm::BitstreamEntry::Error: 4591 case llvm::BitstreamEntry::Record: 4592 case llvm::BitstreamEntry::EndBlock: 4593 Error("invalid record at top-level of AST file"); 4594 return Failure; 4595 4596 case llvm::BitstreamEntry::SubBlock: 4597 break; 4598 } 4599 4600 switch (Entry.ID) { 4601 case CONTROL_BLOCK_ID: 4602 HaveReadControlBlock = true; 4603 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4604 case Success: 4605 // Check that we didn't try to load a non-module AST file as a module. 4606 // 4607 // FIXME: Should we also perform the converse check? Loading a module as 4608 // a PCH file sort of works, but it's a bit wonky. 4609 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4610 Type == MK_PrebuiltModule) && 4611 F.ModuleName.empty()) { 4612 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4613 if (Result != OutOfDate || 4614 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4615 Diag(diag::err_module_file_not_module) << FileName; 4616 return Result; 4617 } 4618 break; 4619 4620 case Failure: return Failure; 4621 case Missing: return Missing; 4622 case OutOfDate: return OutOfDate; 4623 case VersionMismatch: return VersionMismatch; 4624 case ConfigurationMismatch: return ConfigurationMismatch; 4625 case HadErrors: return HadErrors; 4626 } 4627 break; 4628 4629 case AST_BLOCK_ID: 4630 if (!HaveReadControlBlock) { 4631 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4632 Diag(diag::err_pch_version_too_old); 4633 return VersionMismatch; 4634 } 4635 4636 // Record that we've loaded this module. 4637 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4638 ShouldFinalizePCM = true; 4639 return Success; 4640 4641 case UNHASHED_CONTROL_BLOCK_ID: 4642 // This block is handled using look-ahead during ReadControlBlock. We 4643 // shouldn't get here! 4644 Error("malformed block record in AST file"); 4645 return Failure; 4646 4647 default: 4648 if (llvm::Error Err = Stream.SkipBlock()) { 4649 Error(std::move(Err)); 4650 return Failure; 4651 } 4652 break; 4653 } 4654 } 4655 4656 llvm_unreachable("unexpected break; expected return"); 4657 } 4658 4659 ASTReader::ASTReadResult 4660 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4661 unsigned ClientLoadCapabilities) { 4662 const HeaderSearchOptions &HSOpts = 4663 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4664 bool AllowCompatibleConfigurationMismatch = 4665 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4666 bool DisableValidation = shouldDisableValidationForFile(F); 4667 4668 ASTReadResult Result = readUnhashedControlBlockImpl( 4669 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4670 Listener.get(), 4671 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4672 4673 // If F was directly imported by another module, it's implicitly validated by 4674 // the importing module. 4675 if (DisableValidation || WasImportedBy || 4676 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4677 return Success; 4678 4679 if (Result == Failure) { 4680 Error("malformed block record in AST file"); 4681 return Failure; 4682 } 4683 4684 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4685 // If this module has already been finalized in the ModuleCache, we're stuck 4686 // with it; we can only load a single version of each module. 4687 // 4688 // This can happen when a module is imported in two contexts: in one, as a 4689 // user module; in another, as a system module (due to an import from 4690 // another module marked with the [system] flag). It usually indicates a 4691 // bug in the module map: this module should also be marked with [system]. 4692 // 4693 // If -Wno-system-headers (the default), and the first import is as a 4694 // system module, then validation will fail during the as-user import, 4695 // since -Werror flags won't have been validated. However, it's reasonable 4696 // to treat this consistently as a system module. 4697 // 4698 // If -Wsystem-headers, the PCM on disk was built with 4699 // -Wno-system-headers, and the first import is as a user module, then 4700 // validation will fail during the as-system import since the PCM on disk 4701 // doesn't guarantee that -Werror was respected. However, the -Werror 4702 // flags were checked during the initial as-user import. 4703 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4704 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4705 return Success; 4706 } 4707 } 4708 4709 return Result; 4710 } 4711 4712 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4713 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4714 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4715 bool ValidateDiagnosticOptions) { 4716 // Initialize a stream. 4717 BitstreamCursor Stream(StreamData); 4718 4719 // Sniff for the signature. 4720 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4721 // FIXME this drops the error on the floor. 4722 consumeError(std::move(Err)); 4723 return Failure; 4724 } 4725 4726 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4727 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4728 return Failure; 4729 4730 // Read all of the records in the options block. 4731 RecordData Record; 4732 ASTReadResult Result = Success; 4733 while (true) { 4734 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4735 if (!MaybeEntry) { 4736 // FIXME this drops the error on the floor. 4737 consumeError(MaybeEntry.takeError()); 4738 return Failure; 4739 } 4740 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4741 4742 switch (Entry.Kind) { 4743 case llvm::BitstreamEntry::Error: 4744 case llvm::BitstreamEntry::SubBlock: 4745 return Failure; 4746 4747 case llvm::BitstreamEntry::EndBlock: 4748 return Result; 4749 4750 case llvm::BitstreamEntry::Record: 4751 // The interesting case. 4752 break; 4753 } 4754 4755 // Read and process a record. 4756 Record.clear(); 4757 StringRef Blob; 4758 Expected<unsigned> MaybeRecordType = 4759 Stream.readRecord(Entry.ID, Record, &Blob); 4760 if (!MaybeRecordType) { 4761 // FIXME this drops the error. 4762 return Failure; 4763 } 4764 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4765 case SIGNATURE: 4766 if (F) 4767 F->Signature = ASTFileSignature::create(Record.begin(), Record.end()); 4768 break; 4769 case AST_BLOCK_HASH: 4770 if (F) 4771 F->ASTBlockHash = 4772 ASTFileSignature::create(Record.begin(), Record.end()); 4773 break; 4774 case DIAGNOSTIC_OPTIONS: { 4775 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4776 if (Listener && ValidateDiagnosticOptions && 4777 !AllowCompatibleConfigurationMismatch && 4778 ParseDiagnosticOptions(Record, Complain, *Listener)) 4779 Result = OutOfDate; // Don't return early. Read the signature. 4780 break; 4781 } 4782 case DIAG_PRAGMA_MAPPINGS: 4783 if (!F) 4784 break; 4785 if (F->PragmaDiagMappings.empty()) 4786 F->PragmaDiagMappings.swap(Record); 4787 else 4788 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4789 Record.begin(), Record.end()); 4790 break; 4791 case HEADER_SEARCH_ENTRY_USAGE: 4792 if (!F) 4793 break; 4794 unsigned Count = Record[0]; 4795 const char *Byte = Blob.data(); 4796 F->SearchPathUsage = llvm::BitVector(Count, false); 4797 for (unsigned I = 0; I < Count; ++Byte) 4798 for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I) 4799 if (*Byte & (1 << Bit)) 4800 F->SearchPathUsage[I] = true; 4801 break; 4802 } 4803 } 4804 } 4805 4806 /// Parse a record and blob containing module file extension metadata. 4807 static bool parseModuleFileExtensionMetadata( 4808 const SmallVectorImpl<uint64_t> &Record, 4809 StringRef Blob, 4810 ModuleFileExtensionMetadata &Metadata) { 4811 if (Record.size() < 4) return true; 4812 4813 Metadata.MajorVersion = Record[0]; 4814 Metadata.MinorVersion = Record[1]; 4815 4816 unsigned BlockNameLen = Record[2]; 4817 unsigned UserInfoLen = Record[3]; 4818 4819 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4820 4821 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4822 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4823 Blob.data() + BlockNameLen + UserInfoLen); 4824 return false; 4825 } 4826 4827 llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) { 4828 BitstreamCursor &Stream = F.Stream; 4829 4830 RecordData Record; 4831 while (true) { 4832 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4833 if (!MaybeEntry) 4834 return MaybeEntry.takeError(); 4835 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4836 4837 switch (Entry.Kind) { 4838 case llvm::BitstreamEntry::SubBlock: 4839 if (llvm::Error Err = Stream.SkipBlock()) 4840 return Err; 4841 continue; 4842 case llvm::BitstreamEntry::EndBlock: 4843 return llvm::Error::success(); 4844 case llvm::BitstreamEntry::Error: 4845 return llvm::createStringError(std::errc::illegal_byte_sequence, 4846 "malformed block record in AST file"); 4847 case llvm::BitstreamEntry::Record: 4848 break; 4849 } 4850 4851 Record.clear(); 4852 StringRef Blob; 4853 Expected<unsigned> MaybeRecCode = 4854 Stream.readRecord(Entry.ID, Record, &Blob); 4855 if (!MaybeRecCode) 4856 return MaybeRecCode.takeError(); 4857 switch (MaybeRecCode.get()) { 4858 case EXTENSION_METADATA: { 4859 ModuleFileExtensionMetadata Metadata; 4860 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 4861 return llvm::createStringError( 4862 std::errc::illegal_byte_sequence, 4863 "malformed EXTENSION_METADATA in AST file"); 4864 4865 // Find a module file extension with this block name. 4866 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4867 if (Known == ModuleFileExtensions.end()) break; 4868 4869 // Form a reader. 4870 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4871 F, Stream)) { 4872 F.ExtensionReaders.push_back(std::move(Reader)); 4873 } 4874 4875 break; 4876 } 4877 } 4878 } 4879 4880 return llvm::Error::success(); 4881 } 4882 4883 void ASTReader::InitializeContext() { 4884 assert(ContextObj && "no context to initialize"); 4885 ASTContext &Context = *ContextObj; 4886 4887 // If there's a listener, notify them that we "read" the translation unit. 4888 if (DeserializationListener) 4889 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4890 Context.getTranslationUnitDecl()); 4891 4892 // FIXME: Find a better way to deal with collisions between these 4893 // built-in types. Right now, we just ignore the problem. 4894 4895 // Load the special types. 4896 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4897 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4898 if (!Context.CFConstantStringTypeDecl) 4899 Context.setCFConstantStringType(GetType(String)); 4900 } 4901 4902 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4903 QualType FileType = GetType(File); 4904 if (FileType.isNull()) { 4905 Error("FILE type is NULL"); 4906 return; 4907 } 4908 4909 if (!Context.FILEDecl) { 4910 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4911 Context.setFILEDecl(Typedef->getDecl()); 4912 else { 4913 const TagType *Tag = FileType->getAs<TagType>(); 4914 if (!Tag) { 4915 Error("Invalid FILE type in AST file"); 4916 return; 4917 } 4918 Context.setFILEDecl(Tag->getDecl()); 4919 } 4920 } 4921 } 4922 4923 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4924 QualType Jmp_bufType = GetType(Jmp_buf); 4925 if (Jmp_bufType.isNull()) { 4926 Error("jmp_buf type is NULL"); 4927 return; 4928 } 4929 4930 if (!Context.jmp_bufDecl) { 4931 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4932 Context.setjmp_bufDecl(Typedef->getDecl()); 4933 else { 4934 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4935 if (!Tag) { 4936 Error("Invalid jmp_buf type in AST file"); 4937 return; 4938 } 4939 Context.setjmp_bufDecl(Tag->getDecl()); 4940 } 4941 } 4942 } 4943 4944 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4945 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4946 if (Sigjmp_bufType.isNull()) { 4947 Error("sigjmp_buf type is NULL"); 4948 return; 4949 } 4950 4951 if (!Context.sigjmp_bufDecl) { 4952 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4953 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4954 else { 4955 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4956 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4957 Context.setsigjmp_bufDecl(Tag->getDecl()); 4958 } 4959 } 4960 } 4961 4962 if (unsigned ObjCIdRedef 4963 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4964 if (Context.ObjCIdRedefinitionType.isNull()) 4965 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4966 } 4967 4968 if (unsigned ObjCClassRedef 4969 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4970 if (Context.ObjCClassRedefinitionType.isNull()) 4971 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4972 } 4973 4974 if (unsigned ObjCSelRedef 4975 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4976 if (Context.ObjCSelRedefinitionType.isNull()) 4977 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4978 } 4979 4980 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4981 QualType Ucontext_tType = GetType(Ucontext_t); 4982 if (Ucontext_tType.isNull()) { 4983 Error("ucontext_t type is NULL"); 4984 return; 4985 } 4986 4987 if (!Context.ucontext_tDecl) { 4988 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4989 Context.setucontext_tDecl(Typedef->getDecl()); 4990 else { 4991 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4992 assert(Tag && "Invalid ucontext_t type in AST file"); 4993 Context.setucontext_tDecl(Tag->getDecl()); 4994 } 4995 } 4996 } 4997 } 4998 4999 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 5000 5001 // If there were any CUDA special declarations, deserialize them. 5002 if (!CUDASpecialDeclRefs.empty()) { 5003 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 5004 Context.setcudaConfigureCallDecl( 5005 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 5006 } 5007 5008 // Re-export any modules that were imported by a non-module AST file. 5009 // FIXME: This does not make macro-only imports visible again. 5010 for (auto &Import : ImportedModules) { 5011 if (Module *Imported = getSubmodule(Import.ID)) { 5012 makeModuleVisible(Imported, Module::AllVisible, 5013 /*ImportLoc=*/Import.ImportLoc); 5014 if (Import.ImportLoc.isValid()) 5015 PP.makeModuleVisible(Imported, Import.ImportLoc); 5016 // This updates visibility for Preprocessor only. For Sema, which can be 5017 // nullptr here, we do the same later, in UpdateSema(). 5018 } 5019 } 5020 } 5021 5022 void ASTReader::finalizeForWriting() { 5023 // Nothing to do for now. 5024 } 5025 5026 /// Reads and return the signature record from \p PCH's control block, or 5027 /// else returns 0. 5028 static ASTFileSignature readASTFileSignature(StringRef PCH) { 5029 BitstreamCursor Stream(PCH); 5030 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5031 // FIXME this drops the error on the floor. 5032 consumeError(std::move(Err)); 5033 return ASTFileSignature(); 5034 } 5035 5036 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5037 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 5038 return ASTFileSignature(); 5039 5040 // Scan for SIGNATURE inside the diagnostic options block. 5041 ASTReader::RecordData Record; 5042 while (true) { 5043 Expected<llvm::BitstreamEntry> MaybeEntry = 5044 Stream.advanceSkippingSubblocks(); 5045 if (!MaybeEntry) { 5046 // FIXME this drops the error on the floor. 5047 consumeError(MaybeEntry.takeError()); 5048 return ASTFileSignature(); 5049 } 5050 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5051 5052 if (Entry.Kind != llvm::BitstreamEntry::Record) 5053 return ASTFileSignature(); 5054 5055 Record.clear(); 5056 StringRef Blob; 5057 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5058 if (!MaybeRecord) { 5059 // FIXME this drops the error on the floor. 5060 consumeError(MaybeRecord.takeError()); 5061 return ASTFileSignature(); 5062 } 5063 if (SIGNATURE == MaybeRecord.get()) 5064 return ASTFileSignature::create(Record.begin(), 5065 Record.begin() + ASTFileSignature::size); 5066 } 5067 } 5068 5069 /// Retrieve the name of the original source file name 5070 /// directly from the AST file, without actually loading the AST 5071 /// file. 5072 std::string ASTReader::getOriginalSourceFile( 5073 const std::string &ASTFileName, FileManager &FileMgr, 5074 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5075 // Open the AST file. 5076 auto Buffer = FileMgr.getBufferForFile(ASTFileName, /*IsVolatile=*/false, 5077 /*RequiresNullTerminator=*/false); 5078 if (!Buffer) { 5079 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5080 << ASTFileName << Buffer.getError().message(); 5081 return std::string(); 5082 } 5083 5084 // Initialize the stream 5085 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5086 5087 // Sniff for the signature. 5088 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5089 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5090 return std::string(); 5091 } 5092 5093 // Scan for the CONTROL_BLOCK_ID block. 5094 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5095 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5096 return std::string(); 5097 } 5098 5099 // Scan for ORIGINAL_FILE inside the control block. 5100 RecordData Record; 5101 while (true) { 5102 Expected<llvm::BitstreamEntry> MaybeEntry = 5103 Stream.advanceSkippingSubblocks(); 5104 if (!MaybeEntry) { 5105 // FIXME this drops errors on the floor. 5106 consumeError(MaybeEntry.takeError()); 5107 return std::string(); 5108 } 5109 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5110 5111 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5112 return std::string(); 5113 5114 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5115 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5116 return std::string(); 5117 } 5118 5119 Record.clear(); 5120 StringRef Blob; 5121 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5122 if (!MaybeRecord) { 5123 // FIXME this drops the errors on the floor. 5124 consumeError(MaybeRecord.takeError()); 5125 return std::string(); 5126 } 5127 if (ORIGINAL_FILE == MaybeRecord.get()) 5128 return Blob.str(); 5129 } 5130 } 5131 5132 namespace { 5133 5134 class SimplePCHValidator : public ASTReaderListener { 5135 const LangOptions &ExistingLangOpts; 5136 const TargetOptions &ExistingTargetOpts; 5137 const PreprocessorOptions &ExistingPPOpts; 5138 std::string ExistingModuleCachePath; 5139 FileManager &FileMgr; 5140 5141 public: 5142 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5143 const TargetOptions &ExistingTargetOpts, 5144 const PreprocessorOptions &ExistingPPOpts, 5145 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5146 : ExistingLangOpts(ExistingLangOpts), 5147 ExistingTargetOpts(ExistingTargetOpts), 5148 ExistingPPOpts(ExistingPPOpts), 5149 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5150 5151 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5152 bool AllowCompatibleDifferences) override { 5153 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5154 AllowCompatibleDifferences); 5155 } 5156 5157 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5158 bool AllowCompatibleDifferences) override { 5159 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5160 AllowCompatibleDifferences); 5161 } 5162 5163 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5164 StringRef SpecificModuleCachePath, 5165 bool Complain) override { 5166 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5167 ExistingModuleCachePath, nullptr, 5168 ExistingLangOpts, ExistingPPOpts); 5169 } 5170 5171 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5172 bool Complain, 5173 std::string &SuggestedPredefines) override { 5174 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5175 SuggestedPredefines, ExistingLangOpts); 5176 } 5177 }; 5178 5179 } // namespace 5180 5181 bool ASTReader::readASTFileControlBlock( 5182 StringRef Filename, FileManager &FileMgr, 5183 const PCHContainerReader &PCHContainerRdr, 5184 bool FindModuleFileExtensions, 5185 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5186 // Open the AST file. 5187 // FIXME: This allows use of the VFS; we do not allow use of the 5188 // VFS when actually loading a module. 5189 auto Buffer = FileMgr.getBufferForFile(Filename); 5190 if (!Buffer) { 5191 return true; 5192 } 5193 5194 // Initialize the stream 5195 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5196 BitstreamCursor Stream(Bytes); 5197 5198 // Sniff for the signature. 5199 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5200 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5201 return true; 5202 } 5203 5204 // Scan for the CONTROL_BLOCK_ID block. 5205 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5206 return true; 5207 5208 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5209 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5210 bool NeedsImports = Listener.needsImportVisitation(); 5211 BitstreamCursor InputFilesCursor; 5212 5213 RecordData Record; 5214 std::string ModuleDir; 5215 bool DoneWithControlBlock = false; 5216 while (!DoneWithControlBlock) { 5217 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5218 if (!MaybeEntry) { 5219 // FIXME this drops the error on the floor. 5220 consumeError(MaybeEntry.takeError()); 5221 return true; 5222 } 5223 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5224 5225 switch (Entry.Kind) { 5226 case llvm::BitstreamEntry::SubBlock: { 5227 switch (Entry.ID) { 5228 case OPTIONS_BLOCK_ID: { 5229 std::string IgnoredSuggestedPredefines; 5230 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5231 /*AllowCompatibleConfigurationMismatch*/ false, 5232 Listener, IgnoredSuggestedPredefines) != Success) 5233 return true; 5234 break; 5235 } 5236 5237 case INPUT_FILES_BLOCK_ID: 5238 InputFilesCursor = Stream; 5239 if (llvm::Error Err = Stream.SkipBlock()) { 5240 // FIXME this drops the error on the floor. 5241 consumeError(std::move(Err)); 5242 return true; 5243 } 5244 if (NeedsInputFiles && 5245 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5246 return true; 5247 break; 5248 5249 default: 5250 if (llvm::Error Err = Stream.SkipBlock()) { 5251 // FIXME this drops the error on the floor. 5252 consumeError(std::move(Err)); 5253 return true; 5254 } 5255 break; 5256 } 5257 5258 continue; 5259 } 5260 5261 case llvm::BitstreamEntry::EndBlock: 5262 DoneWithControlBlock = true; 5263 break; 5264 5265 case llvm::BitstreamEntry::Error: 5266 return true; 5267 5268 case llvm::BitstreamEntry::Record: 5269 break; 5270 } 5271 5272 if (DoneWithControlBlock) break; 5273 5274 Record.clear(); 5275 StringRef Blob; 5276 Expected<unsigned> MaybeRecCode = 5277 Stream.readRecord(Entry.ID, Record, &Blob); 5278 if (!MaybeRecCode) { 5279 // FIXME this drops the error. 5280 return Failure; 5281 } 5282 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5283 case METADATA: 5284 if (Record[0] != VERSION_MAJOR) 5285 return true; 5286 if (Listener.ReadFullVersionInformation(Blob)) 5287 return true; 5288 break; 5289 case MODULE_NAME: 5290 Listener.ReadModuleName(Blob); 5291 break; 5292 case MODULE_DIRECTORY: 5293 ModuleDir = std::string(Blob); 5294 break; 5295 case MODULE_MAP_FILE: { 5296 unsigned Idx = 0; 5297 auto Path = ReadString(Record, Idx); 5298 ResolveImportedPath(Path, ModuleDir); 5299 Listener.ReadModuleMapFile(Path); 5300 break; 5301 } 5302 case INPUT_FILE_OFFSETS: { 5303 if (!NeedsInputFiles) 5304 break; 5305 5306 unsigned NumInputFiles = Record[0]; 5307 unsigned NumUserFiles = Record[1]; 5308 const llvm::support::unaligned_uint64_t *InputFileOffs = 5309 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5310 for (unsigned I = 0; I != NumInputFiles; ++I) { 5311 // Go find this input file. 5312 bool isSystemFile = I >= NumUserFiles; 5313 5314 if (isSystemFile && !NeedsSystemInputFiles) 5315 break; // the rest are system input files 5316 5317 BitstreamCursor &Cursor = InputFilesCursor; 5318 SavedStreamPosition SavedPosition(Cursor); 5319 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5320 // FIXME this drops errors on the floor. 5321 consumeError(std::move(Err)); 5322 } 5323 5324 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5325 if (!MaybeCode) { 5326 // FIXME this drops errors on the floor. 5327 consumeError(MaybeCode.takeError()); 5328 } 5329 unsigned Code = MaybeCode.get(); 5330 5331 RecordData Record; 5332 StringRef Blob; 5333 bool shouldContinue = false; 5334 Expected<unsigned> MaybeRecordType = 5335 Cursor.readRecord(Code, Record, &Blob); 5336 if (!MaybeRecordType) { 5337 // FIXME this drops errors on the floor. 5338 consumeError(MaybeRecordType.takeError()); 5339 } 5340 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5341 case INPUT_FILE_HASH: 5342 break; 5343 case INPUT_FILE: 5344 bool Overridden = static_cast<bool>(Record[3]); 5345 std::string Filename = std::string(Blob); 5346 ResolveImportedPath(Filename, ModuleDir); 5347 shouldContinue = Listener.visitInputFile( 5348 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5349 break; 5350 } 5351 if (!shouldContinue) 5352 break; 5353 } 5354 break; 5355 } 5356 5357 case IMPORTS: { 5358 if (!NeedsImports) 5359 break; 5360 5361 unsigned Idx = 0, N = Record.size(); 5362 while (Idx < N) { 5363 // Read information about the AST file. 5364 Idx += 5365 1 + 1 + 1 + 1 + 5366 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature 5367 std::string ModuleName = ReadString(Record, Idx); 5368 std::string Filename = ReadString(Record, Idx); 5369 ResolveImportedPath(Filename, ModuleDir); 5370 Listener.visitImport(ModuleName, Filename); 5371 } 5372 break; 5373 } 5374 5375 default: 5376 // No other validation to perform. 5377 break; 5378 } 5379 } 5380 5381 // Look for module file extension blocks, if requested. 5382 if (FindModuleFileExtensions) { 5383 BitstreamCursor SavedStream = Stream; 5384 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5385 bool DoneWithExtensionBlock = false; 5386 while (!DoneWithExtensionBlock) { 5387 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5388 if (!MaybeEntry) { 5389 // FIXME this drops the error. 5390 return true; 5391 } 5392 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5393 5394 switch (Entry.Kind) { 5395 case llvm::BitstreamEntry::SubBlock: 5396 if (llvm::Error Err = Stream.SkipBlock()) { 5397 // FIXME this drops the error on the floor. 5398 consumeError(std::move(Err)); 5399 return true; 5400 } 5401 continue; 5402 5403 case llvm::BitstreamEntry::EndBlock: 5404 DoneWithExtensionBlock = true; 5405 continue; 5406 5407 case llvm::BitstreamEntry::Error: 5408 return true; 5409 5410 case llvm::BitstreamEntry::Record: 5411 break; 5412 } 5413 5414 Record.clear(); 5415 StringRef Blob; 5416 Expected<unsigned> MaybeRecCode = 5417 Stream.readRecord(Entry.ID, Record, &Blob); 5418 if (!MaybeRecCode) { 5419 // FIXME this drops the error. 5420 return true; 5421 } 5422 switch (MaybeRecCode.get()) { 5423 case EXTENSION_METADATA: { 5424 ModuleFileExtensionMetadata Metadata; 5425 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5426 return true; 5427 5428 Listener.readModuleFileExtension(Metadata); 5429 break; 5430 } 5431 } 5432 } 5433 } 5434 Stream = SavedStream; 5435 } 5436 5437 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5438 if (readUnhashedControlBlockImpl( 5439 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5440 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5441 ValidateDiagnosticOptions) != Success) 5442 return true; 5443 5444 return false; 5445 } 5446 5447 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5448 const PCHContainerReader &PCHContainerRdr, 5449 const LangOptions &LangOpts, 5450 const TargetOptions &TargetOpts, 5451 const PreprocessorOptions &PPOpts, 5452 StringRef ExistingModuleCachePath) { 5453 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5454 ExistingModuleCachePath, FileMgr); 5455 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5456 /*FindModuleFileExtensions=*/false, 5457 validator, 5458 /*ValidateDiagnosticOptions=*/true); 5459 } 5460 5461 llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F, 5462 unsigned ClientLoadCapabilities) { 5463 // Enter the submodule block. 5464 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) 5465 return Err; 5466 5467 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5468 bool First = true; 5469 Module *CurrentModule = nullptr; 5470 RecordData Record; 5471 while (true) { 5472 Expected<llvm::BitstreamEntry> MaybeEntry = 5473 F.Stream.advanceSkippingSubblocks(); 5474 if (!MaybeEntry) 5475 return MaybeEntry.takeError(); 5476 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5477 5478 switch (Entry.Kind) { 5479 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5480 case llvm::BitstreamEntry::Error: 5481 return llvm::createStringError(std::errc::illegal_byte_sequence, 5482 "malformed block record in AST file"); 5483 case llvm::BitstreamEntry::EndBlock: 5484 return llvm::Error::success(); 5485 case llvm::BitstreamEntry::Record: 5486 // The interesting case. 5487 break; 5488 } 5489 5490 // Read a record. 5491 StringRef Blob; 5492 Record.clear(); 5493 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5494 if (!MaybeKind) 5495 return MaybeKind.takeError(); 5496 unsigned Kind = MaybeKind.get(); 5497 5498 if ((Kind == SUBMODULE_METADATA) != First) 5499 return llvm::createStringError( 5500 std::errc::illegal_byte_sequence, 5501 "submodule metadata record should be at beginning of block"); 5502 First = false; 5503 5504 // Submodule information is only valid if we have a current module. 5505 // FIXME: Should we error on these cases? 5506 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5507 Kind != SUBMODULE_DEFINITION) 5508 continue; 5509 5510 switch (Kind) { 5511 default: // Default behavior: ignore. 5512 break; 5513 5514 case SUBMODULE_DEFINITION: { 5515 if (Record.size() < 12) 5516 return llvm::createStringError(std::errc::illegal_byte_sequence, 5517 "malformed module definition"); 5518 5519 StringRef Name = Blob; 5520 unsigned Idx = 0; 5521 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5522 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5523 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5524 bool IsFramework = Record[Idx++]; 5525 bool IsExplicit = Record[Idx++]; 5526 bool IsSystem = Record[Idx++]; 5527 bool IsExternC = Record[Idx++]; 5528 bool InferSubmodules = Record[Idx++]; 5529 bool InferExplicitSubmodules = Record[Idx++]; 5530 bool InferExportWildcard = Record[Idx++]; 5531 bool ConfigMacrosExhaustive = Record[Idx++]; 5532 bool ModuleMapIsPrivate = Record[Idx++]; 5533 5534 Module *ParentModule = nullptr; 5535 if (Parent) 5536 ParentModule = getSubmodule(Parent); 5537 5538 // Retrieve this (sub)module from the module map, creating it if 5539 // necessary. 5540 CurrentModule = 5541 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5542 .first; 5543 5544 // FIXME: set the definition loc for CurrentModule, or call 5545 // ModMap.setInferredModuleAllowedBy() 5546 5547 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5548 if (GlobalIndex >= SubmodulesLoaded.size() || 5549 SubmodulesLoaded[GlobalIndex]) 5550 return llvm::createStringError(std::errc::invalid_argument, 5551 "too many submodules"); 5552 5553 if (!ParentModule) { 5554 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5555 // Don't emit module relocation error if we have -fno-validate-pch 5556 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 5557 DisableValidationForModuleKind::Module) && 5558 CurFile != F.File) { 5559 auto ConflictError = 5560 PartialDiagnostic(diag::err_module_file_conflict, 5561 ContextObj->DiagAllocator) 5562 << CurrentModule->getTopLevelModuleName() << CurFile->getName() 5563 << F.File->getName(); 5564 return DiagnosticError::create(CurrentImportLoc, ConflictError); 5565 } 5566 } 5567 5568 F.DidReadTopLevelSubmodule = true; 5569 CurrentModule->setASTFile(F.File); 5570 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5571 } 5572 5573 CurrentModule->Kind = Kind; 5574 CurrentModule->Signature = F.Signature; 5575 CurrentModule->IsFromModuleFile = true; 5576 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5577 CurrentModule->IsExternC = IsExternC; 5578 CurrentModule->InferSubmodules = InferSubmodules; 5579 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5580 CurrentModule->InferExportWildcard = InferExportWildcard; 5581 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5582 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5583 if (DeserializationListener) 5584 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5585 5586 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5587 5588 // Clear out data that will be replaced by what is in the module file. 5589 CurrentModule->LinkLibraries.clear(); 5590 CurrentModule->ConfigMacros.clear(); 5591 CurrentModule->UnresolvedConflicts.clear(); 5592 CurrentModule->Conflicts.clear(); 5593 5594 // The module is available unless it's missing a requirement; relevant 5595 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5596 // Missing headers that were present when the module was built do not 5597 // make it unavailable -- if we got this far, this must be an explicitly 5598 // imported module file. 5599 CurrentModule->Requirements.clear(); 5600 CurrentModule->MissingHeaders.clear(); 5601 CurrentModule->IsUnimportable = 5602 ParentModule && ParentModule->IsUnimportable; 5603 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable; 5604 break; 5605 } 5606 5607 case SUBMODULE_UMBRELLA_HEADER: { 5608 // FIXME: This doesn't work for framework modules as `Filename` is the 5609 // name as written in the module file and does not include 5610 // `Headers/`, so this path will never exist. 5611 std::string Filename = std::string(Blob); 5612 ResolveImportedPath(F, Filename); 5613 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5614 if (!CurrentModule->getUmbrellaHeader()) { 5615 // FIXME: NameAsWritten 5616 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob, ""); 5617 } 5618 // Note that it's too late at this point to return out of date if the 5619 // name from the PCM doesn't match up with the one in the module map, 5620 // but also quite unlikely since we will have already checked the 5621 // modification time and size of the module map file itself. 5622 } 5623 break; 5624 } 5625 5626 case SUBMODULE_HEADER: 5627 case SUBMODULE_EXCLUDED_HEADER: 5628 case SUBMODULE_PRIVATE_HEADER: 5629 // We lazily associate headers with their modules via the HeaderInfo table. 5630 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5631 // of complete filenames or remove it entirely. 5632 break; 5633 5634 case SUBMODULE_TEXTUAL_HEADER: 5635 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5636 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5637 // them here. 5638 break; 5639 5640 case SUBMODULE_TOPHEADER: { 5641 std::string HeaderName(Blob); 5642 ResolveImportedPath(F, HeaderName); 5643 CurrentModule->addTopHeaderFilename(HeaderName); 5644 break; 5645 } 5646 5647 case SUBMODULE_UMBRELLA_DIR: { 5648 // See comments in SUBMODULE_UMBRELLA_HEADER 5649 std::string Dirname = std::string(Blob); 5650 ResolveImportedPath(F, Dirname); 5651 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5652 if (!CurrentModule->getUmbrellaDir()) { 5653 // FIXME: NameAsWritten 5654 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob, ""); 5655 } 5656 } 5657 break; 5658 } 5659 5660 case SUBMODULE_METADATA: { 5661 F.BaseSubmoduleID = getTotalNumSubmodules(); 5662 F.LocalNumSubmodules = Record[0]; 5663 unsigned LocalBaseSubmoduleID = Record[1]; 5664 if (F.LocalNumSubmodules > 0) { 5665 // Introduce the global -> local mapping for submodules within this 5666 // module. 5667 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5668 5669 // Introduce the local -> global mapping for submodules within this 5670 // module. 5671 F.SubmoduleRemap.insertOrReplace( 5672 std::make_pair(LocalBaseSubmoduleID, 5673 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5674 5675 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5676 } 5677 break; 5678 } 5679 5680 case SUBMODULE_IMPORTS: 5681 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5682 UnresolvedModuleRef Unresolved; 5683 Unresolved.File = &F; 5684 Unresolved.Mod = CurrentModule; 5685 Unresolved.ID = Record[Idx]; 5686 Unresolved.Kind = UnresolvedModuleRef::Import; 5687 Unresolved.IsWildcard = false; 5688 UnresolvedModuleRefs.push_back(Unresolved); 5689 } 5690 break; 5691 5692 case SUBMODULE_EXPORTS: 5693 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5694 UnresolvedModuleRef Unresolved; 5695 Unresolved.File = &F; 5696 Unresolved.Mod = CurrentModule; 5697 Unresolved.ID = Record[Idx]; 5698 Unresolved.Kind = UnresolvedModuleRef::Export; 5699 Unresolved.IsWildcard = Record[Idx + 1]; 5700 UnresolvedModuleRefs.push_back(Unresolved); 5701 } 5702 5703 // Once we've loaded the set of exports, there's no reason to keep 5704 // the parsed, unresolved exports around. 5705 CurrentModule->UnresolvedExports.clear(); 5706 break; 5707 5708 case SUBMODULE_REQUIRES: 5709 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5710 PP.getTargetInfo()); 5711 break; 5712 5713 case SUBMODULE_LINK_LIBRARY: 5714 ModMap.resolveLinkAsDependencies(CurrentModule); 5715 CurrentModule->LinkLibraries.push_back( 5716 Module::LinkLibrary(std::string(Blob), Record[0])); 5717 break; 5718 5719 case SUBMODULE_CONFIG_MACRO: 5720 CurrentModule->ConfigMacros.push_back(Blob.str()); 5721 break; 5722 5723 case SUBMODULE_CONFLICT: { 5724 UnresolvedModuleRef Unresolved; 5725 Unresolved.File = &F; 5726 Unresolved.Mod = CurrentModule; 5727 Unresolved.ID = Record[0]; 5728 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5729 Unresolved.IsWildcard = false; 5730 Unresolved.String = Blob; 5731 UnresolvedModuleRefs.push_back(Unresolved); 5732 break; 5733 } 5734 5735 case SUBMODULE_INITIALIZERS: { 5736 if (!ContextObj) 5737 break; 5738 SmallVector<uint32_t, 16> Inits; 5739 for (auto &ID : Record) 5740 Inits.push_back(getGlobalDeclID(F, ID)); 5741 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5742 break; 5743 } 5744 5745 case SUBMODULE_EXPORT_AS: 5746 CurrentModule->ExportAsModule = Blob.str(); 5747 ModMap.addLinkAsDependency(CurrentModule); 5748 break; 5749 } 5750 } 5751 } 5752 5753 /// Parse the record that corresponds to a LangOptions data 5754 /// structure. 5755 /// 5756 /// This routine parses the language options from the AST file and then gives 5757 /// them to the AST listener if one is set. 5758 /// 5759 /// \returns true if the listener deems the file unacceptable, false otherwise. 5760 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5761 bool Complain, 5762 ASTReaderListener &Listener, 5763 bool AllowCompatibleDifferences) { 5764 LangOptions LangOpts; 5765 unsigned Idx = 0; 5766 #define LANGOPT(Name, Bits, Default, Description) \ 5767 LangOpts.Name = Record[Idx++]; 5768 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5769 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5770 #include "clang/Basic/LangOptions.def" 5771 #define SANITIZER(NAME, ID) \ 5772 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5773 #include "clang/Basic/Sanitizers.def" 5774 5775 for (unsigned N = Record[Idx++]; N; --N) 5776 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5777 5778 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5779 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5780 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5781 5782 LangOpts.CurrentModule = ReadString(Record, Idx); 5783 5784 // Comment options. 5785 for (unsigned N = Record[Idx++]; N; --N) { 5786 LangOpts.CommentOpts.BlockCommandNames.push_back( 5787 ReadString(Record, Idx)); 5788 } 5789 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5790 5791 // OpenMP offloading options. 5792 for (unsigned N = Record[Idx++]; N; --N) { 5793 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5794 } 5795 5796 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5797 5798 return Listener.ReadLanguageOptions(LangOpts, Complain, 5799 AllowCompatibleDifferences); 5800 } 5801 5802 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5803 ASTReaderListener &Listener, 5804 bool AllowCompatibleDifferences) { 5805 unsigned Idx = 0; 5806 TargetOptions TargetOpts; 5807 TargetOpts.Triple = ReadString(Record, Idx); 5808 TargetOpts.CPU = ReadString(Record, Idx); 5809 TargetOpts.TuneCPU = ReadString(Record, Idx); 5810 TargetOpts.ABI = ReadString(Record, Idx); 5811 for (unsigned N = Record[Idx++]; N; --N) { 5812 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5813 } 5814 for (unsigned N = Record[Idx++]; N; --N) { 5815 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5816 } 5817 5818 return Listener.ReadTargetOptions(TargetOpts, Complain, 5819 AllowCompatibleDifferences); 5820 } 5821 5822 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5823 ASTReaderListener &Listener) { 5824 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5825 unsigned Idx = 0; 5826 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5827 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5828 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5829 #include "clang/Basic/DiagnosticOptions.def" 5830 5831 for (unsigned N = Record[Idx++]; N; --N) 5832 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5833 for (unsigned N = Record[Idx++]; N; --N) 5834 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5835 5836 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5837 } 5838 5839 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5840 ASTReaderListener &Listener) { 5841 FileSystemOptions FSOpts; 5842 unsigned Idx = 0; 5843 FSOpts.WorkingDir = ReadString(Record, Idx); 5844 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5845 } 5846 5847 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5848 bool Complain, 5849 ASTReaderListener &Listener) { 5850 HeaderSearchOptions HSOpts; 5851 unsigned Idx = 0; 5852 HSOpts.Sysroot = ReadString(Record, Idx); 5853 5854 // Include entries. 5855 for (unsigned N = Record[Idx++]; N; --N) { 5856 std::string Path = ReadString(Record, Idx); 5857 frontend::IncludeDirGroup Group 5858 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5859 bool IsFramework = Record[Idx++]; 5860 bool IgnoreSysRoot = Record[Idx++]; 5861 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5862 IgnoreSysRoot); 5863 } 5864 5865 // System header prefixes. 5866 for (unsigned N = Record[Idx++]; N; --N) { 5867 std::string Prefix = ReadString(Record, Idx); 5868 bool IsSystemHeader = Record[Idx++]; 5869 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5870 } 5871 5872 HSOpts.ResourceDir = ReadString(Record, Idx); 5873 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5874 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5875 HSOpts.DisableModuleHash = Record[Idx++]; 5876 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5877 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5878 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++]; 5879 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5880 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5881 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5882 HSOpts.UseLibcxx = Record[Idx++]; 5883 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5884 5885 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5886 Complain); 5887 } 5888 5889 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5890 bool Complain, 5891 ASTReaderListener &Listener, 5892 std::string &SuggestedPredefines) { 5893 PreprocessorOptions PPOpts; 5894 unsigned Idx = 0; 5895 5896 // Macro definitions/undefs 5897 for (unsigned N = Record[Idx++]; N; --N) { 5898 std::string Macro = ReadString(Record, Idx); 5899 bool IsUndef = Record[Idx++]; 5900 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5901 } 5902 5903 // Includes 5904 for (unsigned N = Record[Idx++]; N; --N) { 5905 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5906 } 5907 5908 // Macro Includes 5909 for (unsigned N = Record[Idx++]; N; --N) { 5910 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5911 } 5912 5913 PPOpts.UsePredefines = Record[Idx++]; 5914 PPOpts.DetailedRecord = Record[Idx++]; 5915 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5916 PPOpts.ObjCXXARCStandardLibrary = 5917 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5918 SuggestedPredefines.clear(); 5919 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5920 SuggestedPredefines); 5921 } 5922 5923 std::pair<ModuleFile *, unsigned> 5924 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5925 GlobalPreprocessedEntityMapType::iterator 5926 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5927 assert(I != GlobalPreprocessedEntityMap.end() && 5928 "Corrupted global preprocessed entity map"); 5929 ModuleFile *M = I->second; 5930 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5931 return std::make_pair(M, LocalIndex); 5932 } 5933 5934 llvm::iterator_range<PreprocessingRecord::iterator> 5935 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5936 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5937 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5938 Mod.NumPreprocessedEntities); 5939 5940 return llvm::make_range(PreprocessingRecord::iterator(), 5941 PreprocessingRecord::iterator()); 5942 } 5943 5944 bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName, 5945 unsigned int ClientLoadCapabilities) { 5946 return ClientLoadCapabilities & ARR_OutOfDate && 5947 !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName); 5948 } 5949 5950 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5951 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5952 return llvm::make_range( 5953 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5954 ModuleDeclIterator(this, &Mod, 5955 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5956 } 5957 5958 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5959 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5960 assert(I != GlobalSkippedRangeMap.end() && 5961 "Corrupted global skipped range map"); 5962 ModuleFile *M = I->second; 5963 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5964 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5965 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5966 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5967 TranslateSourceLocation(*M, RawRange.getEnd())); 5968 assert(Range.isValid()); 5969 return Range; 5970 } 5971 5972 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5973 PreprocessedEntityID PPID = Index+1; 5974 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5975 ModuleFile &M = *PPInfo.first; 5976 unsigned LocalIndex = PPInfo.second; 5977 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5978 5979 if (!PP.getPreprocessingRecord()) { 5980 Error("no preprocessing record"); 5981 return nullptr; 5982 } 5983 5984 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5985 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5986 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5987 Error(std::move(Err)); 5988 return nullptr; 5989 } 5990 5991 Expected<llvm::BitstreamEntry> MaybeEntry = 5992 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5993 if (!MaybeEntry) { 5994 Error(MaybeEntry.takeError()); 5995 return nullptr; 5996 } 5997 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5998 5999 if (Entry.Kind != llvm::BitstreamEntry::Record) 6000 return nullptr; 6001 6002 // Read the record. 6003 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 6004 TranslateSourceLocation(M, PPOffs.getEnd())); 6005 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 6006 StringRef Blob; 6007 RecordData Record; 6008 Expected<unsigned> MaybeRecType = 6009 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 6010 if (!MaybeRecType) { 6011 Error(MaybeRecType.takeError()); 6012 return nullptr; 6013 } 6014 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 6015 case PPD_MACRO_EXPANSION: { 6016 bool isBuiltin = Record[0]; 6017 IdentifierInfo *Name = nullptr; 6018 MacroDefinitionRecord *Def = nullptr; 6019 if (isBuiltin) 6020 Name = getLocalIdentifier(M, Record[1]); 6021 else { 6022 PreprocessedEntityID GlobalID = 6023 getGlobalPreprocessedEntityID(M, Record[1]); 6024 Def = cast<MacroDefinitionRecord>( 6025 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 6026 } 6027 6028 MacroExpansion *ME; 6029 if (isBuiltin) 6030 ME = new (PPRec) MacroExpansion(Name, Range); 6031 else 6032 ME = new (PPRec) MacroExpansion(Def, Range); 6033 6034 return ME; 6035 } 6036 6037 case PPD_MACRO_DEFINITION: { 6038 // Decode the identifier info and then check again; if the macro is 6039 // still defined and associated with the identifier, 6040 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 6041 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 6042 6043 if (DeserializationListener) 6044 DeserializationListener->MacroDefinitionRead(PPID, MD); 6045 6046 return MD; 6047 } 6048 6049 case PPD_INCLUSION_DIRECTIVE: { 6050 const char *FullFileNameStart = Blob.data() + Record[0]; 6051 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 6052 Optional<FileEntryRef> File; 6053 if (!FullFileName.empty()) 6054 File = PP.getFileManager().getOptionalFileRef(FullFileName); 6055 6056 // FIXME: Stable encoding 6057 InclusionDirective::InclusionKind Kind 6058 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 6059 InclusionDirective *ID 6060 = new (PPRec) InclusionDirective(PPRec, Kind, 6061 StringRef(Blob.data(), Record[0]), 6062 Record[1], Record[3], 6063 File, 6064 Range); 6065 return ID; 6066 } 6067 } 6068 6069 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 6070 } 6071 6072 /// Find the next module that contains entities and return the ID 6073 /// of the first entry. 6074 /// 6075 /// \param SLocMapI points at a chunk of a module that contains no 6076 /// preprocessed entities or the entities it contains are not the ones we are 6077 /// looking for. 6078 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6079 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6080 ++SLocMapI; 6081 for (GlobalSLocOffsetMapType::const_iterator 6082 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6083 ModuleFile &M = *SLocMapI->second; 6084 if (M.NumPreprocessedEntities) 6085 return M.BasePreprocessedEntityID; 6086 } 6087 6088 return getTotalNumPreprocessedEntities(); 6089 } 6090 6091 namespace { 6092 6093 struct PPEntityComp { 6094 const ASTReader &Reader; 6095 ModuleFile &M; 6096 6097 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6098 6099 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6100 SourceLocation LHS = getLoc(L); 6101 SourceLocation RHS = getLoc(R); 6102 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6103 } 6104 6105 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6106 SourceLocation LHS = getLoc(L); 6107 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6108 } 6109 6110 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6111 SourceLocation RHS = getLoc(R); 6112 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6113 } 6114 6115 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6116 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6117 } 6118 }; 6119 6120 } // namespace 6121 6122 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6123 bool EndsAfter) const { 6124 if (SourceMgr.isLocalSourceLocation(Loc)) 6125 return getTotalNumPreprocessedEntities(); 6126 6127 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6128 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6129 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6130 "Corrupted global sloc offset map"); 6131 6132 if (SLocMapI->second->NumPreprocessedEntities == 0) 6133 return findNextPreprocessedEntity(SLocMapI); 6134 6135 ModuleFile &M = *SLocMapI->second; 6136 6137 using pp_iterator = const PPEntityOffset *; 6138 6139 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6140 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6141 6142 size_t Count = M.NumPreprocessedEntities; 6143 size_t Half; 6144 pp_iterator First = pp_begin; 6145 pp_iterator PPI; 6146 6147 if (EndsAfter) { 6148 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6149 PPEntityComp(*this, M)); 6150 } else { 6151 // Do a binary search manually instead of using std::lower_bound because 6152 // The end locations of entities may be unordered (when a macro expansion 6153 // is inside another macro argument), but for this case it is not important 6154 // whether we get the first macro expansion or its containing macro. 6155 while (Count > 0) { 6156 Half = Count / 2; 6157 PPI = First; 6158 std::advance(PPI, Half); 6159 if (SourceMgr.isBeforeInTranslationUnit( 6160 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6161 First = PPI; 6162 ++First; 6163 Count = Count - Half - 1; 6164 } else 6165 Count = Half; 6166 } 6167 } 6168 6169 if (PPI == pp_end) 6170 return findNextPreprocessedEntity(SLocMapI); 6171 6172 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6173 } 6174 6175 /// Returns a pair of [Begin, End) indices of preallocated 6176 /// preprocessed entities that \arg Range encompasses. 6177 std::pair<unsigned, unsigned> 6178 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6179 if (Range.isInvalid()) 6180 return std::make_pair(0,0); 6181 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6182 6183 PreprocessedEntityID BeginID = 6184 findPreprocessedEntity(Range.getBegin(), false); 6185 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6186 return std::make_pair(BeginID, EndID); 6187 } 6188 6189 /// Optionally returns true or false if the preallocated preprocessed 6190 /// entity with index \arg Index came from file \arg FID. 6191 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6192 FileID FID) { 6193 if (FID.isInvalid()) 6194 return false; 6195 6196 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6197 ModuleFile &M = *PPInfo.first; 6198 unsigned LocalIndex = PPInfo.second; 6199 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6200 6201 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6202 if (Loc.isInvalid()) 6203 return false; 6204 6205 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6206 return true; 6207 else 6208 return false; 6209 } 6210 6211 namespace { 6212 6213 /// Visitor used to search for information about a header file. 6214 class HeaderFileInfoVisitor { 6215 const FileEntry *FE; 6216 Optional<HeaderFileInfo> HFI; 6217 6218 public: 6219 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6220 6221 bool operator()(ModuleFile &M) { 6222 HeaderFileInfoLookupTable *Table 6223 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6224 if (!Table) 6225 return false; 6226 6227 // Look in the on-disk hash table for an entry for this file name. 6228 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6229 if (Pos == Table->end()) 6230 return false; 6231 6232 HFI = *Pos; 6233 return true; 6234 } 6235 6236 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6237 }; 6238 6239 } // namespace 6240 6241 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6242 HeaderFileInfoVisitor Visitor(FE); 6243 ModuleMgr.visit(Visitor); 6244 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6245 return *HFI; 6246 6247 return HeaderFileInfo(); 6248 } 6249 6250 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6251 using DiagState = DiagnosticsEngine::DiagState; 6252 SmallVector<DiagState *, 32> DiagStates; 6253 6254 for (ModuleFile &F : ModuleMgr) { 6255 unsigned Idx = 0; 6256 auto &Record = F.PragmaDiagMappings; 6257 if (Record.empty()) 6258 continue; 6259 6260 DiagStates.clear(); 6261 6262 auto ReadDiagState = 6263 [&](const DiagState &BasedOn, SourceLocation Loc, 6264 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6265 unsigned BackrefID = Record[Idx++]; 6266 if (BackrefID != 0) 6267 return DiagStates[BackrefID - 1]; 6268 6269 // A new DiagState was created here. 6270 Diag.DiagStates.push_back(BasedOn); 6271 DiagState *NewState = &Diag.DiagStates.back(); 6272 DiagStates.push_back(NewState); 6273 unsigned Size = Record[Idx++]; 6274 assert(Idx + Size * 2 <= Record.size() && 6275 "Invalid data, not enough diag/map pairs"); 6276 while (Size--) { 6277 unsigned DiagID = Record[Idx++]; 6278 DiagnosticMapping NewMapping = 6279 DiagnosticMapping::deserialize(Record[Idx++]); 6280 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6281 continue; 6282 6283 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6284 6285 // If this mapping was specified as a warning but the severity was 6286 // upgraded due to diagnostic settings, simulate the current diagnostic 6287 // settings (and use a warning). 6288 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6289 NewMapping.setSeverity(diag::Severity::Warning); 6290 NewMapping.setUpgradedFromWarning(false); 6291 } 6292 6293 Mapping = NewMapping; 6294 } 6295 return NewState; 6296 }; 6297 6298 // Read the first state. 6299 DiagState *FirstState; 6300 if (F.Kind == MK_ImplicitModule) { 6301 // Implicitly-built modules are reused with different diagnostic 6302 // settings. Use the initial diagnostic state from Diag to simulate this 6303 // compilation's diagnostic settings. 6304 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6305 DiagStates.push_back(FirstState); 6306 6307 // Skip the initial diagnostic state from the serialized module. 6308 assert(Record[1] == 0 && 6309 "Invalid data, unexpected backref in initial state"); 6310 Idx = 3 + Record[2] * 2; 6311 assert(Idx < Record.size() && 6312 "Invalid data, not enough state change pairs in initial state"); 6313 } else if (F.isModule()) { 6314 // For an explicit module, preserve the flags from the module build 6315 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6316 // -Wblah flags. 6317 unsigned Flags = Record[Idx++]; 6318 DiagState Initial; 6319 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6320 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6321 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6322 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6323 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6324 Initial.ExtBehavior = (diag::Severity)Flags; 6325 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6326 6327 assert(F.OriginalSourceFileID.isValid()); 6328 6329 // Set up the root buffer of the module to start with the initial 6330 // diagnostic state of the module itself, to cover files that contain no 6331 // explicit transitions (for which we did not serialize anything). 6332 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6333 .StateTransitions.push_back({FirstState, 0}); 6334 } else { 6335 // For prefix ASTs, start with whatever the user configured on the 6336 // command line. 6337 Idx++; // Skip flags. 6338 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6339 SourceLocation(), false); 6340 } 6341 6342 // Read the state transitions. 6343 unsigned NumLocations = Record[Idx++]; 6344 while (NumLocations--) { 6345 assert(Idx < Record.size() && 6346 "Invalid data, missing pragma diagnostic states"); 6347 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6348 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6349 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6350 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6351 unsigned Transitions = Record[Idx++]; 6352 6353 // Note that we don't need to set up Parent/ParentOffset here, because 6354 // we won't be changing the diagnostic state within imported FileIDs 6355 // (other than perhaps appending to the main source file, which has no 6356 // parent). 6357 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6358 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6359 for (unsigned I = 0; I != Transitions; ++I) { 6360 unsigned Offset = Record[Idx++]; 6361 auto *State = 6362 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6363 F.StateTransitions.push_back({State, Offset}); 6364 } 6365 } 6366 6367 // Read the final state. 6368 assert(Idx < Record.size() && 6369 "Invalid data, missing final pragma diagnostic state"); 6370 SourceLocation CurStateLoc = 6371 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6372 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6373 6374 if (!F.isModule()) { 6375 Diag.DiagStatesByLoc.CurDiagState = CurState; 6376 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6377 6378 // Preserve the property that the imaginary root file describes the 6379 // current state. 6380 FileID NullFile; 6381 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6382 if (T.empty()) 6383 T.push_back({CurState, 0}); 6384 else 6385 T[0].State = CurState; 6386 } 6387 6388 // Don't try to read these mappings again. 6389 Record.clear(); 6390 } 6391 } 6392 6393 /// Get the correct cursor and offset for loading a type. 6394 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6395 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6396 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6397 ModuleFile *M = I->second; 6398 return RecordLocation( 6399 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() + 6400 M->DeclsBlockStartOffset); 6401 } 6402 6403 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6404 switch (code) { 6405 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6406 case TYPE_##CODE_ID: return Type::CLASS_ID; 6407 #include "clang/Serialization/TypeBitCodes.def" 6408 default: return llvm::None; 6409 } 6410 } 6411 6412 /// Read and return the type with the given index.. 6413 /// 6414 /// The index is the type ID, shifted and minus the number of predefs. This 6415 /// routine actually reads the record corresponding to the type at the given 6416 /// location. It is a helper routine for GetType, which deals with reading type 6417 /// IDs. 6418 QualType ASTReader::readTypeRecord(unsigned Index) { 6419 assert(ContextObj && "reading type with no AST context"); 6420 ASTContext &Context = *ContextObj; 6421 RecordLocation Loc = TypeCursorForIndex(Index); 6422 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6423 6424 // Keep track of where we are in the stream, then jump back there 6425 // after reading this type. 6426 SavedStreamPosition SavedPosition(DeclsCursor); 6427 6428 ReadingKindTracker ReadingKind(Read_Type, *this); 6429 6430 // Note that we are loading a type record. 6431 Deserializing AType(this); 6432 6433 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6434 Error(std::move(Err)); 6435 return QualType(); 6436 } 6437 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6438 if (!RawCode) { 6439 Error(RawCode.takeError()); 6440 return QualType(); 6441 } 6442 6443 ASTRecordReader Record(*this, *Loc.F); 6444 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6445 if (!Code) { 6446 Error(Code.takeError()); 6447 return QualType(); 6448 } 6449 if (Code.get() == TYPE_EXT_QUAL) { 6450 QualType baseType = Record.readQualType(); 6451 Qualifiers quals = Record.readQualifiers(); 6452 return Context.getQualifiedType(baseType, quals); 6453 } 6454 6455 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6456 if (!maybeClass) { 6457 Error("Unexpected code for type"); 6458 return QualType(); 6459 } 6460 6461 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6462 return TypeReader.read(*maybeClass); 6463 } 6464 6465 namespace clang { 6466 6467 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6468 using LocSeq = SourceLocationSequence; 6469 6470 ASTRecordReader &Reader; 6471 LocSeq *Seq; 6472 6473 SourceLocation readSourceLocation() { return Reader.readSourceLocation(Seq); } 6474 SourceRange readSourceRange() { return Reader.readSourceRange(Seq); } 6475 6476 TypeSourceInfo *GetTypeSourceInfo() { 6477 return Reader.readTypeSourceInfo(); 6478 } 6479 6480 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6481 return Reader.readNestedNameSpecifierLoc(); 6482 } 6483 6484 Attr *ReadAttr() { 6485 return Reader.readAttr(); 6486 } 6487 6488 public: 6489 TypeLocReader(ASTRecordReader &Reader, LocSeq *Seq) 6490 : Reader(Reader), Seq(Seq) {} 6491 6492 // We want compile-time assurance that we've enumerated all of 6493 // these, so unfortunately we have to declare them first, then 6494 // define them out-of-line. 6495 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6496 #define TYPELOC(CLASS, PARENT) \ 6497 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6498 #include "clang/AST/TypeLocNodes.def" 6499 6500 void VisitFunctionTypeLoc(FunctionTypeLoc); 6501 void VisitArrayTypeLoc(ArrayTypeLoc); 6502 }; 6503 6504 } // namespace clang 6505 6506 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6507 // nothing to do 6508 } 6509 6510 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6511 TL.setBuiltinLoc(readSourceLocation()); 6512 if (TL.needsExtraLocalData()) { 6513 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6514 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt())); 6515 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt())); 6516 TL.setModeAttr(Reader.readInt()); 6517 } 6518 } 6519 6520 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6521 TL.setNameLoc(readSourceLocation()); 6522 } 6523 6524 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6525 TL.setStarLoc(readSourceLocation()); 6526 } 6527 6528 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6529 // nothing to do 6530 } 6531 6532 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6533 // nothing to do 6534 } 6535 6536 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6537 TL.setExpansionLoc(readSourceLocation()); 6538 } 6539 6540 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6541 TL.setCaretLoc(readSourceLocation()); 6542 } 6543 6544 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6545 TL.setAmpLoc(readSourceLocation()); 6546 } 6547 6548 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6549 TL.setAmpAmpLoc(readSourceLocation()); 6550 } 6551 6552 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6553 TL.setStarLoc(readSourceLocation()); 6554 TL.setClassTInfo(GetTypeSourceInfo()); 6555 } 6556 6557 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6558 TL.setLBracketLoc(readSourceLocation()); 6559 TL.setRBracketLoc(readSourceLocation()); 6560 if (Reader.readBool()) 6561 TL.setSizeExpr(Reader.readExpr()); 6562 else 6563 TL.setSizeExpr(nullptr); 6564 } 6565 6566 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6567 VisitArrayTypeLoc(TL); 6568 } 6569 6570 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6571 VisitArrayTypeLoc(TL); 6572 } 6573 6574 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6575 VisitArrayTypeLoc(TL); 6576 } 6577 6578 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6579 DependentSizedArrayTypeLoc TL) { 6580 VisitArrayTypeLoc(TL); 6581 } 6582 6583 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6584 DependentAddressSpaceTypeLoc TL) { 6585 6586 TL.setAttrNameLoc(readSourceLocation()); 6587 TL.setAttrOperandParensRange(readSourceRange()); 6588 TL.setAttrExprOperand(Reader.readExpr()); 6589 } 6590 6591 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6592 DependentSizedExtVectorTypeLoc TL) { 6593 TL.setNameLoc(readSourceLocation()); 6594 } 6595 6596 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6597 TL.setNameLoc(readSourceLocation()); 6598 } 6599 6600 void TypeLocReader::VisitDependentVectorTypeLoc( 6601 DependentVectorTypeLoc TL) { 6602 TL.setNameLoc(readSourceLocation()); 6603 } 6604 6605 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6606 TL.setNameLoc(readSourceLocation()); 6607 } 6608 6609 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) { 6610 TL.setAttrNameLoc(readSourceLocation()); 6611 TL.setAttrOperandParensRange(readSourceRange()); 6612 TL.setAttrRowOperand(Reader.readExpr()); 6613 TL.setAttrColumnOperand(Reader.readExpr()); 6614 } 6615 6616 void TypeLocReader::VisitDependentSizedMatrixTypeLoc( 6617 DependentSizedMatrixTypeLoc TL) { 6618 TL.setAttrNameLoc(readSourceLocation()); 6619 TL.setAttrOperandParensRange(readSourceRange()); 6620 TL.setAttrRowOperand(Reader.readExpr()); 6621 TL.setAttrColumnOperand(Reader.readExpr()); 6622 } 6623 6624 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6625 TL.setLocalRangeBegin(readSourceLocation()); 6626 TL.setLParenLoc(readSourceLocation()); 6627 TL.setRParenLoc(readSourceLocation()); 6628 TL.setExceptionSpecRange(readSourceRange()); 6629 TL.setLocalRangeEnd(readSourceLocation()); 6630 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6631 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6632 } 6633 } 6634 6635 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6636 VisitFunctionTypeLoc(TL); 6637 } 6638 6639 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6640 VisitFunctionTypeLoc(TL); 6641 } 6642 6643 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6644 TL.setNameLoc(readSourceLocation()); 6645 } 6646 6647 void TypeLocReader::VisitUsingTypeLoc(UsingTypeLoc TL) { 6648 TL.setNameLoc(readSourceLocation()); 6649 } 6650 6651 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6652 TL.setNameLoc(readSourceLocation()); 6653 } 6654 6655 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6656 TL.setTypeofLoc(readSourceLocation()); 6657 TL.setLParenLoc(readSourceLocation()); 6658 TL.setRParenLoc(readSourceLocation()); 6659 } 6660 6661 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6662 TL.setTypeofLoc(readSourceLocation()); 6663 TL.setLParenLoc(readSourceLocation()); 6664 TL.setRParenLoc(readSourceLocation()); 6665 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6666 } 6667 6668 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6669 TL.setDecltypeLoc(readSourceLocation()); 6670 TL.setRParenLoc(readSourceLocation()); 6671 } 6672 6673 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6674 TL.setKWLoc(readSourceLocation()); 6675 TL.setLParenLoc(readSourceLocation()); 6676 TL.setRParenLoc(readSourceLocation()); 6677 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6678 } 6679 6680 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6681 TL.setNameLoc(readSourceLocation()); 6682 if (Reader.readBool()) { 6683 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6684 TL.setTemplateKWLoc(readSourceLocation()); 6685 TL.setConceptNameLoc(readSourceLocation()); 6686 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6687 TL.setLAngleLoc(readSourceLocation()); 6688 TL.setRAngleLoc(readSourceLocation()); 6689 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6690 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6691 TL.getTypePtr()->getArg(i).getKind())); 6692 } 6693 if (Reader.readBool()) 6694 TL.setRParenLoc(readSourceLocation()); 6695 } 6696 6697 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6698 DeducedTemplateSpecializationTypeLoc TL) { 6699 TL.setTemplateNameLoc(readSourceLocation()); 6700 } 6701 6702 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6703 TL.setNameLoc(readSourceLocation()); 6704 } 6705 6706 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6707 TL.setNameLoc(readSourceLocation()); 6708 } 6709 6710 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6711 TL.setAttr(ReadAttr()); 6712 } 6713 6714 void TypeLocReader::VisitBTFTagAttributedTypeLoc(BTFTagAttributedTypeLoc TL) { 6715 // Nothing to do. 6716 } 6717 6718 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6719 TL.setNameLoc(readSourceLocation()); 6720 } 6721 6722 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6723 SubstTemplateTypeParmTypeLoc TL) { 6724 TL.setNameLoc(readSourceLocation()); 6725 } 6726 6727 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6728 SubstTemplateTypeParmPackTypeLoc TL) { 6729 TL.setNameLoc(readSourceLocation()); 6730 } 6731 6732 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6733 TemplateSpecializationTypeLoc TL) { 6734 TL.setTemplateKeywordLoc(readSourceLocation()); 6735 TL.setTemplateNameLoc(readSourceLocation()); 6736 TL.setLAngleLoc(readSourceLocation()); 6737 TL.setRAngleLoc(readSourceLocation()); 6738 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6739 TL.setArgLocInfo( 6740 i, 6741 Reader.readTemplateArgumentLocInfo( 6742 TL.getTypePtr()->getArg(i).getKind())); 6743 } 6744 6745 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6746 TL.setLParenLoc(readSourceLocation()); 6747 TL.setRParenLoc(readSourceLocation()); 6748 } 6749 6750 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6751 TL.setElaboratedKeywordLoc(readSourceLocation()); 6752 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6753 } 6754 6755 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6756 TL.setNameLoc(readSourceLocation()); 6757 } 6758 6759 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6760 TL.setElaboratedKeywordLoc(readSourceLocation()); 6761 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6762 TL.setNameLoc(readSourceLocation()); 6763 } 6764 6765 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6766 DependentTemplateSpecializationTypeLoc TL) { 6767 TL.setElaboratedKeywordLoc(readSourceLocation()); 6768 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6769 TL.setTemplateKeywordLoc(readSourceLocation()); 6770 TL.setTemplateNameLoc(readSourceLocation()); 6771 TL.setLAngleLoc(readSourceLocation()); 6772 TL.setRAngleLoc(readSourceLocation()); 6773 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6774 TL.setArgLocInfo( 6775 I, 6776 Reader.readTemplateArgumentLocInfo( 6777 TL.getTypePtr()->getArg(I).getKind())); 6778 } 6779 6780 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6781 TL.setEllipsisLoc(readSourceLocation()); 6782 } 6783 6784 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6785 TL.setNameLoc(readSourceLocation()); 6786 } 6787 6788 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6789 if (TL.getNumProtocols()) { 6790 TL.setProtocolLAngleLoc(readSourceLocation()); 6791 TL.setProtocolRAngleLoc(readSourceLocation()); 6792 } 6793 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6794 TL.setProtocolLoc(i, readSourceLocation()); 6795 } 6796 6797 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6798 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6799 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6800 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6801 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6802 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6803 TL.setProtocolLAngleLoc(readSourceLocation()); 6804 TL.setProtocolRAngleLoc(readSourceLocation()); 6805 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6806 TL.setProtocolLoc(i, readSourceLocation()); 6807 } 6808 6809 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6810 TL.setStarLoc(readSourceLocation()); 6811 } 6812 6813 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6814 TL.setKWLoc(readSourceLocation()); 6815 TL.setLParenLoc(readSourceLocation()); 6816 TL.setRParenLoc(readSourceLocation()); 6817 } 6818 6819 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6820 TL.setKWLoc(readSourceLocation()); 6821 } 6822 6823 void TypeLocReader::VisitBitIntTypeLoc(clang::BitIntTypeLoc TL) { 6824 TL.setNameLoc(readSourceLocation()); 6825 } 6826 void TypeLocReader::VisitDependentBitIntTypeLoc( 6827 clang::DependentBitIntTypeLoc TL) { 6828 TL.setNameLoc(readSourceLocation()); 6829 } 6830 6831 void ASTRecordReader::readTypeLoc(TypeLoc TL, LocSeq *ParentSeq) { 6832 LocSeq::State Seq(ParentSeq); 6833 TypeLocReader TLR(*this, Seq); 6834 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6835 TLR.Visit(TL); 6836 } 6837 6838 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6839 QualType InfoTy = readType(); 6840 if (InfoTy.isNull()) 6841 return nullptr; 6842 6843 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6844 readTypeLoc(TInfo->getTypeLoc()); 6845 return TInfo; 6846 } 6847 6848 QualType ASTReader::GetType(TypeID ID) { 6849 assert(ContextObj && "reading type with no AST context"); 6850 ASTContext &Context = *ContextObj; 6851 6852 unsigned FastQuals = ID & Qualifiers::FastMask; 6853 unsigned Index = ID >> Qualifiers::FastWidth; 6854 6855 if (Index < NUM_PREDEF_TYPE_IDS) { 6856 QualType T; 6857 switch ((PredefinedTypeIDs)Index) { 6858 case PREDEF_TYPE_NULL_ID: 6859 return QualType(); 6860 case PREDEF_TYPE_VOID_ID: 6861 T = Context.VoidTy; 6862 break; 6863 case PREDEF_TYPE_BOOL_ID: 6864 T = Context.BoolTy; 6865 break; 6866 case PREDEF_TYPE_CHAR_U_ID: 6867 case PREDEF_TYPE_CHAR_S_ID: 6868 // FIXME: Check that the signedness of CharTy is correct! 6869 T = Context.CharTy; 6870 break; 6871 case PREDEF_TYPE_UCHAR_ID: 6872 T = Context.UnsignedCharTy; 6873 break; 6874 case PREDEF_TYPE_USHORT_ID: 6875 T = Context.UnsignedShortTy; 6876 break; 6877 case PREDEF_TYPE_UINT_ID: 6878 T = Context.UnsignedIntTy; 6879 break; 6880 case PREDEF_TYPE_ULONG_ID: 6881 T = Context.UnsignedLongTy; 6882 break; 6883 case PREDEF_TYPE_ULONGLONG_ID: 6884 T = Context.UnsignedLongLongTy; 6885 break; 6886 case PREDEF_TYPE_UINT128_ID: 6887 T = Context.UnsignedInt128Ty; 6888 break; 6889 case PREDEF_TYPE_SCHAR_ID: 6890 T = Context.SignedCharTy; 6891 break; 6892 case PREDEF_TYPE_WCHAR_ID: 6893 T = Context.WCharTy; 6894 break; 6895 case PREDEF_TYPE_SHORT_ID: 6896 T = Context.ShortTy; 6897 break; 6898 case PREDEF_TYPE_INT_ID: 6899 T = Context.IntTy; 6900 break; 6901 case PREDEF_TYPE_LONG_ID: 6902 T = Context.LongTy; 6903 break; 6904 case PREDEF_TYPE_LONGLONG_ID: 6905 T = Context.LongLongTy; 6906 break; 6907 case PREDEF_TYPE_INT128_ID: 6908 T = Context.Int128Ty; 6909 break; 6910 case PREDEF_TYPE_BFLOAT16_ID: 6911 T = Context.BFloat16Ty; 6912 break; 6913 case PREDEF_TYPE_HALF_ID: 6914 T = Context.HalfTy; 6915 break; 6916 case PREDEF_TYPE_FLOAT_ID: 6917 T = Context.FloatTy; 6918 break; 6919 case PREDEF_TYPE_DOUBLE_ID: 6920 T = Context.DoubleTy; 6921 break; 6922 case PREDEF_TYPE_LONGDOUBLE_ID: 6923 T = Context.LongDoubleTy; 6924 break; 6925 case PREDEF_TYPE_SHORT_ACCUM_ID: 6926 T = Context.ShortAccumTy; 6927 break; 6928 case PREDEF_TYPE_ACCUM_ID: 6929 T = Context.AccumTy; 6930 break; 6931 case PREDEF_TYPE_LONG_ACCUM_ID: 6932 T = Context.LongAccumTy; 6933 break; 6934 case PREDEF_TYPE_USHORT_ACCUM_ID: 6935 T = Context.UnsignedShortAccumTy; 6936 break; 6937 case PREDEF_TYPE_UACCUM_ID: 6938 T = Context.UnsignedAccumTy; 6939 break; 6940 case PREDEF_TYPE_ULONG_ACCUM_ID: 6941 T = Context.UnsignedLongAccumTy; 6942 break; 6943 case PREDEF_TYPE_SHORT_FRACT_ID: 6944 T = Context.ShortFractTy; 6945 break; 6946 case PREDEF_TYPE_FRACT_ID: 6947 T = Context.FractTy; 6948 break; 6949 case PREDEF_TYPE_LONG_FRACT_ID: 6950 T = Context.LongFractTy; 6951 break; 6952 case PREDEF_TYPE_USHORT_FRACT_ID: 6953 T = Context.UnsignedShortFractTy; 6954 break; 6955 case PREDEF_TYPE_UFRACT_ID: 6956 T = Context.UnsignedFractTy; 6957 break; 6958 case PREDEF_TYPE_ULONG_FRACT_ID: 6959 T = Context.UnsignedLongFractTy; 6960 break; 6961 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6962 T = Context.SatShortAccumTy; 6963 break; 6964 case PREDEF_TYPE_SAT_ACCUM_ID: 6965 T = Context.SatAccumTy; 6966 break; 6967 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6968 T = Context.SatLongAccumTy; 6969 break; 6970 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6971 T = Context.SatUnsignedShortAccumTy; 6972 break; 6973 case PREDEF_TYPE_SAT_UACCUM_ID: 6974 T = Context.SatUnsignedAccumTy; 6975 break; 6976 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6977 T = Context.SatUnsignedLongAccumTy; 6978 break; 6979 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6980 T = Context.SatShortFractTy; 6981 break; 6982 case PREDEF_TYPE_SAT_FRACT_ID: 6983 T = Context.SatFractTy; 6984 break; 6985 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6986 T = Context.SatLongFractTy; 6987 break; 6988 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6989 T = Context.SatUnsignedShortFractTy; 6990 break; 6991 case PREDEF_TYPE_SAT_UFRACT_ID: 6992 T = Context.SatUnsignedFractTy; 6993 break; 6994 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6995 T = Context.SatUnsignedLongFractTy; 6996 break; 6997 case PREDEF_TYPE_FLOAT16_ID: 6998 T = Context.Float16Ty; 6999 break; 7000 case PREDEF_TYPE_FLOAT128_ID: 7001 T = Context.Float128Ty; 7002 break; 7003 case PREDEF_TYPE_IBM128_ID: 7004 T = Context.Ibm128Ty; 7005 break; 7006 case PREDEF_TYPE_OVERLOAD_ID: 7007 T = Context.OverloadTy; 7008 break; 7009 case PREDEF_TYPE_BOUND_MEMBER: 7010 T = Context.BoundMemberTy; 7011 break; 7012 case PREDEF_TYPE_PSEUDO_OBJECT: 7013 T = Context.PseudoObjectTy; 7014 break; 7015 case PREDEF_TYPE_DEPENDENT_ID: 7016 T = Context.DependentTy; 7017 break; 7018 case PREDEF_TYPE_UNKNOWN_ANY: 7019 T = Context.UnknownAnyTy; 7020 break; 7021 case PREDEF_TYPE_NULLPTR_ID: 7022 T = Context.NullPtrTy; 7023 break; 7024 case PREDEF_TYPE_CHAR8_ID: 7025 T = Context.Char8Ty; 7026 break; 7027 case PREDEF_TYPE_CHAR16_ID: 7028 T = Context.Char16Ty; 7029 break; 7030 case PREDEF_TYPE_CHAR32_ID: 7031 T = Context.Char32Ty; 7032 break; 7033 case PREDEF_TYPE_OBJC_ID: 7034 T = Context.ObjCBuiltinIdTy; 7035 break; 7036 case PREDEF_TYPE_OBJC_CLASS: 7037 T = Context.ObjCBuiltinClassTy; 7038 break; 7039 case PREDEF_TYPE_OBJC_SEL: 7040 T = Context.ObjCBuiltinSelTy; 7041 break; 7042 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 7043 case PREDEF_TYPE_##Id##_ID: \ 7044 T = Context.SingletonId; \ 7045 break; 7046 #include "clang/Basic/OpenCLImageTypes.def" 7047 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 7048 case PREDEF_TYPE_##Id##_ID: \ 7049 T = Context.Id##Ty; \ 7050 break; 7051 #include "clang/Basic/OpenCLExtensionTypes.def" 7052 case PREDEF_TYPE_SAMPLER_ID: 7053 T = Context.OCLSamplerTy; 7054 break; 7055 case PREDEF_TYPE_EVENT_ID: 7056 T = Context.OCLEventTy; 7057 break; 7058 case PREDEF_TYPE_CLK_EVENT_ID: 7059 T = Context.OCLClkEventTy; 7060 break; 7061 case PREDEF_TYPE_QUEUE_ID: 7062 T = Context.OCLQueueTy; 7063 break; 7064 case PREDEF_TYPE_RESERVE_ID_ID: 7065 T = Context.OCLReserveIDTy; 7066 break; 7067 case PREDEF_TYPE_AUTO_DEDUCT: 7068 T = Context.getAutoDeductType(); 7069 break; 7070 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 7071 T = Context.getAutoRRefDeductType(); 7072 break; 7073 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 7074 T = Context.ARCUnbridgedCastTy; 7075 break; 7076 case PREDEF_TYPE_BUILTIN_FN: 7077 T = Context.BuiltinFnTy; 7078 break; 7079 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX: 7080 T = Context.IncompleteMatrixIdxTy; 7081 break; 7082 case PREDEF_TYPE_OMP_ARRAY_SECTION: 7083 T = Context.OMPArraySectionTy; 7084 break; 7085 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 7086 T = Context.OMPArraySectionTy; 7087 break; 7088 case PREDEF_TYPE_OMP_ITERATOR: 7089 T = Context.OMPIteratorTy; 7090 break; 7091 #define SVE_TYPE(Name, Id, SingletonId) \ 7092 case PREDEF_TYPE_##Id##_ID: \ 7093 T = Context.SingletonId; \ 7094 break; 7095 #include "clang/Basic/AArch64SVEACLETypes.def" 7096 #define PPC_VECTOR_TYPE(Name, Id, Size) \ 7097 case PREDEF_TYPE_##Id##_ID: \ 7098 T = Context.Id##Ty; \ 7099 break; 7100 #include "clang/Basic/PPCTypes.def" 7101 #define RVV_TYPE(Name, Id, SingletonId) \ 7102 case PREDEF_TYPE_##Id##_ID: \ 7103 T = Context.SingletonId; \ 7104 break; 7105 #include "clang/Basic/RISCVVTypes.def" 7106 } 7107 7108 assert(!T.isNull() && "Unknown predefined type"); 7109 return T.withFastQualifiers(FastQuals); 7110 } 7111 7112 Index -= NUM_PREDEF_TYPE_IDS; 7113 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 7114 if (TypesLoaded[Index].isNull()) { 7115 TypesLoaded[Index] = readTypeRecord(Index); 7116 if (TypesLoaded[Index].isNull()) 7117 return QualType(); 7118 7119 TypesLoaded[Index]->setFromAST(); 7120 if (DeserializationListener) 7121 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 7122 TypesLoaded[Index]); 7123 } 7124 7125 return TypesLoaded[Index].withFastQualifiers(FastQuals); 7126 } 7127 7128 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 7129 return GetType(getGlobalTypeID(F, LocalID)); 7130 } 7131 7132 serialization::TypeID 7133 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7134 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7135 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7136 7137 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7138 return LocalID; 7139 7140 if (!F.ModuleOffsetMap.empty()) 7141 ReadModuleOffsetMap(F); 7142 7143 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7144 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7145 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7146 7147 unsigned GlobalIndex = LocalIndex + I->second; 7148 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7149 } 7150 7151 TemplateArgumentLocInfo 7152 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7153 switch (Kind) { 7154 case TemplateArgument::Expression: 7155 return readExpr(); 7156 case TemplateArgument::Type: 7157 return readTypeSourceInfo(); 7158 case TemplateArgument::Template: { 7159 NestedNameSpecifierLoc QualifierLoc = 7160 readNestedNameSpecifierLoc(); 7161 SourceLocation TemplateNameLoc = readSourceLocation(); 7162 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7163 TemplateNameLoc, SourceLocation()); 7164 } 7165 case TemplateArgument::TemplateExpansion: { 7166 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7167 SourceLocation TemplateNameLoc = readSourceLocation(); 7168 SourceLocation EllipsisLoc = readSourceLocation(); 7169 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7170 TemplateNameLoc, EllipsisLoc); 7171 } 7172 case TemplateArgument::Null: 7173 case TemplateArgument::Integral: 7174 case TemplateArgument::Declaration: 7175 case TemplateArgument::NullPtr: 7176 case TemplateArgument::Pack: 7177 // FIXME: Is this right? 7178 return TemplateArgumentLocInfo(); 7179 } 7180 llvm_unreachable("unexpected template argument loc"); 7181 } 7182 7183 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7184 TemplateArgument Arg = readTemplateArgument(); 7185 7186 if (Arg.getKind() == TemplateArgument::Expression) { 7187 if (readBool()) // bool InfoHasSameExpr. 7188 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7189 } 7190 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7191 } 7192 7193 const ASTTemplateArgumentListInfo * 7194 ASTRecordReader::readASTTemplateArgumentListInfo() { 7195 SourceLocation LAngleLoc = readSourceLocation(); 7196 SourceLocation RAngleLoc = readSourceLocation(); 7197 unsigned NumArgsAsWritten = readInt(); 7198 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7199 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7200 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7201 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7202 } 7203 7204 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7205 return GetDecl(ID); 7206 } 7207 7208 void ASTReader::CompleteRedeclChain(const Decl *D) { 7209 if (NumCurrentElementsDeserializing) { 7210 // We arrange to not care about the complete redeclaration chain while we're 7211 // deserializing. Just remember that the AST has marked this one as complete 7212 // but that it's not actually complete yet, so we know we still need to 7213 // complete it later. 7214 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7215 return; 7216 } 7217 7218 if (!D->getDeclContext()) { 7219 assert(isa<TranslationUnitDecl>(D) && "Not a TU?"); 7220 return; 7221 } 7222 7223 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7224 7225 // If this is a named declaration, complete it by looking it up 7226 // within its context. 7227 // 7228 // FIXME: Merging a function definition should merge 7229 // all mergeable entities within it. 7230 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7231 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7232 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7233 if (!getContext().getLangOpts().CPlusPlus && 7234 isa<TranslationUnitDecl>(DC)) { 7235 // Outside of C++, we don't have a lookup table for the TU, so update 7236 // the identifier instead. (For C++ modules, we don't store decls 7237 // in the serialized identifier table, so we do the lookup in the TU.) 7238 auto *II = Name.getAsIdentifierInfo(); 7239 assert(II && "non-identifier name in C?"); 7240 if (II->isOutOfDate()) 7241 updateOutOfDateIdentifier(*II); 7242 } else 7243 DC->lookup(Name); 7244 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7245 // Find all declarations of this kind from the relevant context. 7246 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7247 auto *DC = cast<DeclContext>(DCDecl); 7248 SmallVector<Decl*, 8> Decls; 7249 FindExternalLexicalDecls( 7250 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7251 } 7252 } 7253 } 7254 7255 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7256 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7257 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7258 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7259 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7260 if (auto *Template = FD->getPrimaryTemplate()) 7261 Template->LoadLazySpecializations(); 7262 } 7263 } 7264 7265 CXXCtorInitializer ** 7266 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7267 RecordLocation Loc = getLocalBitOffset(Offset); 7268 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7269 SavedStreamPosition SavedPosition(Cursor); 7270 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7271 Error(std::move(Err)); 7272 return nullptr; 7273 } 7274 ReadingKindTracker ReadingKind(Read_Decl, *this); 7275 7276 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7277 if (!MaybeCode) { 7278 Error(MaybeCode.takeError()); 7279 return nullptr; 7280 } 7281 unsigned Code = MaybeCode.get(); 7282 7283 ASTRecordReader Record(*this, *Loc.F); 7284 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7285 if (!MaybeRecCode) { 7286 Error(MaybeRecCode.takeError()); 7287 return nullptr; 7288 } 7289 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7290 Error("malformed AST file: missing C++ ctor initializers"); 7291 return nullptr; 7292 } 7293 7294 return Record.readCXXCtorInitializers(); 7295 } 7296 7297 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7298 assert(ContextObj && "reading base specifiers with no AST context"); 7299 ASTContext &Context = *ContextObj; 7300 7301 RecordLocation Loc = getLocalBitOffset(Offset); 7302 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7303 SavedStreamPosition SavedPosition(Cursor); 7304 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7305 Error(std::move(Err)); 7306 return nullptr; 7307 } 7308 ReadingKindTracker ReadingKind(Read_Decl, *this); 7309 7310 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7311 if (!MaybeCode) { 7312 Error(MaybeCode.takeError()); 7313 return nullptr; 7314 } 7315 unsigned Code = MaybeCode.get(); 7316 7317 ASTRecordReader Record(*this, *Loc.F); 7318 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7319 if (!MaybeRecCode) { 7320 Error(MaybeCode.takeError()); 7321 return nullptr; 7322 } 7323 unsigned RecCode = MaybeRecCode.get(); 7324 7325 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7326 Error("malformed AST file: missing C++ base specifiers"); 7327 return nullptr; 7328 } 7329 7330 unsigned NumBases = Record.readInt(); 7331 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7332 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7333 for (unsigned I = 0; I != NumBases; ++I) 7334 Bases[I] = Record.readCXXBaseSpecifier(); 7335 return Bases; 7336 } 7337 7338 serialization::DeclID 7339 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7340 if (LocalID < NUM_PREDEF_DECL_IDS) 7341 return LocalID; 7342 7343 if (!F.ModuleOffsetMap.empty()) 7344 ReadModuleOffsetMap(F); 7345 7346 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7347 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7348 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7349 7350 return LocalID + I->second; 7351 } 7352 7353 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7354 ModuleFile &M) const { 7355 // Predefined decls aren't from any module. 7356 if (ID < NUM_PREDEF_DECL_IDS) 7357 return false; 7358 7359 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7360 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7361 } 7362 7363 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7364 if (!D->isFromASTFile()) 7365 return nullptr; 7366 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7367 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7368 return I->second; 7369 } 7370 7371 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7372 if (ID < NUM_PREDEF_DECL_IDS) 7373 return SourceLocation(); 7374 7375 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7376 7377 if (Index > DeclsLoaded.size()) { 7378 Error("declaration ID out-of-range for AST file"); 7379 return SourceLocation(); 7380 } 7381 7382 if (Decl *D = DeclsLoaded[Index]) 7383 return D->getLocation(); 7384 7385 SourceLocation Loc; 7386 DeclCursorForID(ID, Loc); 7387 return Loc; 7388 } 7389 7390 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7391 switch (ID) { 7392 case PREDEF_DECL_NULL_ID: 7393 return nullptr; 7394 7395 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7396 return Context.getTranslationUnitDecl(); 7397 7398 case PREDEF_DECL_OBJC_ID_ID: 7399 return Context.getObjCIdDecl(); 7400 7401 case PREDEF_DECL_OBJC_SEL_ID: 7402 return Context.getObjCSelDecl(); 7403 7404 case PREDEF_DECL_OBJC_CLASS_ID: 7405 return Context.getObjCClassDecl(); 7406 7407 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7408 return Context.getObjCProtocolDecl(); 7409 7410 case PREDEF_DECL_INT_128_ID: 7411 return Context.getInt128Decl(); 7412 7413 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7414 return Context.getUInt128Decl(); 7415 7416 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7417 return Context.getObjCInstanceTypeDecl(); 7418 7419 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7420 return Context.getBuiltinVaListDecl(); 7421 7422 case PREDEF_DECL_VA_LIST_TAG: 7423 return Context.getVaListTagDecl(); 7424 7425 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7426 return Context.getBuiltinMSVaListDecl(); 7427 7428 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7429 return Context.getMSGuidTagDecl(); 7430 7431 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7432 return Context.getExternCContextDecl(); 7433 7434 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7435 return Context.getMakeIntegerSeqDecl(); 7436 7437 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7438 return Context.getCFConstantStringDecl(); 7439 7440 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7441 return Context.getCFConstantStringTagDecl(); 7442 7443 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7444 return Context.getTypePackElementDecl(); 7445 } 7446 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7447 } 7448 7449 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7450 assert(ContextObj && "reading decl with no AST context"); 7451 if (ID < NUM_PREDEF_DECL_IDS) { 7452 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7453 if (D) { 7454 // Track that we have merged the declaration with ID \p ID into the 7455 // pre-existing predefined declaration \p D. 7456 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7457 if (Merged.empty()) 7458 Merged.push_back(ID); 7459 } 7460 return D; 7461 } 7462 7463 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7464 7465 if (Index >= DeclsLoaded.size()) { 7466 assert(0 && "declaration ID out-of-range for AST file"); 7467 Error("declaration ID out-of-range for AST file"); 7468 return nullptr; 7469 } 7470 7471 return DeclsLoaded[Index]; 7472 } 7473 7474 Decl *ASTReader::GetDecl(DeclID ID) { 7475 if (ID < NUM_PREDEF_DECL_IDS) 7476 return GetExistingDecl(ID); 7477 7478 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7479 7480 if (Index >= DeclsLoaded.size()) { 7481 assert(0 && "declaration ID out-of-range for AST file"); 7482 Error("declaration ID out-of-range for AST file"); 7483 return nullptr; 7484 } 7485 7486 if (!DeclsLoaded[Index]) { 7487 ReadDeclRecord(ID); 7488 if (DeserializationListener) 7489 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7490 } 7491 7492 return DeclsLoaded[Index]; 7493 } 7494 7495 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7496 DeclID GlobalID) { 7497 if (GlobalID < NUM_PREDEF_DECL_IDS) 7498 return GlobalID; 7499 7500 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7501 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7502 ModuleFile *Owner = I->second; 7503 7504 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7505 = M.GlobalToLocalDeclIDs.find(Owner); 7506 if (Pos == M.GlobalToLocalDeclIDs.end()) 7507 return 0; 7508 7509 return GlobalID - Owner->BaseDeclID + Pos->second; 7510 } 7511 7512 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7513 const RecordData &Record, 7514 unsigned &Idx) { 7515 if (Idx >= Record.size()) { 7516 Error("Corrupted AST file"); 7517 return 0; 7518 } 7519 7520 return getGlobalDeclID(F, Record[Idx++]); 7521 } 7522 7523 /// Resolve the offset of a statement into a statement. 7524 /// 7525 /// This operation will read a new statement from the external 7526 /// source each time it is called, and is meant to be used via a 7527 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7528 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7529 // Switch case IDs are per Decl. 7530 ClearSwitchCaseIDs(); 7531 7532 // Offset here is a global offset across the entire chain. 7533 RecordLocation Loc = getLocalBitOffset(Offset); 7534 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7535 Error(std::move(Err)); 7536 return nullptr; 7537 } 7538 assert(NumCurrentElementsDeserializing == 0 && 7539 "should not be called while already deserializing"); 7540 Deserializing D(this); 7541 return ReadStmtFromStream(*Loc.F); 7542 } 7543 7544 void ASTReader::FindExternalLexicalDecls( 7545 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7546 SmallVectorImpl<Decl *> &Decls) { 7547 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7548 7549 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7550 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7551 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7552 auto K = (Decl::Kind)+LexicalDecls[I]; 7553 if (!IsKindWeWant(K)) 7554 continue; 7555 7556 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7557 7558 // Don't add predefined declarations to the lexical context more 7559 // than once. 7560 if (ID < NUM_PREDEF_DECL_IDS) { 7561 if (PredefsVisited[ID]) 7562 continue; 7563 7564 PredefsVisited[ID] = true; 7565 } 7566 7567 if (Decl *D = GetLocalDecl(*M, ID)) { 7568 assert(D->getKind() == K && "wrong kind for lexical decl"); 7569 if (!DC->isDeclInLexicalTraversal(D)) 7570 Decls.push_back(D); 7571 } 7572 } 7573 }; 7574 7575 if (isa<TranslationUnitDecl>(DC)) { 7576 for (auto Lexical : TULexicalDecls) 7577 Visit(Lexical.first, Lexical.second); 7578 } else { 7579 auto I = LexicalDecls.find(DC); 7580 if (I != LexicalDecls.end()) 7581 Visit(I->second.first, I->second.second); 7582 } 7583 7584 ++NumLexicalDeclContextsRead; 7585 } 7586 7587 namespace { 7588 7589 class DeclIDComp { 7590 ASTReader &Reader; 7591 ModuleFile &Mod; 7592 7593 public: 7594 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7595 7596 bool operator()(LocalDeclID L, LocalDeclID R) const { 7597 SourceLocation LHS = getLocation(L); 7598 SourceLocation RHS = getLocation(R); 7599 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7600 } 7601 7602 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7603 SourceLocation RHS = getLocation(R); 7604 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7605 } 7606 7607 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7608 SourceLocation LHS = getLocation(L); 7609 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7610 } 7611 7612 SourceLocation getLocation(LocalDeclID ID) const { 7613 return Reader.getSourceManager().getFileLoc( 7614 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7615 } 7616 }; 7617 7618 } // namespace 7619 7620 void ASTReader::FindFileRegionDecls(FileID File, 7621 unsigned Offset, unsigned Length, 7622 SmallVectorImpl<Decl *> &Decls) { 7623 SourceManager &SM = getSourceManager(); 7624 7625 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7626 if (I == FileDeclIDs.end()) 7627 return; 7628 7629 FileDeclsInfo &DInfo = I->second; 7630 if (DInfo.Decls.empty()) 7631 return; 7632 7633 SourceLocation 7634 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7635 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7636 7637 DeclIDComp DIDComp(*this, *DInfo.Mod); 7638 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7639 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7640 if (BeginIt != DInfo.Decls.begin()) 7641 --BeginIt; 7642 7643 // If we are pointing at a top-level decl inside an objc container, we need 7644 // to backtrack until we find it otherwise we will fail to report that the 7645 // region overlaps with an objc container. 7646 while (BeginIt != DInfo.Decls.begin() && 7647 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7648 ->isTopLevelDeclInObjCContainer()) 7649 --BeginIt; 7650 7651 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7652 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7653 if (EndIt != DInfo.Decls.end()) 7654 ++EndIt; 7655 7656 for (ArrayRef<serialization::LocalDeclID>::iterator 7657 DIt = BeginIt; DIt != EndIt; ++DIt) 7658 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7659 } 7660 7661 bool 7662 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7663 DeclarationName Name) { 7664 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7665 "DeclContext has no visible decls in storage"); 7666 if (!Name) 7667 return false; 7668 7669 auto It = Lookups.find(DC); 7670 if (It == Lookups.end()) 7671 return false; 7672 7673 Deserializing LookupResults(this); 7674 7675 // Load the list of declarations. 7676 SmallVector<NamedDecl *, 64> Decls; 7677 llvm::SmallPtrSet<NamedDecl *, 8> Found; 7678 for (DeclID ID : It->second.Table.find(Name)) { 7679 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7680 if (ND->getDeclName() == Name && Found.insert(ND).second) 7681 Decls.push_back(ND); 7682 } 7683 7684 ++NumVisibleDeclContextsRead; 7685 SetExternalVisibleDeclsForName(DC, Name, Decls); 7686 return !Decls.empty(); 7687 } 7688 7689 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7690 if (!DC->hasExternalVisibleStorage()) 7691 return; 7692 7693 auto It = Lookups.find(DC); 7694 assert(It != Lookups.end() && 7695 "have external visible storage but no lookup tables"); 7696 7697 DeclsMap Decls; 7698 7699 for (DeclID ID : It->second.Table.findAll()) { 7700 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7701 Decls[ND->getDeclName()].push_back(ND); 7702 } 7703 7704 ++NumVisibleDeclContextsRead; 7705 7706 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7707 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7708 } 7709 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7710 } 7711 7712 const serialization::reader::DeclContextLookupTable * 7713 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7714 auto I = Lookups.find(Primary); 7715 return I == Lookups.end() ? nullptr : &I->second; 7716 } 7717 7718 /// Under non-PCH compilation the consumer receives the objc methods 7719 /// before receiving the implementation, and codegen depends on this. 7720 /// We simulate this by deserializing and passing to consumer the methods of the 7721 /// implementation before passing the deserialized implementation decl. 7722 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7723 ASTConsumer *Consumer) { 7724 assert(ImplD && Consumer); 7725 7726 for (auto *I : ImplD->methods()) 7727 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7728 7729 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7730 } 7731 7732 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7733 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7734 PassObjCImplDeclToConsumer(ImplD, Consumer); 7735 else 7736 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7737 } 7738 7739 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7740 this->Consumer = Consumer; 7741 7742 if (Consumer) 7743 PassInterestingDeclsToConsumer(); 7744 7745 if (DeserializationListener) 7746 DeserializationListener->ReaderInitialized(this); 7747 } 7748 7749 void ASTReader::PrintStats() { 7750 std::fprintf(stderr, "*** AST File Statistics:\n"); 7751 7752 unsigned NumTypesLoaded = 7753 TypesLoaded.size() - llvm::count(TypesLoaded, QualType()); 7754 unsigned NumDeclsLoaded = 7755 DeclsLoaded.size() - llvm::count(DeclsLoaded, (Decl *)nullptr); 7756 unsigned NumIdentifiersLoaded = 7757 IdentifiersLoaded.size() - 7758 llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr); 7759 unsigned NumMacrosLoaded = 7760 MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr); 7761 unsigned NumSelectorsLoaded = 7762 SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector()); 7763 7764 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7765 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7766 NumSLocEntriesRead, TotalNumSLocEntries, 7767 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7768 if (!TypesLoaded.empty()) 7769 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7770 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7771 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7772 if (!DeclsLoaded.empty()) 7773 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7774 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7775 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7776 if (!IdentifiersLoaded.empty()) 7777 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7778 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7779 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7780 if (!MacrosLoaded.empty()) 7781 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7782 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7783 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7784 if (!SelectorsLoaded.empty()) 7785 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7786 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7787 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7788 if (TotalNumStatements) 7789 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7790 NumStatementsRead, TotalNumStatements, 7791 ((float)NumStatementsRead/TotalNumStatements * 100)); 7792 if (TotalNumMacros) 7793 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7794 NumMacrosRead, TotalNumMacros, 7795 ((float)NumMacrosRead/TotalNumMacros * 100)); 7796 if (TotalLexicalDeclContexts) 7797 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7798 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7799 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7800 * 100)); 7801 if (TotalVisibleDeclContexts) 7802 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7803 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7804 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7805 * 100)); 7806 if (TotalNumMethodPoolEntries) 7807 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7808 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7809 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7810 * 100)); 7811 if (NumMethodPoolLookups) 7812 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7813 NumMethodPoolHits, NumMethodPoolLookups, 7814 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7815 if (NumMethodPoolTableLookups) 7816 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7817 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7818 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7819 * 100.0)); 7820 if (NumIdentifierLookupHits) 7821 std::fprintf(stderr, 7822 " %u / %u identifier table lookups succeeded (%f%%)\n", 7823 NumIdentifierLookupHits, NumIdentifierLookups, 7824 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7825 7826 if (GlobalIndex) { 7827 std::fprintf(stderr, "\n"); 7828 GlobalIndex->printStats(); 7829 } 7830 7831 std::fprintf(stderr, "\n"); 7832 dump(); 7833 std::fprintf(stderr, "\n"); 7834 } 7835 7836 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7837 LLVM_DUMP_METHOD static void 7838 dumpModuleIDMap(StringRef Name, 7839 const ContinuousRangeMap<Key, ModuleFile *, 7840 InitialCapacity> &Map) { 7841 if (Map.begin() == Map.end()) 7842 return; 7843 7844 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7845 7846 llvm::errs() << Name << ":\n"; 7847 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7848 I != IEnd; ++I) { 7849 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7850 << "\n"; 7851 } 7852 } 7853 7854 LLVM_DUMP_METHOD void ASTReader::dump() { 7855 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7856 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7857 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7858 dumpModuleIDMap("Global type map", GlobalTypeMap); 7859 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7860 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7861 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7862 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7863 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7864 dumpModuleIDMap("Global preprocessed entity map", 7865 GlobalPreprocessedEntityMap); 7866 7867 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7868 for (ModuleFile &M : ModuleMgr) 7869 M.dump(); 7870 } 7871 7872 /// Return the amount of memory used by memory buffers, breaking down 7873 /// by heap-backed versus mmap'ed memory. 7874 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7875 for (ModuleFile &I : ModuleMgr) { 7876 if (llvm::MemoryBuffer *buf = I.Buffer) { 7877 size_t bytes = buf->getBufferSize(); 7878 switch (buf->getBufferKind()) { 7879 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7880 sizes.malloc_bytes += bytes; 7881 break; 7882 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7883 sizes.mmap_bytes += bytes; 7884 break; 7885 } 7886 } 7887 } 7888 } 7889 7890 void ASTReader::InitializeSema(Sema &S) { 7891 SemaObj = &S; 7892 S.addExternalSource(this); 7893 7894 // Makes sure any declarations that were deserialized "too early" 7895 // still get added to the identifier's declaration chains. 7896 for (uint64_t ID : PreloadedDeclIDs) { 7897 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7898 pushExternalDeclIntoScope(D, D->getDeclName()); 7899 } 7900 PreloadedDeclIDs.clear(); 7901 7902 // FIXME: What happens if these are changed by a module import? 7903 if (!FPPragmaOptions.empty()) { 7904 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7905 FPOptionsOverride NewOverrides = 7906 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]); 7907 SemaObj->CurFPFeatures = 7908 NewOverrides.applyOverrides(SemaObj->getLangOpts()); 7909 } 7910 7911 SemaObj->OpenCLFeatures = OpenCLExtensions; 7912 7913 UpdateSema(); 7914 } 7915 7916 void ASTReader::UpdateSema() { 7917 assert(SemaObj && "no Sema to update"); 7918 7919 // Load the offsets of the declarations that Sema references. 7920 // They will be lazily deserialized when needed. 7921 if (!SemaDeclRefs.empty()) { 7922 assert(SemaDeclRefs.size() % 3 == 0); 7923 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7924 if (!SemaObj->StdNamespace) 7925 SemaObj->StdNamespace = SemaDeclRefs[I]; 7926 if (!SemaObj->StdBadAlloc) 7927 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7928 if (!SemaObj->StdAlignValT) 7929 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7930 } 7931 SemaDeclRefs.clear(); 7932 } 7933 7934 // Update the state of pragmas. Use the same API as if we had encountered the 7935 // pragma in the source. 7936 if(OptimizeOffPragmaLocation.isValid()) 7937 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7938 if (PragmaMSStructState != -1) 7939 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7940 if (PointersToMembersPragmaLocation.isValid()) { 7941 SemaObj->ActOnPragmaMSPointersToMembers( 7942 (LangOptions::PragmaMSPointersToMembersKind) 7943 PragmaMSPointersToMembersState, 7944 PointersToMembersPragmaLocation); 7945 } 7946 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7947 7948 if (PragmaAlignPackCurrentValue) { 7949 // The bottom of the stack might have a default value. It must be adjusted 7950 // to the current value to ensure that the packing state is preserved after 7951 // popping entries that were included/imported from a PCH/module. 7952 bool DropFirst = false; 7953 if (!PragmaAlignPackStack.empty() && 7954 PragmaAlignPackStack.front().Location.isInvalid()) { 7955 assert(PragmaAlignPackStack.front().Value == 7956 SemaObj->AlignPackStack.DefaultValue && 7957 "Expected a default alignment value"); 7958 SemaObj->AlignPackStack.Stack.emplace_back( 7959 PragmaAlignPackStack.front().SlotLabel, 7960 SemaObj->AlignPackStack.CurrentValue, 7961 SemaObj->AlignPackStack.CurrentPragmaLocation, 7962 PragmaAlignPackStack.front().PushLocation); 7963 DropFirst = true; 7964 } 7965 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack) 7966 .drop_front(DropFirst ? 1 : 0)) { 7967 SemaObj->AlignPackStack.Stack.emplace_back( 7968 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7969 } 7970 if (PragmaAlignPackCurrentLocation.isInvalid()) { 7971 assert(*PragmaAlignPackCurrentValue == 7972 SemaObj->AlignPackStack.DefaultValue && 7973 "Expected a default align and pack value"); 7974 // Keep the current values. 7975 } else { 7976 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue; 7977 SemaObj->AlignPackStack.CurrentPragmaLocation = 7978 PragmaAlignPackCurrentLocation; 7979 } 7980 } 7981 if (FpPragmaCurrentValue) { 7982 // The bottom of the stack might have a default value. It must be adjusted 7983 // to the current value to ensure that fp-pragma state is preserved after 7984 // popping entries that were included/imported from a PCH/module. 7985 bool DropFirst = false; 7986 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7987 assert(FpPragmaStack.front().Value == 7988 SemaObj->FpPragmaStack.DefaultValue && 7989 "Expected a default pragma float_control value"); 7990 SemaObj->FpPragmaStack.Stack.emplace_back( 7991 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7992 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7993 FpPragmaStack.front().PushLocation); 7994 DropFirst = true; 7995 } 7996 for (const auto &Entry : 7997 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7998 SemaObj->FpPragmaStack.Stack.emplace_back( 7999 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 8000 if (FpPragmaCurrentLocation.isInvalid()) { 8001 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 8002 "Expected a default pragma float_control value"); 8003 // Keep the current values. 8004 } else { 8005 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 8006 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 8007 } 8008 } 8009 8010 // For non-modular AST files, restore visiblity of modules. 8011 for (auto &Import : ImportedModules) { 8012 if (Import.ImportLoc.isInvalid()) 8013 continue; 8014 if (Module *Imported = getSubmodule(Import.ID)) { 8015 SemaObj->makeModuleVisible(Imported, Import.ImportLoc); 8016 } 8017 } 8018 } 8019 8020 IdentifierInfo *ASTReader::get(StringRef Name) { 8021 // Note that we are loading an identifier. 8022 Deserializing AnIdentifier(this); 8023 8024 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 8025 NumIdentifierLookups, 8026 NumIdentifierLookupHits); 8027 8028 // We don't need to do identifier table lookups in C++ modules (we preload 8029 // all interesting declarations, and don't need to use the scope for name 8030 // lookups). Perform the lookup in PCH files, though, since we don't build 8031 // a complete initial identifier table if we're carrying on from a PCH. 8032 if (PP.getLangOpts().CPlusPlus) { 8033 for (auto F : ModuleMgr.pch_modules()) 8034 if (Visitor(*F)) 8035 break; 8036 } else { 8037 // If there is a global index, look there first to determine which modules 8038 // provably do not have any results for this identifier. 8039 GlobalModuleIndex::HitSet Hits; 8040 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 8041 if (!loadGlobalIndex()) { 8042 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 8043 HitsPtr = &Hits; 8044 } 8045 } 8046 8047 ModuleMgr.visit(Visitor, HitsPtr); 8048 } 8049 8050 IdentifierInfo *II = Visitor.getIdentifierInfo(); 8051 markIdentifierUpToDate(II); 8052 return II; 8053 } 8054 8055 namespace clang { 8056 8057 /// An identifier-lookup iterator that enumerates all of the 8058 /// identifiers stored within a set of AST files. 8059 class ASTIdentifierIterator : public IdentifierIterator { 8060 /// The AST reader whose identifiers are being enumerated. 8061 const ASTReader &Reader; 8062 8063 /// The current index into the chain of AST files stored in 8064 /// the AST reader. 8065 unsigned Index; 8066 8067 /// The current position within the identifier lookup table 8068 /// of the current AST file. 8069 ASTIdentifierLookupTable::key_iterator Current; 8070 8071 /// The end position within the identifier lookup table of 8072 /// the current AST file. 8073 ASTIdentifierLookupTable::key_iterator End; 8074 8075 /// Whether to skip any modules in the ASTReader. 8076 bool SkipModules; 8077 8078 public: 8079 explicit ASTIdentifierIterator(const ASTReader &Reader, 8080 bool SkipModules = false); 8081 8082 StringRef Next() override; 8083 }; 8084 8085 } // namespace clang 8086 8087 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 8088 bool SkipModules) 8089 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8090 } 8091 8092 StringRef ASTIdentifierIterator::Next() { 8093 while (Current == End) { 8094 // If we have exhausted all of our AST files, we're done. 8095 if (Index == 0) 8096 return StringRef(); 8097 8098 --Index; 8099 ModuleFile &F = Reader.ModuleMgr[Index]; 8100 if (SkipModules && F.isModule()) 8101 continue; 8102 8103 ASTIdentifierLookupTable *IdTable = 8104 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8105 Current = IdTable->key_begin(); 8106 End = IdTable->key_end(); 8107 } 8108 8109 // We have any identifiers remaining in the current AST file; return 8110 // the next one. 8111 StringRef Result = *Current; 8112 ++Current; 8113 return Result; 8114 } 8115 8116 namespace { 8117 8118 /// A utility for appending two IdentifierIterators. 8119 class ChainedIdentifierIterator : public IdentifierIterator { 8120 std::unique_ptr<IdentifierIterator> Current; 8121 std::unique_ptr<IdentifierIterator> Queued; 8122 8123 public: 8124 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8125 std::unique_ptr<IdentifierIterator> Second) 8126 : Current(std::move(First)), Queued(std::move(Second)) {} 8127 8128 StringRef Next() override { 8129 if (!Current) 8130 return StringRef(); 8131 8132 StringRef result = Current->Next(); 8133 if (!result.empty()) 8134 return result; 8135 8136 // Try the queued iterator, which may itself be empty. 8137 Current.reset(); 8138 std::swap(Current, Queued); 8139 return Next(); 8140 } 8141 }; 8142 8143 } // namespace 8144 8145 IdentifierIterator *ASTReader::getIdentifiers() { 8146 if (!loadGlobalIndex()) { 8147 std::unique_ptr<IdentifierIterator> ReaderIter( 8148 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8149 std::unique_ptr<IdentifierIterator> ModulesIter( 8150 GlobalIndex->createIdentifierIterator()); 8151 return new ChainedIdentifierIterator(std::move(ReaderIter), 8152 std::move(ModulesIter)); 8153 } 8154 8155 return new ASTIdentifierIterator(*this); 8156 } 8157 8158 namespace clang { 8159 namespace serialization { 8160 8161 class ReadMethodPoolVisitor { 8162 ASTReader &Reader; 8163 Selector Sel; 8164 unsigned PriorGeneration; 8165 unsigned InstanceBits = 0; 8166 unsigned FactoryBits = 0; 8167 bool InstanceHasMoreThanOneDecl = false; 8168 bool FactoryHasMoreThanOneDecl = false; 8169 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8170 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8171 8172 public: 8173 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8174 unsigned PriorGeneration) 8175 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8176 8177 bool operator()(ModuleFile &M) { 8178 if (!M.SelectorLookupTable) 8179 return false; 8180 8181 // If we've already searched this module file, skip it now. 8182 if (M.Generation <= PriorGeneration) 8183 return true; 8184 8185 ++Reader.NumMethodPoolTableLookups; 8186 ASTSelectorLookupTable *PoolTable 8187 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8188 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8189 if (Pos == PoolTable->end()) 8190 return false; 8191 8192 ++Reader.NumMethodPoolTableHits; 8193 ++Reader.NumSelectorsRead; 8194 // FIXME: Not quite happy with the statistics here. We probably should 8195 // disable this tracking when called via LoadSelector. 8196 // Also, should entries without methods count as misses? 8197 ++Reader.NumMethodPoolEntriesRead; 8198 ASTSelectorLookupTrait::data_type Data = *Pos; 8199 if (Reader.DeserializationListener) 8200 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8201 8202 // Append methods in the reverse order, so that later we can process them 8203 // in the order they appear in the source code by iterating through 8204 // the vector in the reverse order. 8205 InstanceMethods.append(Data.Instance.rbegin(), Data.Instance.rend()); 8206 FactoryMethods.append(Data.Factory.rbegin(), Data.Factory.rend()); 8207 InstanceBits = Data.InstanceBits; 8208 FactoryBits = Data.FactoryBits; 8209 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8210 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8211 return false; 8212 } 8213 8214 /// Retrieve the instance methods found by this visitor. 8215 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8216 return InstanceMethods; 8217 } 8218 8219 /// Retrieve the instance methods found by this visitor. 8220 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8221 return FactoryMethods; 8222 } 8223 8224 unsigned getInstanceBits() const { return InstanceBits; } 8225 unsigned getFactoryBits() const { return FactoryBits; } 8226 8227 bool instanceHasMoreThanOneDecl() const { 8228 return InstanceHasMoreThanOneDecl; 8229 } 8230 8231 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8232 }; 8233 8234 } // namespace serialization 8235 } // namespace clang 8236 8237 /// Add the given set of methods to the method list. 8238 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8239 ObjCMethodList &List) { 8240 for (auto I = Methods.rbegin(), E = Methods.rend(); I != E; ++I) 8241 S.addMethodToGlobalList(&List, *I); 8242 } 8243 8244 void ASTReader::ReadMethodPool(Selector Sel) { 8245 // Get the selector generation and update it to the current generation. 8246 unsigned &Generation = SelectorGeneration[Sel]; 8247 unsigned PriorGeneration = Generation; 8248 Generation = getGeneration(); 8249 SelectorOutOfDate[Sel] = false; 8250 8251 // Search for methods defined with this selector. 8252 ++NumMethodPoolLookups; 8253 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8254 ModuleMgr.visit(Visitor); 8255 8256 if (Visitor.getInstanceMethods().empty() && 8257 Visitor.getFactoryMethods().empty()) 8258 return; 8259 8260 ++NumMethodPoolHits; 8261 8262 if (!getSema()) 8263 return; 8264 8265 Sema &S = *getSema(); 8266 Sema::GlobalMethodPool::iterator Pos = 8267 S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethodPool::Lists())) 8268 .first; 8269 8270 Pos->second.first.setBits(Visitor.getInstanceBits()); 8271 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8272 Pos->second.second.setBits(Visitor.getFactoryBits()); 8273 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8274 8275 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8276 // when building a module we keep every method individually and may need to 8277 // update hasMoreThanOneDecl as we add the methods. 8278 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8279 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8280 } 8281 8282 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8283 if (SelectorOutOfDate[Sel]) 8284 ReadMethodPool(Sel); 8285 } 8286 8287 void ASTReader::ReadKnownNamespaces( 8288 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8289 Namespaces.clear(); 8290 8291 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8292 if (NamespaceDecl *Namespace 8293 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8294 Namespaces.push_back(Namespace); 8295 } 8296 } 8297 8298 void ASTReader::ReadUndefinedButUsed( 8299 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8300 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8301 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8302 SourceLocation Loc = 8303 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8304 Undefined.insert(std::make_pair(D, Loc)); 8305 } 8306 } 8307 8308 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8309 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8310 Exprs) { 8311 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8312 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8313 uint64_t Count = DelayedDeleteExprs[Idx++]; 8314 for (uint64_t C = 0; C < Count; ++C) { 8315 SourceLocation DeleteLoc = 8316 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8317 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8318 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8319 } 8320 } 8321 } 8322 8323 void ASTReader::ReadTentativeDefinitions( 8324 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8325 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8326 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8327 if (Var) 8328 TentativeDefs.push_back(Var); 8329 } 8330 TentativeDefinitions.clear(); 8331 } 8332 8333 void ASTReader::ReadUnusedFileScopedDecls( 8334 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8335 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8336 DeclaratorDecl *D 8337 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8338 if (D) 8339 Decls.push_back(D); 8340 } 8341 UnusedFileScopedDecls.clear(); 8342 } 8343 8344 void ASTReader::ReadDelegatingConstructors( 8345 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8346 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8347 CXXConstructorDecl *D 8348 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8349 if (D) 8350 Decls.push_back(D); 8351 } 8352 DelegatingCtorDecls.clear(); 8353 } 8354 8355 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8356 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8357 TypedefNameDecl *D 8358 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8359 if (D) 8360 Decls.push_back(D); 8361 } 8362 ExtVectorDecls.clear(); 8363 } 8364 8365 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8366 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8367 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8368 ++I) { 8369 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8370 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8371 if (D) 8372 Decls.insert(D); 8373 } 8374 UnusedLocalTypedefNameCandidates.clear(); 8375 } 8376 8377 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8378 llvm::SmallSetVector<Decl *, 4> &Decls) { 8379 for (auto I : DeclsToCheckForDeferredDiags) { 8380 auto *D = dyn_cast_or_null<Decl>(GetDecl(I)); 8381 if (D) 8382 Decls.insert(D); 8383 } 8384 DeclsToCheckForDeferredDiags.clear(); 8385 } 8386 8387 void ASTReader::ReadReferencedSelectors( 8388 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8389 if (ReferencedSelectorsData.empty()) 8390 return; 8391 8392 // If there are @selector references added them to its pool. This is for 8393 // implementation of -Wselector. 8394 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8395 unsigned I = 0; 8396 while (I < DataSize) { 8397 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8398 SourceLocation SelLoc 8399 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8400 Sels.push_back(std::make_pair(Sel, SelLoc)); 8401 } 8402 ReferencedSelectorsData.clear(); 8403 } 8404 8405 void ASTReader::ReadWeakUndeclaredIdentifiers( 8406 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8407 if (WeakUndeclaredIdentifiers.empty()) 8408 return; 8409 8410 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8411 IdentifierInfo *WeakId 8412 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8413 IdentifierInfo *AliasId 8414 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8415 SourceLocation Loc = 8416 SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8417 WeakInfo WI(AliasId, Loc); 8418 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8419 } 8420 WeakUndeclaredIdentifiers.clear(); 8421 } 8422 8423 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8424 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8425 ExternalVTableUse VT; 8426 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8427 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8428 VT.DefinitionRequired = VTableUses[Idx++]; 8429 VTables.push_back(VT); 8430 } 8431 8432 VTableUses.clear(); 8433 } 8434 8435 void ASTReader::ReadPendingInstantiations( 8436 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8437 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8438 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8439 SourceLocation Loc 8440 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8441 8442 Pending.push_back(std::make_pair(D, Loc)); 8443 } 8444 PendingInstantiations.clear(); 8445 } 8446 8447 void ASTReader::ReadLateParsedTemplates( 8448 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8449 &LPTMap) { 8450 for (auto &LPT : LateParsedTemplates) { 8451 ModuleFile *FMod = LPT.first; 8452 RecordDataImpl &LateParsed = LPT.second; 8453 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; 8454 /* In loop */) { 8455 FunctionDecl *FD = 8456 cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++])); 8457 8458 auto LT = std::make_unique<LateParsedTemplate>(); 8459 LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]); 8460 8461 ModuleFile *F = getOwningModuleFile(LT->D); 8462 assert(F && "No module"); 8463 8464 unsigned TokN = LateParsed[Idx++]; 8465 LT->Toks.reserve(TokN); 8466 for (unsigned T = 0; T < TokN; ++T) 8467 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx)); 8468 8469 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8470 } 8471 } 8472 8473 LateParsedTemplates.clear(); 8474 } 8475 8476 void ASTReader::LoadSelector(Selector Sel) { 8477 // It would be complicated to avoid reading the methods anyway. So don't. 8478 ReadMethodPool(Sel); 8479 } 8480 8481 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8482 assert(ID && "Non-zero identifier ID required"); 8483 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8484 IdentifiersLoaded[ID - 1] = II; 8485 if (DeserializationListener) 8486 DeserializationListener->IdentifierRead(ID, II); 8487 } 8488 8489 /// Set the globally-visible declarations associated with the given 8490 /// identifier. 8491 /// 8492 /// If the AST reader is currently in a state where the given declaration IDs 8493 /// cannot safely be resolved, they are queued until it is safe to resolve 8494 /// them. 8495 /// 8496 /// \param II an IdentifierInfo that refers to one or more globally-visible 8497 /// declarations. 8498 /// 8499 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8500 /// visible at global scope. 8501 /// 8502 /// \param Decls if non-null, this vector will be populated with the set of 8503 /// deserialized declarations. These declarations will not be pushed into 8504 /// scope. 8505 void 8506 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8507 const SmallVectorImpl<uint32_t> &DeclIDs, 8508 SmallVectorImpl<Decl *> *Decls) { 8509 if (NumCurrentElementsDeserializing && !Decls) { 8510 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8511 return; 8512 } 8513 8514 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8515 if (!SemaObj) { 8516 // Queue this declaration so that it will be added to the 8517 // translation unit scope and identifier's declaration chain 8518 // once a Sema object is known. 8519 PreloadedDeclIDs.push_back(DeclIDs[I]); 8520 continue; 8521 } 8522 8523 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8524 8525 // If we're simply supposed to record the declarations, do so now. 8526 if (Decls) { 8527 Decls->push_back(D); 8528 continue; 8529 } 8530 8531 // Introduce this declaration into the translation-unit scope 8532 // and add it to the declaration chain for this identifier, so 8533 // that (unqualified) name lookup will find it. 8534 pushExternalDeclIntoScope(D, II); 8535 } 8536 } 8537 8538 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8539 if (ID == 0) 8540 return nullptr; 8541 8542 if (IdentifiersLoaded.empty()) { 8543 Error("no identifier table in AST file"); 8544 return nullptr; 8545 } 8546 8547 ID -= 1; 8548 if (!IdentifiersLoaded[ID]) { 8549 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8550 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8551 ModuleFile *M = I->second; 8552 unsigned Index = ID - M->BaseIdentifierID; 8553 const unsigned char *Data = 8554 M->IdentifierTableData + M->IdentifierOffsets[Index]; 8555 8556 ASTIdentifierLookupTrait Trait(*this, *M); 8557 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 8558 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 8559 auto &II = PP.getIdentifierTable().get(Key); 8560 IdentifiersLoaded[ID] = &II; 8561 markIdentifierFromAST(*this, II); 8562 if (DeserializationListener) 8563 DeserializationListener->IdentifierRead(ID + 1, &II); 8564 } 8565 8566 return IdentifiersLoaded[ID]; 8567 } 8568 8569 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8570 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8571 } 8572 8573 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8574 if (LocalID < NUM_PREDEF_IDENT_IDS) 8575 return LocalID; 8576 8577 if (!M.ModuleOffsetMap.empty()) 8578 ReadModuleOffsetMap(M); 8579 8580 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8581 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8582 assert(I != M.IdentifierRemap.end() 8583 && "Invalid index into identifier index remap"); 8584 8585 return LocalID + I->second; 8586 } 8587 8588 MacroInfo *ASTReader::getMacro(MacroID ID) { 8589 if (ID == 0) 8590 return nullptr; 8591 8592 if (MacrosLoaded.empty()) { 8593 Error("no macro table in AST file"); 8594 return nullptr; 8595 } 8596 8597 ID -= NUM_PREDEF_MACRO_IDS; 8598 if (!MacrosLoaded[ID]) { 8599 GlobalMacroMapType::iterator I 8600 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8601 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8602 ModuleFile *M = I->second; 8603 unsigned Index = ID - M->BaseMacroID; 8604 MacrosLoaded[ID] = 8605 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8606 8607 if (DeserializationListener) 8608 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8609 MacrosLoaded[ID]); 8610 } 8611 8612 return MacrosLoaded[ID]; 8613 } 8614 8615 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8616 if (LocalID < NUM_PREDEF_MACRO_IDS) 8617 return LocalID; 8618 8619 if (!M.ModuleOffsetMap.empty()) 8620 ReadModuleOffsetMap(M); 8621 8622 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8623 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8624 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8625 8626 return LocalID + I->second; 8627 } 8628 8629 serialization::SubmoduleID 8630 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8631 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8632 return LocalID; 8633 8634 if (!M.ModuleOffsetMap.empty()) 8635 ReadModuleOffsetMap(M); 8636 8637 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8638 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8639 assert(I != M.SubmoduleRemap.end() 8640 && "Invalid index into submodule index remap"); 8641 8642 return LocalID + I->second; 8643 } 8644 8645 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8646 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8647 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8648 return nullptr; 8649 } 8650 8651 if (GlobalID > SubmodulesLoaded.size()) { 8652 Error("submodule ID out of range in AST file"); 8653 return nullptr; 8654 } 8655 8656 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8657 } 8658 8659 Module *ASTReader::getModule(unsigned ID) { 8660 return getSubmodule(ID); 8661 } 8662 8663 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8664 if (ID & 1) { 8665 // It's a module, look it up by submodule ID. 8666 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8667 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8668 } else { 8669 // It's a prefix (preamble, PCH, ...). Look it up by index. 8670 unsigned IndexFromEnd = ID >> 1; 8671 assert(IndexFromEnd && "got reference to unknown module file"); 8672 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8673 } 8674 } 8675 8676 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8677 if (!F) 8678 return 1; 8679 8680 // For a file representing a module, use the submodule ID of the top-level 8681 // module as the file ID. For any other kind of file, the number of such 8682 // files loaded beforehand will be the same on reload. 8683 // FIXME: Is this true even if we have an explicit module file and a PCH? 8684 if (F->isModule()) 8685 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8686 8687 auto PCHModules = getModuleManager().pch_modules(); 8688 auto I = llvm::find(PCHModules, F); 8689 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8690 return (I - PCHModules.end()) << 1; 8691 } 8692 8693 llvm::Optional<ASTSourceDescriptor> 8694 ASTReader::getSourceDescriptor(unsigned ID) { 8695 if (Module *M = getSubmodule(ID)) 8696 return ASTSourceDescriptor(*M); 8697 8698 // If there is only a single PCH, return it instead. 8699 // Chained PCH are not supported. 8700 const auto &PCHChain = ModuleMgr.pch_modules(); 8701 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8702 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8703 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8704 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8705 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8706 MF.Signature); 8707 } 8708 return None; 8709 } 8710 8711 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8712 auto I = DefinitionSource.find(FD); 8713 if (I == DefinitionSource.end()) 8714 return EK_ReplyHazy; 8715 return I->second ? EK_Never : EK_Always; 8716 } 8717 8718 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8719 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8720 } 8721 8722 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8723 if (ID == 0) 8724 return Selector(); 8725 8726 if (ID > SelectorsLoaded.size()) { 8727 Error("selector ID out of range in AST file"); 8728 return Selector(); 8729 } 8730 8731 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8732 // Load this selector from the selector table. 8733 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8734 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8735 ModuleFile &M = *I->second; 8736 ASTSelectorLookupTrait Trait(*this, M); 8737 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8738 SelectorsLoaded[ID - 1] = 8739 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8740 if (DeserializationListener) 8741 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8742 } 8743 8744 return SelectorsLoaded[ID - 1]; 8745 } 8746 8747 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8748 return DecodeSelector(ID); 8749 } 8750 8751 uint32_t ASTReader::GetNumExternalSelectors() { 8752 // ID 0 (the null selector) is considered an external selector. 8753 return getTotalNumSelectors() + 1; 8754 } 8755 8756 serialization::SelectorID 8757 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8758 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8759 return LocalID; 8760 8761 if (!M.ModuleOffsetMap.empty()) 8762 ReadModuleOffsetMap(M); 8763 8764 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8765 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8766 assert(I != M.SelectorRemap.end() 8767 && "Invalid index into selector index remap"); 8768 8769 return LocalID + I->second; 8770 } 8771 8772 DeclarationNameLoc 8773 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8774 switch (Name.getNameKind()) { 8775 case DeclarationName::CXXConstructorName: 8776 case DeclarationName::CXXDestructorName: 8777 case DeclarationName::CXXConversionFunctionName: 8778 return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo()); 8779 8780 case DeclarationName::CXXOperatorName: 8781 return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange()); 8782 8783 case DeclarationName::CXXLiteralOperatorName: 8784 return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc( 8785 readSourceLocation()); 8786 8787 case DeclarationName::Identifier: 8788 case DeclarationName::ObjCZeroArgSelector: 8789 case DeclarationName::ObjCOneArgSelector: 8790 case DeclarationName::ObjCMultiArgSelector: 8791 case DeclarationName::CXXUsingDirective: 8792 case DeclarationName::CXXDeductionGuideName: 8793 break; 8794 } 8795 return DeclarationNameLoc(); 8796 } 8797 8798 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8799 DeclarationNameInfo NameInfo; 8800 NameInfo.setName(readDeclarationName()); 8801 NameInfo.setLoc(readSourceLocation()); 8802 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8803 return NameInfo; 8804 } 8805 8806 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8807 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8808 unsigned NumTPLists = readInt(); 8809 Info.NumTemplParamLists = NumTPLists; 8810 if (NumTPLists) { 8811 Info.TemplParamLists = 8812 new (getContext()) TemplateParameterList *[NumTPLists]; 8813 for (unsigned i = 0; i != NumTPLists; ++i) 8814 Info.TemplParamLists[i] = readTemplateParameterList(); 8815 } 8816 } 8817 8818 TemplateParameterList * 8819 ASTRecordReader::readTemplateParameterList() { 8820 SourceLocation TemplateLoc = readSourceLocation(); 8821 SourceLocation LAngleLoc = readSourceLocation(); 8822 SourceLocation RAngleLoc = readSourceLocation(); 8823 8824 unsigned NumParams = readInt(); 8825 SmallVector<NamedDecl *, 16> Params; 8826 Params.reserve(NumParams); 8827 while (NumParams--) 8828 Params.push_back(readDeclAs<NamedDecl>()); 8829 8830 bool HasRequiresClause = readBool(); 8831 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8832 8833 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8834 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8835 return TemplateParams; 8836 } 8837 8838 void ASTRecordReader::readTemplateArgumentList( 8839 SmallVectorImpl<TemplateArgument> &TemplArgs, 8840 bool Canonicalize) { 8841 unsigned NumTemplateArgs = readInt(); 8842 TemplArgs.reserve(NumTemplateArgs); 8843 while (NumTemplateArgs--) 8844 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8845 } 8846 8847 /// Read a UnresolvedSet structure. 8848 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8849 unsigned NumDecls = readInt(); 8850 Set.reserve(getContext(), NumDecls); 8851 while (NumDecls--) { 8852 DeclID ID = readDeclID(); 8853 AccessSpecifier AS = (AccessSpecifier) readInt(); 8854 Set.addLazyDecl(getContext(), ID, AS); 8855 } 8856 } 8857 8858 CXXBaseSpecifier 8859 ASTRecordReader::readCXXBaseSpecifier() { 8860 bool isVirtual = readBool(); 8861 bool isBaseOfClass = readBool(); 8862 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8863 bool inheritConstructors = readBool(); 8864 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8865 SourceRange Range = readSourceRange(); 8866 SourceLocation EllipsisLoc = readSourceLocation(); 8867 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8868 EllipsisLoc); 8869 Result.setInheritConstructors(inheritConstructors); 8870 return Result; 8871 } 8872 8873 CXXCtorInitializer ** 8874 ASTRecordReader::readCXXCtorInitializers() { 8875 ASTContext &Context = getContext(); 8876 unsigned NumInitializers = readInt(); 8877 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8878 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8879 for (unsigned i = 0; i != NumInitializers; ++i) { 8880 TypeSourceInfo *TInfo = nullptr; 8881 bool IsBaseVirtual = false; 8882 FieldDecl *Member = nullptr; 8883 IndirectFieldDecl *IndirectMember = nullptr; 8884 8885 CtorInitializerType Type = (CtorInitializerType) readInt(); 8886 switch (Type) { 8887 case CTOR_INITIALIZER_BASE: 8888 TInfo = readTypeSourceInfo(); 8889 IsBaseVirtual = readBool(); 8890 break; 8891 8892 case CTOR_INITIALIZER_DELEGATING: 8893 TInfo = readTypeSourceInfo(); 8894 break; 8895 8896 case CTOR_INITIALIZER_MEMBER: 8897 Member = readDeclAs<FieldDecl>(); 8898 break; 8899 8900 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8901 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8902 break; 8903 } 8904 8905 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8906 Expr *Init = readExpr(); 8907 SourceLocation LParenLoc = readSourceLocation(); 8908 SourceLocation RParenLoc = readSourceLocation(); 8909 8910 CXXCtorInitializer *BOMInit; 8911 if (Type == CTOR_INITIALIZER_BASE) 8912 BOMInit = new (Context) 8913 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8914 RParenLoc, MemberOrEllipsisLoc); 8915 else if (Type == CTOR_INITIALIZER_DELEGATING) 8916 BOMInit = new (Context) 8917 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8918 else if (Member) 8919 BOMInit = new (Context) 8920 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8921 Init, RParenLoc); 8922 else 8923 BOMInit = new (Context) 8924 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8925 LParenLoc, Init, RParenLoc); 8926 8927 if (/*IsWritten*/readBool()) { 8928 unsigned SourceOrder = readInt(); 8929 BOMInit->setSourceOrder(SourceOrder); 8930 } 8931 8932 CtorInitializers[i] = BOMInit; 8933 } 8934 8935 return CtorInitializers; 8936 } 8937 8938 NestedNameSpecifierLoc 8939 ASTRecordReader::readNestedNameSpecifierLoc() { 8940 ASTContext &Context = getContext(); 8941 unsigned N = readInt(); 8942 NestedNameSpecifierLocBuilder Builder; 8943 for (unsigned I = 0; I != N; ++I) { 8944 auto Kind = readNestedNameSpecifierKind(); 8945 switch (Kind) { 8946 case NestedNameSpecifier::Identifier: { 8947 IdentifierInfo *II = readIdentifier(); 8948 SourceRange Range = readSourceRange(); 8949 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8950 break; 8951 } 8952 8953 case NestedNameSpecifier::Namespace: { 8954 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8955 SourceRange Range = readSourceRange(); 8956 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8957 break; 8958 } 8959 8960 case NestedNameSpecifier::NamespaceAlias: { 8961 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8962 SourceRange Range = readSourceRange(); 8963 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8964 break; 8965 } 8966 8967 case NestedNameSpecifier::TypeSpec: 8968 case NestedNameSpecifier::TypeSpecWithTemplate: { 8969 bool Template = readBool(); 8970 TypeSourceInfo *T = readTypeSourceInfo(); 8971 if (!T) 8972 return NestedNameSpecifierLoc(); 8973 SourceLocation ColonColonLoc = readSourceLocation(); 8974 8975 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8976 Builder.Extend(Context, 8977 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8978 T->getTypeLoc(), ColonColonLoc); 8979 break; 8980 } 8981 8982 case NestedNameSpecifier::Global: { 8983 SourceLocation ColonColonLoc = readSourceLocation(); 8984 Builder.MakeGlobal(Context, ColonColonLoc); 8985 break; 8986 } 8987 8988 case NestedNameSpecifier::Super: { 8989 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8990 SourceRange Range = readSourceRange(); 8991 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8992 break; 8993 } 8994 } 8995 } 8996 8997 return Builder.getWithLocInContext(Context); 8998 } 8999 9000 SourceRange ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 9001 unsigned &Idx, LocSeq *Seq) { 9002 SourceLocation beg = ReadSourceLocation(F, Record, Idx, Seq); 9003 SourceLocation end = ReadSourceLocation(F, Record, Idx, Seq); 9004 return SourceRange(beg, end); 9005 } 9006 9007 /// Read a floating-point value 9008 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 9009 return llvm::APFloat(Sem, readAPInt()); 9010 } 9011 9012 // Read a string 9013 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 9014 unsigned Len = Record[Idx++]; 9015 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 9016 Idx += Len; 9017 return Result; 9018 } 9019 9020 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 9021 unsigned &Idx) { 9022 std::string Filename = ReadString(Record, Idx); 9023 ResolveImportedPath(F, Filename); 9024 return Filename; 9025 } 9026 9027 std::string ASTReader::ReadPath(StringRef BaseDirectory, 9028 const RecordData &Record, unsigned &Idx) { 9029 std::string Filename = ReadString(Record, Idx); 9030 if (!BaseDirectory.empty()) 9031 ResolveImportedPath(Filename, BaseDirectory); 9032 return Filename; 9033 } 9034 9035 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 9036 unsigned &Idx) { 9037 unsigned Major = Record[Idx++]; 9038 unsigned Minor = Record[Idx++]; 9039 unsigned Subminor = Record[Idx++]; 9040 if (Minor == 0) 9041 return VersionTuple(Major); 9042 if (Subminor == 0) 9043 return VersionTuple(Major, Minor - 1); 9044 return VersionTuple(Major, Minor - 1, Subminor - 1); 9045 } 9046 9047 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 9048 const RecordData &Record, 9049 unsigned &Idx) { 9050 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 9051 return CXXTemporary::Create(getContext(), Decl); 9052 } 9053 9054 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9055 return Diag(CurrentImportLoc, DiagID); 9056 } 9057 9058 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9059 return Diags.Report(Loc, DiagID); 9060 } 9061 9062 /// Retrieve the identifier table associated with the 9063 /// preprocessor. 9064 IdentifierTable &ASTReader::getIdentifierTable() { 9065 return PP.getIdentifierTable(); 9066 } 9067 9068 /// Record that the given ID maps to the given switch-case 9069 /// statement. 9070 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9071 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9072 "Already have a SwitchCase with this ID"); 9073 (*CurrSwitchCaseStmts)[ID] = SC; 9074 } 9075 9076 /// Retrieve the switch-case statement with the given ID. 9077 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9078 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9079 return (*CurrSwitchCaseStmts)[ID]; 9080 } 9081 9082 void ASTReader::ClearSwitchCaseIDs() { 9083 CurrSwitchCaseStmts->clear(); 9084 } 9085 9086 void ASTReader::ReadComments() { 9087 ASTContext &Context = getContext(); 9088 std::vector<RawComment *> Comments; 9089 for (SmallVectorImpl<std::pair<BitstreamCursor, 9090 serialization::ModuleFile *>>::iterator 9091 I = CommentsCursors.begin(), 9092 E = CommentsCursors.end(); 9093 I != E; ++I) { 9094 Comments.clear(); 9095 BitstreamCursor &Cursor = I->first; 9096 serialization::ModuleFile &F = *I->second; 9097 SavedStreamPosition SavedPosition(Cursor); 9098 9099 RecordData Record; 9100 while (true) { 9101 Expected<llvm::BitstreamEntry> MaybeEntry = 9102 Cursor.advanceSkippingSubblocks( 9103 BitstreamCursor::AF_DontPopBlockAtEnd); 9104 if (!MaybeEntry) { 9105 Error(MaybeEntry.takeError()); 9106 return; 9107 } 9108 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9109 9110 switch (Entry.Kind) { 9111 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9112 case llvm::BitstreamEntry::Error: 9113 Error("malformed block record in AST file"); 9114 return; 9115 case llvm::BitstreamEntry::EndBlock: 9116 goto NextCursor; 9117 case llvm::BitstreamEntry::Record: 9118 // The interesting case. 9119 break; 9120 } 9121 9122 // Read a record. 9123 Record.clear(); 9124 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9125 if (!MaybeComment) { 9126 Error(MaybeComment.takeError()); 9127 return; 9128 } 9129 switch ((CommentRecordTypes)MaybeComment.get()) { 9130 case COMMENTS_RAW_COMMENT: { 9131 unsigned Idx = 0; 9132 SourceRange SR = ReadSourceRange(F, Record, Idx); 9133 RawComment::CommentKind Kind = 9134 (RawComment::CommentKind) Record[Idx++]; 9135 bool IsTrailingComment = Record[Idx++]; 9136 bool IsAlmostTrailingComment = Record[Idx++]; 9137 Comments.push_back(new (Context) RawComment( 9138 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9139 break; 9140 } 9141 } 9142 } 9143 NextCursor: 9144 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9145 FileToOffsetToComment; 9146 for (RawComment *C : Comments) { 9147 SourceLocation CommentLoc = C->getBeginLoc(); 9148 if (CommentLoc.isValid()) { 9149 std::pair<FileID, unsigned> Loc = 9150 SourceMgr.getDecomposedLoc(CommentLoc); 9151 if (Loc.first.isValid()) 9152 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9153 } 9154 } 9155 } 9156 } 9157 9158 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9159 bool IncludeSystem, bool Complain, 9160 llvm::function_ref<void(const serialization::InputFile &IF, 9161 bool isSystem)> Visitor) { 9162 unsigned NumUserInputs = MF.NumUserInputFiles; 9163 unsigned NumInputs = MF.InputFilesLoaded.size(); 9164 assert(NumUserInputs <= NumInputs); 9165 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9166 for (unsigned I = 0; I < N; ++I) { 9167 bool IsSystem = I >= NumUserInputs; 9168 InputFile IF = getInputFile(MF, I+1, Complain); 9169 Visitor(IF, IsSystem); 9170 } 9171 } 9172 9173 void ASTReader::visitTopLevelModuleMaps( 9174 serialization::ModuleFile &MF, 9175 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9176 unsigned NumInputs = MF.InputFilesLoaded.size(); 9177 for (unsigned I = 0; I < NumInputs; ++I) { 9178 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9179 if (IFI.TopLevelModuleMap) 9180 // FIXME: This unnecessarily re-reads the InputFileInfo. 9181 if (auto FE = getInputFile(MF, I + 1).getFile()) 9182 Visitor(FE); 9183 } 9184 } 9185 9186 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9187 // If we know the owning module, use it. 9188 if (Module *M = D->getImportedOwningModule()) 9189 return M->getFullModuleName(); 9190 9191 // Otherwise, use the name of the top-level module the decl is within. 9192 if (ModuleFile *M = getOwningModuleFile(D)) 9193 return M->ModuleName; 9194 9195 // Not from a module. 9196 return {}; 9197 } 9198 9199 void ASTReader::finishPendingActions() { 9200 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9201 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9202 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9203 !PendingUpdateRecords.empty() || 9204 !PendingObjCExtensionIvarRedeclarations.empty()) { 9205 // If any identifiers with corresponding top-level declarations have 9206 // been loaded, load those declarations now. 9207 using TopLevelDeclsMap = 9208 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9209 TopLevelDeclsMap TopLevelDecls; 9210 9211 while (!PendingIdentifierInfos.empty()) { 9212 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9213 SmallVector<uint32_t, 4> DeclIDs = 9214 std::move(PendingIdentifierInfos.back().second); 9215 PendingIdentifierInfos.pop_back(); 9216 9217 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9218 } 9219 9220 // Load each function type that we deferred loading because it was a 9221 // deduced type that might refer to a local type declared within itself. 9222 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9223 auto *FD = PendingFunctionTypes[I].first; 9224 FD->setType(GetType(PendingFunctionTypes[I].second)); 9225 9226 // If we gave a function a deduced return type, remember that we need to 9227 // propagate that along the redeclaration chain. 9228 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9229 if (DT && DT->isDeduced()) 9230 PendingDeducedTypeUpdates.insert( 9231 {FD->getCanonicalDecl(), FD->getReturnType()}); 9232 } 9233 PendingFunctionTypes.clear(); 9234 9235 // For each decl chain that we wanted to complete while deserializing, mark 9236 // it as "still needs to be completed". 9237 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9238 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9239 } 9240 PendingIncompleteDeclChains.clear(); 9241 9242 // Load pending declaration chains. 9243 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9244 loadPendingDeclChain(PendingDeclChains[I].first, 9245 PendingDeclChains[I].second); 9246 PendingDeclChains.clear(); 9247 9248 // Make the most recent of the top-level declarations visible. 9249 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9250 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9251 IdentifierInfo *II = TLD->first; 9252 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9253 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9254 } 9255 } 9256 9257 // Load any pending macro definitions. 9258 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9259 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9260 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9261 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9262 // Initialize the macro history from chained-PCHs ahead of module imports. 9263 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9264 ++IDIdx) { 9265 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9266 if (!Info.M->isModule()) 9267 resolvePendingMacro(II, Info); 9268 } 9269 // Handle module imports. 9270 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9271 ++IDIdx) { 9272 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9273 if (Info.M->isModule()) 9274 resolvePendingMacro(II, Info); 9275 } 9276 } 9277 PendingMacroIDs.clear(); 9278 9279 // Wire up the DeclContexts for Decls that we delayed setting until 9280 // recursive loading is completed. 9281 while (!PendingDeclContextInfos.empty()) { 9282 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9283 PendingDeclContextInfos.pop_front(); 9284 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9285 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9286 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9287 } 9288 9289 // Perform any pending declaration updates. 9290 while (!PendingUpdateRecords.empty()) { 9291 auto Update = PendingUpdateRecords.pop_back_val(); 9292 ReadingKindTracker ReadingKind(Read_Decl, *this); 9293 loadDeclUpdateRecords(Update); 9294 } 9295 9296 while (!PendingObjCExtensionIvarRedeclarations.empty()) { 9297 auto ExtensionsPair = PendingObjCExtensionIvarRedeclarations.back().first; 9298 auto DuplicateIvars = 9299 PendingObjCExtensionIvarRedeclarations.back().second; 9300 llvm::DenseSet<std::pair<Decl *, Decl *>> NonEquivalentDecls; 9301 StructuralEquivalenceContext Ctx( 9302 ExtensionsPair.first->getASTContext(), 9303 ExtensionsPair.second->getASTContext(), NonEquivalentDecls, 9304 StructuralEquivalenceKind::Default, /*StrictTypeSpelling =*/false, 9305 /*Complain =*/false, 9306 /*ErrorOnTagTypeMismatch =*/true); 9307 if (Ctx.IsEquivalent(ExtensionsPair.first, ExtensionsPair.second)) { 9308 // Merge redeclared ivars with their predecessors. 9309 for (auto IvarPair : DuplicateIvars) { 9310 ObjCIvarDecl *Ivar = IvarPair.first, *PrevIvar = IvarPair.second; 9311 // Change semantic DeclContext but keep the lexical one. 9312 Ivar->setDeclContextsImpl(PrevIvar->getDeclContext(), 9313 Ivar->getLexicalDeclContext(), 9314 getContext()); 9315 getContext().setPrimaryMergedDecl(Ivar, PrevIvar->getCanonicalDecl()); 9316 } 9317 // Invalidate duplicate extension and the cached ivar list. 9318 ExtensionsPair.first->setInvalidDecl(); 9319 ExtensionsPair.second->getClassInterface() 9320 ->getDefinition() 9321 ->setIvarList(nullptr); 9322 } else { 9323 for (auto IvarPair : DuplicateIvars) { 9324 Diag(IvarPair.first->getLocation(), 9325 diag::err_duplicate_ivar_declaration) 9326 << IvarPair.first->getIdentifier(); 9327 Diag(IvarPair.second->getLocation(), diag::note_previous_definition); 9328 } 9329 } 9330 PendingObjCExtensionIvarRedeclarations.pop_back(); 9331 } 9332 } 9333 9334 // At this point, all update records for loaded decls are in place, so any 9335 // fake class definitions should have become real. 9336 assert(PendingFakeDefinitionData.empty() && 9337 "faked up a class definition but never saw the real one"); 9338 9339 // If we deserialized any C++ or Objective-C class definitions, any 9340 // Objective-C protocol definitions, or any redeclarable templates, make sure 9341 // that all redeclarations point to the definitions. Note that this can only 9342 // happen now, after the redeclaration chains have been fully wired. 9343 for (Decl *D : PendingDefinitions) { 9344 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9345 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9346 // Make sure that the TagType points at the definition. 9347 const_cast<TagType*>(TagT)->decl = TD; 9348 } 9349 9350 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9351 for (auto *R = getMostRecentExistingDecl(RD); R; 9352 R = R->getPreviousDecl()) { 9353 assert((R == D) == 9354 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9355 "declaration thinks it's the definition but it isn't"); 9356 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9357 } 9358 } 9359 9360 continue; 9361 } 9362 9363 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9364 // Make sure that the ObjCInterfaceType points at the definition. 9365 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9366 ->Decl = ID; 9367 9368 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9369 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9370 9371 continue; 9372 } 9373 9374 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9375 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9376 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9377 9378 continue; 9379 } 9380 9381 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9382 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9383 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9384 } 9385 PendingDefinitions.clear(); 9386 9387 // Load the bodies of any functions or methods we've encountered. We do 9388 // this now (delayed) so that we can be sure that the declaration chains 9389 // have been fully wired up (hasBody relies on this). 9390 // FIXME: We shouldn't require complete redeclaration chains here. 9391 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9392 PBEnd = PendingBodies.end(); 9393 PB != PBEnd; ++PB) { 9394 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9395 // For a function defined inline within a class template, force the 9396 // canonical definition to be the one inside the canonical definition of 9397 // the template. This ensures that we instantiate from a correct view 9398 // of the template. 9399 // 9400 // Sadly we can't do this more generally: we can't be sure that all 9401 // copies of an arbitrary class definition will have the same members 9402 // defined (eg, some member functions may not be instantiated, and some 9403 // special members may or may not have been implicitly defined). 9404 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9405 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9406 continue; 9407 9408 // FIXME: Check for =delete/=default? 9409 // FIXME: Complain about ODR violations here? 9410 const FunctionDecl *Defn = nullptr; 9411 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9412 FD->setLazyBody(PB->second); 9413 } else { 9414 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9415 mergeDefinitionVisibility(NonConstDefn, FD); 9416 9417 if (!FD->isLateTemplateParsed() && 9418 !NonConstDefn->isLateTemplateParsed() && 9419 FD->getODRHash() != NonConstDefn->getODRHash()) { 9420 if (!isa<CXXMethodDecl>(FD)) { 9421 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9422 } else if (FD->getLexicalParent()->isFileContext() && 9423 NonConstDefn->getLexicalParent()->isFileContext()) { 9424 // Only diagnose out-of-line method definitions. If they are 9425 // in class definitions, then an error will be generated when 9426 // processing the class bodies. 9427 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9428 } 9429 } 9430 } 9431 continue; 9432 } 9433 9434 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9435 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9436 MD->setLazyBody(PB->second); 9437 } 9438 PendingBodies.clear(); 9439 9440 // Do some cleanup. 9441 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9442 getContext().deduplicateMergedDefinitonsFor(ND); 9443 PendingMergedDefinitionsToDeduplicate.clear(); 9444 } 9445 9446 void ASTReader::diagnoseOdrViolations() { 9447 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9448 PendingFunctionOdrMergeFailures.empty() && 9449 PendingEnumOdrMergeFailures.empty()) 9450 return; 9451 9452 // Trigger the import of the full definition of each class that had any 9453 // odr-merging problems, so we can produce better diagnostics for them. 9454 // These updates may in turn find and diagnose some ODR failures, so take 9455 // ownership of the set first. 9456 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9457 PendingOdrMergeFailures.clear(); 9458 for (auto &Merge : OdrMergeFailures) { 9459 Merge.first->buildLookup(); 9460 Merge.first->decls_begin(); 9461 Merge.first->bases_begin(); 9462 Merge.first->vbases_begin(); 9463 for (auto &RecordPair : Merge.second) { 9464 auto *RD = RecordPair.first; 9465 RD->decls_begin(); 9466 RD->bases_begin(); 9467 RD->vbases_begin(); 9468 } 9469 } 9470 9471 // Trigger the import of functions. 9472 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9473 PendingFunctionOdrMergeFailures.clear(); 9474 for (auto &Merge : FunctionOdrMergeFailures) { 9475 Merge.first->buildLookup(); 9476 Merge.first->decls_begin(); 9477 Merge.first->getBody(); 9478 for (auto &FD : Merge.second) { 9479 FD->buildLookup(); 9480 FD->decls_begin(); 9481 FD->getBody(); 9482 } 9483 } 9484 9485 // Trigger the import of enums. 9486 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9487 PendingEnumOdrMergeFailures.clear(); 9488 for (auto &Merge : EnumOdrMergeFailures) { 9489 Merge.first->decls_begin(); 9490 for (auto &Enum : Merge.second) { 9491 Enum->decls_begin(); 9492 } 9493 } 9494 9495 // For each declaration from a merged context, check that the canonical 9496 // definition of that context also contains a declaration of the same 9497 // entity. 9498 // 9499 // Caution: this loop does things that might invalidate iterators into 9500 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9501 while (!PendingOdrMergeChecks.empty()) { 9502 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9503 9504 // FIXME: Skip over implicit declarations for now. This matters for things 9505 // like implicitly-declared special member functions. This isn't entirely 9506 // correct; we can end up with multiple unmerged declarations of the same 9507 // implicit entity. 9508 if (D->isImplicit()) 9509 continue; 9510 9511 DeclContext *CanonDef = D->getDeclContext(); 9512 9513 bool Found = false; 9514 const Decl *DCanon = D->getCanonicalDecl(); 9515 9516 for (auto RI : D->redecls()) { 9517 if (RI->getLexicalDeclContext() == CanonDef) { 9518 Found = true; 9519 break; 9520 } 9521 } 9522 if (Found) 9523 continue; 9524 9525 // Quick check failed, time to do the slow thing. Note, we can't just 9526 // look up the name of D in CanonDef here, because the member that is 9527 // in CanonDef might not be found by name lookup (it might have been 9528 // replaced by a more recent declaration in the lookup table), and we 9529 // can't necessarily find it in the redeclaration chain because it might 9530 // be merely mergeable, not redeclarable. 9531 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9532 for (auto *CanonMember : CanonDef->decls()) { 9533 if (CanonMember->getCanonicalDecl() == DCanon) { 9534 // This can happen if the declaration is merely mergeable and not 9535 // actually redeclarable (we looked for redeclarations earlier). 9536 // 9537 // FIXME: We should be able to detect this more efficiently, without 9538 // pulling in all of the members of CanonDef. 9539 Found = true; 9540 break; 9541 } 9542 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9543 if (ND->getDeclName() == D->getDeclName()) 9544 Candidates.push_back(ND); 9545 } 9546 9547 if (!Found) { 9548 // The AST doesn't like TagDecls becoming invalid after they've been 9549 // completed. We only really need to mark FieldDecls as invalid here. 9550 if (!isa<TagDecl>(D)) 9551 D->setInvalidDecl(); 9552 9553 // Ensure we don't accidentally recursively enter deserialization while 9554 // we're producing our diagnostic. 9555 Deserializing RecursionGuard(this); 9556 9557 std::string CanonDefModule = 9558 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9559 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9560 << D << getOwningModuleNameForDiagnostic(D) 9561 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9562 9563 if (Candidates.empty()) 9564 Diag(cast<Decl>(CanonDef)->getLocation(), 9565 diag::note_module_odr_violation_no_possible_decls) << D; 9566 else { 9567 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9568 Diag(Candidates[I]->getLocation(), 9569 diag::note_module_odr_violation_possible_decl) 9570 << Candidates[I]; 9571 } 9572 9573 DiagnosedOdrMergeFailures.insert(CanonDef); 9574 } 9575 } 9576 9577 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9578 EnumOdrMergeFailures.empty()) 9579 return; 9580 9581 // Ensure we don't accidentally recursively enter deserialization while 9582 // we're producing our diagnostics. 9583 Deserializing RecursionGuard(this); 9584 9585 // Common code for hashing helpers. 9586 ODRHash Hash; 9587 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9588 Hash.clear(); 9589 Hash.AddQualType(Ty); 9590 return Hash.CalculateHash(); 9591 }; 9592 9593 auto ComputeODRHash = [&Hash](const Stmt *S) { 9594 assert(S); 9595 Hash.clear(); 9596 Hash.AddStmt(S); 9597 return Hash.CalculateHash(); 9598 }; 9599 9600 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9601 assert(D); 9602 Hash.clear(); 9603 Hash.AddSubDecl(D); 9604 return Hash.CalculateHash(); 9605 }; 9606 9607 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9608 Hash.clear(); 9609 Hash.AddTemplateArgument(TA); 9610 return Hash.CalculateHash(); 9611 }; 9612 9613 auto ComputeTemplateParameterListODRHash = 9614 [&Hash](const TemplateParameterList *TPL) { 9615 assert(TPL); 9616 Hash.clear(); 9617 Hash.AddTemplateParameterList(TPL); 9618 return Hash.CalculateHash(); 9619 }; 9620 9621 // Used with err_module_odr_violation_mismatch_decl and 9622 // note_module_odr_violation_mismatch_decl 9623 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed 9624 enum ODRMismatchDecl { 9625 EndOfClass, 9626 PublicSpecifer, 9627 PrivateSpecifer, 9628 ProtectedSpecifer, 9629 StaticAssert, 9630 Field, 9631 CXXMethod, 9632 TypeAlias, 9633 TypeDef, 9634 Var, 9635 Friend, 9636 FunctionTemplate, 9637 Other 9638 }; 9639 9640 // Used with err_module_odr_violation_mismatch_decl_diff and 9641 // note_module_odr_violation_mismatch_decl_diff 9642 enum ODRMismatchDeclDifference { 9643 StaticAssertCondition, 9644 StaticAssertMessage, 9645 StaticAssertOnlyMessage, 9646 FieldName, 9647 FieldTypeName, 9648 FieldSingleBitField, 9649 FieldDifferentWidthBitField, 9650 FieldSingleMutable, 9651 FieldSingleInitializer, 9652 FieldDifferentInitializers, 9653 MethodName, 9654 MethodDeleted, 9655 MethodDefaulted, 9656 MethodVirtual, 9657 MethodStatic, 9658 MethodVolatile, 9659 MethodConst, 9660 MethodInline, 9661 MethodNumberParameters, 9662 MethodParameterType, 9663 MethodParameterName, 9664 MethodParameterSingleDefaultArgument, 9665 MethodParameterDifferentDefaultArgument, 9666 MethodNoTemplateArguments, 9667 MethodDifferentNumberTemplateArguments, 9668 MethodDifferentTemplateArgument, 9669 MethodSingleBody, 9670 MethodDifferentBody, 9671 TypedefName, 9672 TypedefType, 9673 VarName, 9674 VarType, 9675 VarSingleInitializer, 9676 VarDifferentInitializer, 9677 VarConstexpr, 9678 FriendTypeFunction, 9679 FriendType, 9680 FriendFunction, 9681 FunctionTemplateDifferentNumberParameters, 9682 FunctionTemplateParameterDifferentKind, 9683 FunctionTemplateParameterName, 9684 FunctionTemplateParameterSingleDefaultArgument, 9685 FunctionTemplateParameterDifferentDefaultArgument, 9686 FunctionTemplateParameterDifferentType, 9687 FunctionTemplatePackParameter, 9688 }; 9689 9690 // These lambdas have the common portions of the ODR diagnostics. This 9691 // has the same return as Diag(), so addition parameters can be passed 9692 // in with operator<< 9693 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9694 SourceLocation Loc, SourceRange Range, 9695 ODRMismatchDeclDifference DiffType) { 9696 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9697 << FirstRecord << FirstModule.empty() << FirstModule << Range 9698 << DiffType; 9699 }; 9700 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9701 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9702 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9703 << SecondModule << Range << DiffType; 9704 }; 9705 9706 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9707 &ComputeQualTypeODRHash, &ComputeODRHash]( 9708 NamedDecl *FirstRecord, StringRef FirstModule, 9709 StringRef SecondModule, FieldDecl *FirstField, 9710 FieldDecl *SecondField) { 9711 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9712 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9713 if (FirstII->getName() != SecondII->getName()) { 9714 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9715 FirstField->getSourceRange(), FieldName) 9716 << FirstII; 9717 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9718 SecondField->getSourceRange(), FieldName) 9719 << SecondII; 9720 9721 return true; 9722 } 9723 9724 assert(getContext().hasSameType(FirstField->getType(), 9725 SecondField->getType())); 9726 9727 QualType FirstType = FirstField->getType(); 9728 QualType SecondType = SecondField->getType(); 9729 if (ComputeQualTypeODRHash(FirstType) != 9730 ComputeQualTypeODRHash(SecondType)) { 9731 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9732 FirstField->getSourceRange(), FieldTypeName) 9733 << FirstII << FirstType; 9734 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9735 SecondField->getSourceRange(), FieldTypeName) 9736 << SecondII << SecondType; 9737 9738 return true; 9739 } 9740 9741 const bool IsFirstBitField = FirstField->isBitField(); 9742 const bool IsSecondBitField = SecondField->isBitField(); 9743 if (IsFirstBitField != IsSecondBitField) { 9744 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9745 FirstField->getSourceRange(), FieldSingleBitField) 9746 << FirstII << IsFirstBitField; 9747 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9748 SecondField->getSourceRange(), FieldSingleBitField) 9749 << SecondII << IsSecondBitField; 9750 return true; 9751 } 9752 9753 if (IsFirstBitField && IsSecondBitField) { 9754 unsigned FirstBitWidthHash = 9755 ComputeODRHash(FirstField->getBitWidth()); 9756 unsigned SecondBitWidthHash = 9757 ComputeODRHash(SecondField->getBitWidth()); 9758 if (FirstBitWidthHash != SecondBitWidthHash) { 9759 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9760 FirstField->getSourceRange(), 9761 FieldDifferentWidthBitField) 9762 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9763 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9764 SecondField->getSourceRange(), 9765 FieldDifferentWidthBitField) 9766 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9767 return true; 9768 } 9769 } 9770 9771 if (!PP.getLangOpts().CPlusPlus) 9772 return false; 9773 9774 const bool IsFirstMutable = FirstField->isMutable(); 9775 const bool IsSecondMutable = SecondField->isMutable(); 9776 if (IsFirstMutable != IsSecondMutable) { 9777 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9778 FirstField->getSourceRange(), FieldSingleMutable) 9779 << FirstII << IsFirstMutable; 9780 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9781 SecondField->getSourceRange(), FieldSingleMutable) 9782 << SecondII << IsSecondMutable; 9783 return true; 9784 } 9785 9786 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9787 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9788 if ((!FirstInitializer && SecondInitializer) || 9789 (FirstInitializer && !SecondInitializer)) { 9790 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9791 FirstField->getSourceRange(), FieldSingleInitializer) 9792 << FirstII << (FirstInitializer != nullptr); 9793 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9794 SecondField->getSourceRange(), FieldSingleInitializer) 9795 << SecondII << (SecondInitializer != nullptr); 9796 return true; 9797 } 9798 9799 if (FirstInitializer && SecondInitializer) { 9800 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9801 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9802 if (FirstInitHash != SecondInitHash) { 9803 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9804 FirstField->getSourceRange(), 9805 FieldDifferentInitializers) 9806 << FirstII << FirstInitializer->getSourceRange(); 9807 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9808 SecondField->getSourceRange(), 9809 FieldDifferentInitializers) 9810 << SecondII << SecondInitializer->getSourceRange(); 9811 return true; 9812 } 9813 } 9814 9815 return false; 9816 }; 9817 9818 auto ODRDiagTypeDefOrAlias = 9819 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9820 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9821 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9822 bool IsTypeAlias) { 9823 auto FirstName = FirstTD->getDeclName(); 9824 auto SecondName = SecondTD->getDeclName(); 9825 if (FirstName != SecondName) { 9826 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9827 FirstTD->getSourceRange(), TypedefName) 9828 << IsTypeAlias << FirstName; 9829 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9830 SecondTD->getSourceRange(), TypedefName) 9831 << IsTypeAlias << SecondName; 9832 return true; 9833 } 9834 9835 QualType FirstType = FirstTD->getUnderlyingType(); 9836 QualType SecondType = SecondTD->getUnderlyingType(); 9837 if (ComputeQualTypeODRHash(FirstType) != 9838 ComputeQualTypeODRHash(SecondType)) { 9839 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9840 FirstTD->getSourceRange(), TypedefType) 9841 << IsTypeAlias << FirstName << FirstType; 9842 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9843 SecondTD->getSourceRange(), TypedefType) 9844 << IsTypeAlias << SecondName << SecondType; 9845 return true; 9846 } 9847 9848 return false; 9849 }; 9850 9851 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9852 &ComputeQualTypeODRHash, &ComputeODRHash, 9853 this](NamedDecl *FirstRecord, StringRef FirstModule, 9854 StringRef SecondModule, VarDecl *FirstVD, 9855 VarDecl *SecondVD) { 9856 auto FirstName = FirstVD->getDeclName(); 9857 auto SecondName = SecondVD->getDeclName(); 9858 if (FirstName != SecondName) { 9859 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9860 FirstVD->getSourceRange(), VarName) 9861 << FirstName; 9862 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9863 SecondVD->getSourceRange(), VarName) 9864 << SecondName; 9865 return true; 9866 } 9867 9868 QualType FirstType = FirstVD->getType(); 9869 QualType SecondType = SecondVD->getType(); 9870 if (ComputeQualTypeODRHash(FirstType) != 9871 ComputeQualTypeODRHash(SecondType)) { 9872 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9873 FirstVD->getSourceRange(), VarType) 9874 << FirstName << FirstType; 9875 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9876 SecondVD->getSourceRange(), VarType) 9877 << SecondName << SecondType; 9878 return true; 9879 } 9880 9881 if (!PP.getLangOpts().CPlusPlus) 9882 return false; 9883 9884 const Expr *FirstInit = FirstVD->getInit(); 9885 const Expr *SecondInit = SecondVD->getInit(); 9886 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9887 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9888 FirstVD->getSourceRange(), VarSingleInitializer) 9889 << FirstName << (FirstInit == nullptr) 9890 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9891 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9892 SecondVD->getSourceRange(), VarSingleInitializer) 9893 << SecondName << (SecondInit == nullptr) 9894 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9895 return true; 9896 } 9897 9898 if (FirstInit && SecondInit && 9899 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9900 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9901 FirstVD->getSourceRange(), VarDifferentInitializer) 9902 << FirstName << FirstInit->getSourceRange(); 9903 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9904 SecondVD->getSourceRange(), VarDifferentInitializer) 9905 << SecondName << SecondInit->getSourceRange(); 9906 return true; 9907 } 9908 9909 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9910 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9911 if (FirstIsConstexpr != SecondIsConstexpr) { 9912 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9913 FirstVD->getSourceRange(), VarConstexpr) 9914 << FirstName << FirstIsConstexpr; 9915 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9916 SecondVD->getSourceRange(), VarConstexpr) 9917 << SecondName << SecondIsConstexpr; 9918 return true; 9919 } 9920 return false; 9921 }; 9922 9923 auto DifferenceSelector = [](Decl *D) { 9924 assert(D && "valid Decl required"); 9925 switch (D->getKind()) { 9926 default: 9927 return Other; 9928 case Decl::AccessSpec: 9929 switch (D->getAccess()) { 9930 case AS_public: 9931 return PublicSpecifer; 9932 case AS_private: 9933 return PrivateSpecifer; 9934 case AS_protected: 9935 return ProtectedSpecifer; 9936 case AS_none: 9937 break; 9938 } 9939 llvm_unreachable("Invalid access specifier"); 9940 case Decl::StaticAssert: 9941 return StaticAssert; 9942 case Decl::Field: 9943 return Field; 9944 case Decl::CXXMethod: 9945 case Decl::CXXConstructor: 9946 case Decl::CXXDestructor: 9947 return CXXMethod; 9948 case Decl::TypeAlias: 9949 return TypeAlias; 9950 case Decl::Typedef: 9951 return TypeDef; 9952 case Decl::Var: 9953 return Var; 9954 case Decl::Friend: 9955 return Friend; 9956 case Decl::FunctionTemplate: 9957 return FunctionTemplate; 9958 } 9959 }; 9960 9961 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9962 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9963 RecordDecl *Record, 9964 const DeclContext *DC) { 9965 for (auto *D : Record->decls()) { 9966 if (!ODRHash::isDeclToBeProcessed(D, DC)) 9967 continue; 9968 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9969 } 9970 }; 9971 9972 struct DiffResult { 9973 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9974 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9975 }; 9976 9977 // If there is a diagnoseable difference, FirstDiffType and 9978 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9979 // filled in if not EndOfClass. 9980 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9981 DeclHashes &SecondHashes) { 9982 DiffResult DR; 9983 auto FirstIt = FirstHashes.begin(); 9984 auto SecondIt = SecondHashes.begin(); 9985 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9986 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9987 FirstIt->second == SecondIt->second) { 9988 ++FirstIt; 9989 ++SecondIt; 9990 continue; 9991 } 9992 9993 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9994 DR.SecondDecl = 9995 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9996 9997 DR.FirstDiffType = 9998 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9999 DR.SecondDiffType = 10000 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 10001 return DR; 10002 } 10003 return DR; 10004 }; 10005 10006 // Use this to diagnose that an unexpected Decl was encountered 10007 // or no difference was detected. This causes a generic error 10008 // message to be emitted. 10009 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 10010 StringRef FirstModule, 10011 NamedDecl *SecondRecord, 10012 StringRef SecondModule) { 10013 Diag(FirstRecord->getLocation(), 10014 diag::err_module_odr_violation_different_definitions) 10015 << FirstRecord << FirstModule.empty() << FirstModule; 10016 10017 if (DR.FirstDecl) { 10018 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 10019 << FirstRecord << DR.FirstDecl->getSourceRange(); 10020 } 10021 10022 Diag(SecondRecord->getLocation(), 10023 diag::note_module_odr_violation_different_definitions) 10024 << SecondModule; 10025 10026 if (DR.SecondDecl) { 10027 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 10028 << DR.SecondDecl->getSourceRange(); 10029 } 10030 }; 10031 10032 auto DiagnoseODRMismatch = 10033 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 10034 NamedDecl *SecondRecord, StringRef SecondModule) { 10035 SourceLocation FirstLoc; 10036 SourceRange FirstRange; 10037 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 10038 if (DR.FirstDiffType == EndOfClass && FirstTag) { 10039 FirstLoc = FirstTag->getBraceRange().getEnd(); 10040 } else { 10041 FirstLoc = DR.FirstDecl->getLocation(); 10042 FirstRange = DR.FirstDecl->getSourceRange(); 10043 } 10044 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 10045 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 10046 << DR.FirstDiffType; 10047 10048 SourceLocation SecondLoc; 10049 SourceRange SecondRange; 10050 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 10051 if (DR.SecondDiffType == EndOfClass && SecondTag) { 10052 SecondLoc = SecondTag->getBraceRange().getEnd(); 10053 } else { 10054 SecondLoc = DR.SecondDecl->getLocation(); 10055 SecondRange = DR.SecondDecl->getSourceRange(); 10056 } 10057 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 10058 << SecondModule << SecondRange << DR.SecondDiffType; 10059 }; 10060 10061 // Issue any pending ODR-failure diagnostics. 10062 for (auto &Merge : OdrMergeFailures) { 10063 // If we've already pointed out a specific problem with this class, don't 10064 // bother issuing a general "something's different" diagnostic. 10065 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 10066 continue; 10067 10068 bool Diagnosed = false; 10069 CXXRecordDecl *FirstRecord = Merge.first; 10070 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 10071 for (auto &RecordPair : Merge.second) { 10072 CXXRecordDecl *SecondRecord = RecordPair.first; 10073 // Multiple different declarations got merged together; tell the user 10074 // where they came from. 10075 if (FirstRecord == SecondRecord) 10076 continue; 10077 10078 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 10079 10080 auto *FirstDD = FirstRecord->DefinitionData; 10081 auto *SecondDD = RecordPair.second; 10082 10083 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 10084 10085 // Diagnostics from DefinitionData are emitted here. 10086 if (FirstDD != SecondDD) { 10087 enum ODRDefinitionDataDifference { 10088 NumBases, 10089 NumVBases, 10090 BaseType, 10091 BaseVirtual, 10092 BaseAccess, 10093 }; 10094 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 10095 this](SourceLocation Loc, SourceRange Range, 10096 ODRDefinitionDataDifference DiffType) { 10097 return Diag(Loc, diag::err_module_odr_violation_definition_data) 10098 << FirstRecord << FirstModule.empty() << FirstModule << Range 10099 << DiffType; 10100 }; 10101 auto ODRDiagBaseNote = [&SecondModule, 10102 this](SourceLocation Loc, SourceRange Range, 10103 ODRDefinitionDataDifference DiffType) { 10104 return Diag(Loc, diag::note_module_odr_violation_definition_data) 10105 << SecondModule << Range << DiffType; 10106 }; 10107 10108 unsigned FirstNumBases = FirstDD->NumBases; 10109 unsigned FirstNumVBases = FirstDD->NumVBases; 10110 unsigned SecondNumBases = SecondDD->NumBases; 10111 unsigned SecondNumVBases = SecondDD->NumVBases; 10112 10113 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 10114 unsigned NumBases = DD->NumBases; 10115 if (NumBases == 0) return SourceRange(); 10116 auto bases = DD->bases(); 10117 return SourceRange(bases[0].getBeginLoc(), 10118 bases[NumBases - 1].getEndLoc()); 10119 }; 10120 10121 if (FirstNumBases != SecondNumBases) { 10122 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10123 NumBases) 10124 << FirstNumBases; 10125 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10126 NumBases) 10127 << SecondNumBases; 10128 Diagnosed = true; 10129 break; 10130 } 10131 10132 if (FirstNumVBases != SecondNumVBases) { 10133 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10134 NumVBases) 10135 << FirstNumVBases; 10136 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10137 NumVBases) 10138 << SecondNumVBases; 10139 Diagnosed = true; 10140 break; 10141 } 10142 10143 auto FirstBases = FirstDD->bases(); 10144 auto SecondBases = SecondDD->bases(); 10145 unsigned i = 0; 10146 for (i = 0; i < FirstNumBases; ++i) { 10147 auto FirstBase = FirstBases[i]; 10148 auto SecondBase = SecondBases[i]; 10149 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10150 ComputeQualTypeODRHash(SecondBase.getType())) { 10151 ODRDiagBaseError(FirstRecord->getLocation(), 10152 FirstBase.getSourceRange(), BaseType) 10153 << (i + 1) << FirstBase.getType(); 10154 ODRDiagBaseNote(SecondRecord->getLocation(), 10155 SecondBase.getSourceRange(), BaseType) 10156 << (i + 1) << SecondBase.getType(); 10157 break; 10158 } 10159 10160 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10161 ODRDiagBaseError(FirstRecord->getLocation(), 10162 FirstBase.getSourceRange(), BaseVirtual) 10163 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10164 ODRDiagBaseNote(SecondRecord->getLocation(), 10165 SecondBase.getSourceRange(), BaseVirtual) 10166 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10167 break; 10168 } 10169 10170 if (FirstBase.getAccessSpecifierAsWritten() != 10171 SecondBase.getAccessSpecifierAsWritten()) { 10172 ODRDiagBaseError(FirstRecord->getLocation(), 10173 FirstBase.getSourceRange(), BaseAccess) 10174 << (i + 1) << FirstBase.getType() 10175 << (int)FirstBase.getAccessSpecifierAsWritten(); 10176 ODRDiagBaseNote(SecondRecord->getLocation(), 10177 SecondBase.getSourceRange(), BaseAccess) 10178 << (i + 1) << SecondBase.getType() 10179 << (int)SecondBase.getAccessSpecifierAsWritten(); 10180 break; 10181 } 10182 } 10183 10184 if (i != FirstNumBases) { 10185 Diagnosed = true; 10186 break; 10187 } 10188 } 10189 10190 const ClassTemplateDecl *FirstTemplate = 10191 FirstRecord->getDescribedClassTemplate(); 10192 const ClassTemplateDecl *SecondTemplate = 10193 SecondRecord->getDescribedClassTemplate(); 10194 10195 assert(!FirstTemplate == !SecondTemplate && 10196 "Both pointers should be null or non-null"); 10197 10198 if (FirstTemplate && SecondTemplate) { 10199 DeclHashes FirstTemplateHashes; 10200 DeclHashes SecondTemplateHashes; 10201 10202 auto PopulateTemplateParameterHashs = 10203 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10204 const ClassTemplateDecl *TD) { 10205 for (auto *D : TD->getTemplateParameters()->asArray()) { 10206 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10207 } 10208 }; 10209 10210 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10211 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10212 10213 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10214 "Number of template parameters should be equal."); 10215 10216 auto FirstIt = FirstTemplateHashes.begin(); 10217 auto FirstEnd = FirstTemplateHashes.end(); 10218 auto SecondIt = SecondTemplateHashes.begin(); 10219 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10220 if (FirstIt->second == SecondIt->second) 10221 continue; 10222 10223 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10224 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10225 10226 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10227 "Parameter Decl's should be the same kind."); 10228 10229 enum ODRTemplateDifference { 10230 ParamEmptyName, 10231 ParamName, 10232 ParamSingleDefaultArgument, 10233 ParamDifferentDefaultArgument, 10234 }; 10235 10236 auto hasDefaultArg = [](const NamedDecl *D) { 10237 if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(D)) 10238 return TTP->hasDefaultArgument() && 10239 !TTP->defaultArgumentWasInherited(); 10240 if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) 10241 return NTTP->hasDefaultArgument() && 10242 !NTTP->defaultArgumentWasInherited(); 10243 auto *TTP = cast<TemplateTemplateParmDecl>(D); 10244 return TTP->hasDefaultArgument() && 10245 !TTP->defaultArgumentWasInherited(); 10246 }; 10247 bool hasFirstArg = hasDefaultArg(FirstDecl); 10248 bool hasSecondArg = hasDefaultArg(SecondDecl); 10249 10250 ODRTemplateDifference ErrDiffType; 10251 ODRTemplateDifference NoteDiffType; 10252 10253 DeclarationName FirstName = FirstDecl->getDeclName(); 10254 DeclarationName SecondName = SecondDecl->getDeclName(); 10255 10256 if (FirstName != SecondName) { 10257 bool FirstNameEmpty = 10258 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10259 bool SecondNameEmpty = SecondName.isIdentifier() && 10260 !SecondName.getAsIdentifierInfo(); 10261 ErrDiffType = FirstNameEmpty ? ParamEmptyName : ParamName; 10262 NoteDiffType = SecondNameEmpty ? ParamEmptyName : ParamName; 10263 } else if (hasFirstArg == hasSecondArg) 10264 ErrDiffType = NoteDiffType = ParamDifferentDefaultArgument; 10265 else 10266 ErrDiffType = NoteDiffType = ParamSingleDefaultArgument; 10267 10268 Diag(FirstDecl->getLocation(), 10269 diag::err_module_odr_violation_template_parameter) 10270 << FirstRecord << FirstModule.empty() << FirstModule 10271 << FirstDecl->getSourceRange() << ErrDiffType << hasFirstArg 10272 << FirstName; 10273 Diag(SecondDecl->getLocation(), 10274 diag::note_module_odr_violation_template_parameter) 10275 << SecondModule << SecondDecl->getSourceRange() << NoteDiffType 10276 << hasSecondArg << SecondName; 10277 break; 10278 } 10279 10280 if (FirstIt != FirstEnd) { 10281 Diagnosed = true; 10282 break; 10283 } 10284 } 10285 10286 DeclHashes FirstHashes; 10287 DeclHashes SecondHashes; 10288 const DeclContext *DC = FirstRecord; 10289 PopulateHashes(FirstHashes, FirstRecord, DC); 10290 PopulateHashes(SecondHashes, SecondRecord, DC); 10291 10292 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10293 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10294 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10295 Decl *FirstDecl = DR.FirstDecl; 10296 Decl *SecondDecl = DR.SecondDecl; 10297 10298 if (FirstDiffType == Other || SecondDiffType == Other) { 10299 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10300 SecondModule); 10301 Diagnosed = true; 10302 break; 10303 } 10304 10305 if (FirstDiffType != SecondDiffType) { 10306 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10307 SecondModule); 10308 Diagnosed = true; 10309 break; 10310 } 10311 10312 assert(FirstDiffType == SecondDiffType); 10313 10314 switch (FirstDiffType) { 10315 case Other: 10316 case EndOfClass: 10317 case PublicSpecifer: 10318 case PrivateSpecifer: 10319 case ProtectedSpecifer: 10320 llvm_unreachable("Invalid diff type"); 10321 10322 case StaticAssert: { 10323 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10324 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10325 10326 Expr *FirstExpr = FirstSA->getAssertExpr(); 10327 Expr *SecondExpr = SecondSA->getAssertExpr(); 10328 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10329 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10330 if (FirstODRHash != SecondODRHash) { 10331 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10332 FirstExpr->getSourceRange(), StaticAssertCondition); 10333 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10334 SecondExpr->getSourceRange(), StaticAssertCondition); 10335 Diagnosed = true; 10336 break; 10337 } 10338 10339 StringLiteral *FirstStr = FirstSA->getMessage(); 10340 StringLiteral *SecondStr = SecondSA->getMessage(); 10341 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10342 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10343 SourceLocation FirstLoc, SecondLoc; 10344 SourceRange FirstRange, SecondRange; 10345 if (FirstStr) { 10346 FirstLoc = FirstStr->getBeginLoc(); 10347 FirstRange = FirstStr->getSourceRange(); 10348 } else { 10349 FirstLoc = FirstSA->getBeginLoc(); 10350 FirstRange = FirstSA->getSourceRange(); 10351 } 10352 if (SecondStr) { 10353 SecondLoc = SecondStr->getBeginLoc(); 10354 SecondRange = SecondStr->getSourceRange(); 10355 } else { 10356 SecondLoc = SecondSA->getBeginLoc(); 10357 SecondRange = SecondSA->getSourceRange(); 10358 } 10359 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10360 StaticAssertOnlyMessage) 10361 << (FirstStr == nullptr); 10362 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10363 StaticAssertOnlyMessage) 10364 << (SecondStr == nullptr); 10365 Diagnosed = true; 10366 break; 10367 } 10368 10369 if (FirstStr && SecondStr && 10370 FirstStr->getString() != SecondStr->getString()) { 10371 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10372 FirstStr->getSourceRange(), StaticAssertMessage); 10373 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10374 SecondStr->getSourceRange(), StaticAssertMessage); 10375 Diagnosed = true; 10376 break; 10377 } 10378 break; 10379 } 10380 case Field: { 10381 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10382 cast<FieldDecl>(FirstDecl), 10383 cast<FieldDecl>(SecondDecl)); 10384 break; 10385 } 10386 case CXXMethod: { 10387 enum { 10388 DiagMethod, 10389 DiagConstructor, 10390 DiagDestructor, 10391 } FirstMethodType, 10392 SecondMethodType; 10393 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10394 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10395 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10396 return DiagMethod; 10397 }; 10398 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10399 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10400 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10401 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10402 auto FirstName = FirstMethod->getDeclName(); 10403 auto SecondName = SecondMethod->getDeclName(); 10404 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10405 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10406 FirstMethod->getSourceRange(), MethodName) 10407 << FirstMethodType << FirstName; 10408 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10409 SecondMethod->getSourceRange(), MethodName) 10410 << SecondMethodType << SecondName; 10411 10412 Diagnosed = true; 10413 break; 10414 } 10415 10416 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10417 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10418 if (FirstDeleted != SecondDeleted) { 10419 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10420 FirstMethod->getSourceRange(), MethodDeleted) 10421 << FirstMethodType << FirstName << FirstDeleted; 10422 10423 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10424 SecondMethod->getSourceRange(), MethodDeleted) 10425 << SecondMethodType << SecondName << SecondDeleted; 10426 Diagnosed = true; 10427 break; 10428 } 10429 10430 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10431 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10432 if (FirstDefaulted != SecondDefaulted) { 10433 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10434 FirstMethod->getSourceRange(), MethodDefaulted) 10435 << FirstMethodType << FirstName << FirstDefaulted; 10436 10437 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10438 SecondMethod->getSourceRange(), MethodDefaulted) 10439 << SecondMethodType << SecondName << SecondDefaulted; 10440 Diagnosed = true; 10441 break; 10442 } 10443 10444 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10445 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10446 const bool FirstPure = FirstMethod->isPure(); 10447 const bool SecondPure = SecondMethod->isPure(); 10448 if ((FirstVirtual || SecondVirtual) && 10449 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10450 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10451 FirstMethod->getSourceRange(), MethodVirtual) 10452 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10453 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10454 SecondMethod->getSourceRange(), MethodVirtual) 10455 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10456 Diagnosed = true; 10457 break; 10458 } 10459 10460 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10461 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10462 // class needs to be checked instead. 10463 const auto FirstStorage = FirstMethod->getStorageClass(); 10464 const auto SecondStorage = SecondMethod->getStorageClass(); 10465 const bool FirstStatic = FirstStorage == SC_Static; 10466 const bool SecondStatic = SecondStorage == SC_Static; 10467 if (FirstStatic != SecondStatic) { 10468 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10469 FirstMethod->getSourceRange(), MethodStatic) 10470 << FirstMethodType << FirstName << FirstStatic; 10471 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10472 SecondMethod->getSourceRange(), MethodStatic) 10473 << SecondMethodType << SecondName << SecondStatic; 10474 Diagnosed = true; 10475 break; 10476 } 10477 10478 const bool FirstVolatile = FirstMethod->isVolatile(); 10479 const bool SecondVolatile = SecondMethod->isVolatile(); 10480 if (FirstVolatile != SecondVolatile) { 10481 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10482 FirstMethod->getSourceRange(), MethodVolatile) 10483 << FirstMethodType << FirstName << FirstVolatile; 10484 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10485 SecondMethod->getSourceRange(), MethodVolatile) 10486 << SecondMethodType << SecondName << SecondVolatile; 10487 Diagnosed = true; 10488 break; 10489 } 10490 10491 const bool FirstConst = FirstMethod->isConst(); 10492 const bool SecondConst = SecondMethod->isConst(); 10493 if (FirstConst != SecondConst) { 10494 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10495 FirstMethod->getSourceRange(), MethodConst) 10496 << FirstMethodType << FirstName << FirstConst; 10497 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10498 SecondMethod->getSourceRange(), MethodConst) 10499 << SecondMethodType << SecondName << SecondConst; 10500 Diagnosed = true; 10501 break; 10502 } 10503 10504 const bool FirstInline = FirstMethod->isInlineSpecified(); 10505 const bool SecondInline = SecondMethod->isInlineSpecified(); 10506 if (FirstInline != SecondInline) { 10507 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10508 FirstMethod->getSourceRange(), MethodInline) 10509 << FirstMethodType << FirstName << FirstInline; 10510 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10511 SecondMethod->getSourceRange(), MethodInline) 10512 << SecondMethodType << SecondName << SecondInline; 10513 Diagnosed = true; 10514 break; 10515 } 10516 10517 const unsigned FirstNumParameters = FirstMethod->param_size(); 10518 const unsigned SecondNumParameters = SecondMethod->param_size(); 10519 if (FirstNumParameters != SecondNumParameters) { 10520 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10521 FirstMethod->getSourceRange(), 10522 MethodNumberParameters) 10523 << FirstMethodType << FirstName << FirstNumParameters; 10524 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10525 SecondMethod->getSourceRange(), 10526 MethodNumberParameters) 10527 << SecondMethodType << SecondName << SecondNumParameters; 10528 Diagnosed = true; 10529 break; 10530 } 10531 10532 // Need this status boolean to know when break out of the switch. 10533 bool ParameterMismatch = false; 10534 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10535 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10536 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10537 10538 QualType FirstParamType = FirstParam->getType(); 10539 QualType SecondParamType = SecondParam->getType(); 10540 if (FirstParamType != SecondParamType && 10541 ComputeQualTypeODRHash(FirstParamType) != 10542 ComputeQualTypeODRHash(SecondParamType)) { 10543 if (const DecayedType *ParamDecayedType = 10544 FirstParamType->getAs<DecayedType>()) { 10545 ODRDiagDeclError( 10546 FirstRecord, FirstModule, FirstMethod->getLocation(), 10547 FirstMethod->getSourceRange(), MethodParameterType) 10548 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10549 << true << ParamDecayedType->getOriginalType(); 10550 } else { 10551 ODRDiagDeclError( 10552 FirstRecord, FirstModule, FirstMethod->getLocation(), 10553 FirstMethod->getSourceRange(), MethodParameterType) 10554 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10555 << false; 10556 } 10557 10558 if (const DecayedType *ParamDecayedType = 10559 SecondParamType->getAs<DecayedType>()) { 10560 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10561 SecondMethod->getSourceRange(), 10562 MethodParameterType) 10563 << SecondMethodType << SecondName << (I + 1) 10564 << SecondParamType << true 10565 << ParamDecayedType->getOriginalType(); 10566 } else { 10567 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10568 SecondMethod->getSourceRange(), 10569 MethodParameterType) 10570 << SecondMethodType << SecondName << (I + 1) 10571 << SecondParamType << false; 10572 } 10573 ParameterMismatch = true; 10574 break; 10575 } 10576 10577 DeclarationName FirstParamName = FirstParam->getDeclName(); 10578 DeclarationName SecondParamName = SecondParam->getDeclName(); 10579 if (FirstParamName != SecondParamName) { 10580 ODRDiagDeclError(FirstRecord, FirstModule, 10581 FirstMethod->getLocation(), 10582 FirstMethod->getSourceRange(), MethodParameterName) 10583 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10584 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10585 SecondMethod->getSourceRange(), MethodParameterName) 10586 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10587 ParameterMismatch = true; 10588 break; 10589 } 10590 10591 const Expr *FirstInit = FirstParam->getInit(); 10592 const Expr *SecondInit = SecondParam->getInit(); 10593 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10594 ODRDiagDeclError(FirstRecord, FirstModule, 10595 FirstMethod->getLocation(), 10596 FirstMethod->getSourceRange(), 10597 MethodParameterSingleDefaultArgument) 10598 << FirstMethodType << FirstName << (I + 1) 10599 << (FirstInit == nullptr) 10600 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10601 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10602 SecondMethod->getSourceRange(), 10603 MethodParameterSingleDefaultArgument) 10604 << SecondMethodType << SecondName << (I + 1) 10605 << (SecondInit == nullptr) 10606 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10607 ParameterMismatch = true; 10608 break; 10609 } 10610 10611 if (FirstInit && SecondInit && 10612 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10613 ODRDiagDeclError(FirstRecord, FirstModule, 10614 FirstMethod->getLocation(), 10615 FirstMethod->getSourceRange(), 10616 MethodParameterDifferentDefaultArgument) 10617 << FirstMethodType << FirstName << (I + 1) 10618 << FirstInit->getSourceRange(); 10619 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10620 SecondMethod->getSourceRange(), 10621 MethodParameterDifferentDefaultArgument) 10622 << SecondMethodType << SecondName << (I + 1) 10623 << SecondInit->getSourceRange(); 10624 ParameterMismatch = true; 10625 break; 10626 10627 } 10628 } 10629 10630 if (ParameterMismatch) { 10631 Diagnosed = true; 10632 break; 10633 } 10634 10635 const auto *FirstTemplateArgs = 10636 FirstMethod->getTemplateSpecializationArgs(); 10637 const auto *SecondTemplateArgs = 10638 SecondMethod->getTemplateSpecializationArgs(); 10639 10640 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10641 (!FirstTemplateArgs && SecondTemplateArgs)) { 10642 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10643 FirstMethod->getSourceRange(), 10644 MethodNoTemplateArguments) 10645 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10646 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10647 SecondMethod->getSourceRange(), 10648 MethodNoTemplateArguments) 10649 << SecondMethodType << SecondName 10650 << (SecondTemplateArgs != nullptr); 10651 10652 Diagnosed = true; 10653 break; 10654 } 10655 10656 if (FirstTemplateArgs && SecondTemplateArgs) { 10657 // Remove pack expansions from argument list. 10658 auto ExpandTemplateArgumentList = 10659 [](const TemplateArgumentList *TAL) { 10660 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10661 for (const TemplateArgument &TA : TAL->asArray()) { 10662 if (TA.getKind() != TemplateArgument::Pack) { 10663 ExpandedList.push_back(&TA); 10664 continue; 10665 } 10666 llvm::append_range(ExpandedList, llvm::make_pointer_range( 10667 TA.getPackAsArray())); 10668 } 10669 return ExpandedList; 10670 }; 10671 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10672 ExpandTemplateArgumentList(FirstTemplateArgs); 10673 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10674 ExpandTemplateArgumentList(SecondTemplateArgs); 10675 10676 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10677 ODRDiagDeclError(FirstRecord, FirstModule, 10678 FirstMethod->getLocation(), 10679 FirstMethod->getSourceRange(), 10680 MethodDifferentNumberTemplateArguments) 10681 << FirstMethodType << FirstName 10682 << (unsigned)FirstExpandedList.size(); 10683 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10684 SecondMethod->getSourceRange(), 10685 MethodDifferentNumberTemplateArguments) 10686 << SecondMethodType << SecondName 10687 << (unsigned)SecondExpandedList.size(); 10688 10689 Diagnosed = true; 10690 break; 10691 } 10692 10693 bool TemplateArgumentMismatch = false; 10694 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10695 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10696 &SecondTA = *SecondExpandedList[i]; 10697 if (ComputeTemplateArgumentODRHash(FirstTA) == 10698 ComputeTemplateArgumentODRHash(SecondTA)) { 10699 continue; 10700 } 10701 10702 ODRDiagDeclError( 10703 FirstRecord, FirstModule, FirstMethod->getLocation(), 10704 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10705 << FirstMethodType << FirstName << FirstTA << i + 1; 10706 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10707 SecondMethod->getSourceRange(), 10708 MethodDifferentTemplateArgument) 10709 << SecondMethodType << SecondName << SecondTA << i + 1; 10710 10711 TemplateArgumentMismatch = true; 10712 break; 10713 } 10714 10715 if (TemplateArgumentMismatch) { 10716 Diagnosed = true; 10717 break; 10718 } 10719 } 10720 10721 // Compute the hash of the method as if it has no body. 10722 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10723 Hash.clear(); 10724 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10725 return Hash.CalculateHash(); 10726 }; 10727 10728 // Compare the hash generated to the hash stored. A difference means 10729 // that a body was present in the original source. Due to merging, 10730 // the stardard way of detecting a body will not work. 10731 const bool HasFirstBody = 10732 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10733 const bool HasSecondBody = 10734 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10735 10736 if (HasFirstBody != HasSecondBody) { 10737 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10738 FirstMethod->getSourceRange(), MethodSingleBody) 10739 << FirstMethodType << FirstName << HasFirstBody; 10740 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10741 SecondMethod->getSourceRange(), MethodSingleBody) 10742 << SecondMethodType << SecondName << HasSecondBody; 10743 Diagnosed = true; 10744 break; 10745 } 10746 10747 if (HasFirstBody && HasSecondBody) { 10748 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10749 FirstMethod->getSourceRange(), MethodDifferentBody) 10750 << FirstMethodType << FirstName; 10751 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10752 SecondMethod->getSourceRange(), MethodDifferentBody) 10753 << SecondMethodType << SecondName; 10754 Diagnosed = true; 10755 break; 10756 } 10757 10758 break; 10759 } 10760 case TypeAlias: 10761 case TypeDef: { 10762 Diagnosed = ODRDiagTypeDefOrAlias( 10763 FirstRecord, FirstModule, SecondModule, 10764 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10765 FirstDiffType == TypeAlias); 10766 break; 10767 } 10768 case Var: { 10769 Diagnosed = 10770 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10771 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10772 break; 10773 } 10774 case Friend: { 10775 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10776 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10777 10778 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10779 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10780 10781 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10782 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10783 10784 if (FirstND && SecondND) { 10785 ODRDiagDeclError(FirstRecord, FirstModule, 10786 FirstFriend->getFriendLoc(), 10787 FirstFriend->getSourceRange(), FriendFunction) 10788 << FirstND; 10789 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10790 SecondFriend->getSourceRange(), FriendFunction) 10791 << SecondND; 10792 10793 Diagnosed = true; 10794 break; 10795 } 10796 10797 if (FirstTSI && SecondTSI) { 10798 QualType FirstFriendType = FirstTSI->getType(); 10799 QualType SecondFriendType = SecondTSI->getType(); 10800 assert(ComputeQualTypeODRHash(FirstFriendType) != 10801 ComputeQualTypeODRHash(SecondFriendType)); 10802 ODRDiagDeclError(FirstRecord, FirstModule, 10803 FirstFriend->getFriendLoc(), 10804 FirstFriend->getSourceRange(), FriendType) 10805 << FirstFriendType; 10806 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10807 SecondFriend->getSourceRange(), FriendType) 10808 << SecondFriendType; 10809 Diagnosed = true; 10810 break; 10811 } 10812 10813 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10814 FirstFriend->getSourceRange(), FriendTypeFunction) 10815 << (FirstTSI == nullptr); 10816 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10817 SecondFriend->getSourceRange(), FriendTypeFunction) 10818 << (SecondTSI == nullptr); 10819 10820 Diagnosed = true; 10821 break; 10822 } 10823 case FunctionTemplate: { 10824 FunctionTemplateDecl *FirstTemplate = 10825 cast<FunctionTemplateDecl>(FirstDecl); 10826 FunctionTemplateDecl *SecondTemplate = 10827 cast<FunctionTemplateDecl>(SecondDecl); 10828 10829 TemplateParameterList *FirstTPL = 10830 FirstTemplate->getTemplateParameters(); 10831 TemplateParameterList *SecondTPL = 10832 SecondTemplate->getTemplateParameters(); 10833 10834 if (FirstTPL->size() != SecondTPL->size()) { 10835 ODRDiagDeclError(FirstRecord, FirstModule, 10836 FirstTemplate->getLocation(), 10837 FirstTemplate->getSourceRange(), 10838 FunctionTemplateDifferentNumberParameters) 10839 << FirstTemplate << FirstTPL->size(); 10840 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10841 SecondTemplate->getSourceRange(), 10842 FunctionTemplateDifferentNumberParameters) 10843 << SecondTemplate << SecondTPL->size(); 10844 10845 Diagnosed = true; 10846 break; 10847 } 10848 10849 bool ParameterMismatch = false; 10850 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10851 NamedDecl *FirstParam = FirstTPL->getParam(i); 10852 NamedDecl *SecondParam = SecondTPL->getParam(i); 10853 10854 if (FirstParam->getKind() != SecondParam->getKind()) { 10855 enum { 10856 TemplateTypeParameter, 10857 NonTypeTemplateParameter, 10858 TemplateTemplateParameter, 10859 }; 10860 auto GetParamType = [](NamedDecl *D) { 10861 switch (D->getKind()) { 10862 default: 10863 llvm_unreachable("Unexpected template parameter type"); 10864 case Decl::TemplateTypeParm: 10865 return TemplateTypeParameter; 10866 case Decl::NonTypeTemplateParm: 10867 return NonTypeTemplateParameter; 10868 case Decl::TemplateTemplateParm: 10869 return TemplateTemplateParameter; 10870 } 10871 }; 10872 10873 ODRDiagDeclError(FirstRecord, FirstModule, 10874 FirstTemplate->getLocation(), 10875 FirstTemplate->getSourceRange(), 10876 FunctionTemplateParameterDifferentKind) 10877 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10878 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10879 SecondTemplate->getSourceRange(), 10880 FunctionTemplateParameterDifferentKind) 10881 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10882 10883 ParameterMismatch = true; 10884 break; 10885 } 10886 10887 if (FirstParam->getName() != SecondParam->getName()) { 10888 ODRDiagDeclError( 10889 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10890 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10891 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10892 << FirstParam; 10893 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10894 SecondTemplate->getSourceRange(), 10895 FunctionTemplateParameterName) 10896 << SecondTemplate << (i + 1) 10897 << (bool)SecondParam->getIdentifier() << SecondParam; 10898 ParameterMismatch = true; 10899 break; 10900 } 10901 10902 if (isa<TemplateTypeParmDecl>(FirstParam) && 10903 isa<TemplateTypeParmDecl>(SecondParam)) { 10904 TemplateTypeParmDecl *FirstTTPD = 10905 cast<TemplateTypeParmDecl>(FirstParam); 10906 TemplateTypeParmDecl *SecondTTPD = 10907 cast<TemplateTypeParmDecl>(SecondParam); 10908 bool HasFirstDefaultArgument = 10909 FirstTTPD->hasDefaultArgument() && 10910 !FirstTTPD->defaultArgumentWasInherited(); 10911 bool HasSecondDefaultArgument = 10912 SecondTTPD->hasDefaultArgument() && 10913 !SecondTTPD->defaultArgumentWasInherited(); 10914 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10915 ODRDiagDeclError(FirstRecord, FirstModule, 10916 FirstTemplate->getLocation(), 10917 FirstTemplate->getSourceRange(), 10918 FunctionTemplateParameterSingleDefaultArgument) 10919 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10920 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10921 SecondTemplate->getSourceRange(), 10922 FunctionTemplateParameterSingleDefaultArgument) 10923 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10924 ParameterMismatch = true; 10925 break; 10926 } 10927 10928 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10929 QualType FirstType = FirstTTPD->getDefaultArgument(); 10930 QualType SecondType = SecondTTPD->getDefaultArgument(); 10931 if (ComputeQualTypeODRHash(FirstType) != 10932 ComputeQualTypeODRHash(SecondType)) { 10933 ODRDiagDeclError( 10934 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10935 FirstTemplate->getSourceRange(), 10936 FunctionTemplateParameterDifferentDefaultArgument) 10937 << FirstTemplate << (i + 1) << FirstType; 10938 ODRDiagDeclNote( 10939 SecondModule, SecondTemplate->getLocation(), 10940 SecondTemplate->getSourceRange(), 10941 FunctionTemplateParameterDifferentDefaultArgument) 10942 << SecondTemplate << (i + 1) << SecondType; 10943 ParameterMismatch = true; 10944 break; 10945 } 10946 } 10947 10948 if (FirstTTPD->isParameterPack() != 10949 SecondTTPD->isParameterPack()) { 10950 ODRDiagDeclError(FirstRecord, FirstModule, 10951 FirstTemplate->getLocation(), 10952 FirstTemplate->getSourceRange(), 10953 FunctionTemplatePackParameter) 10954 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 10955 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10956 SecondTemplate->getSourceRange(), 10957 FunctionTemplatePackParameter) 10958 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 10959 ParameterMismatch = true; 10960 break; 10961 } 10962 } 10963 10964 if (isa<TemplateTemplateParmDecl>(FirstParam) && 10965 isa<TemplateTemplateParmDecl>(SecondParam)) { 10966 TemplateTemplateParmDecl *FirstTTPD = 10967 cast<TemplateTemplateParmDecl>(FirstParam); 10968 TemplateTemplateParmDecl *SecondTTPD = 10969 cast<TemplateTemplateParmDecl>(SecondParam); 10970 10971 TemplateParameterList *FirstTPL = 10972 FirstTTPD->getTemplateParameters(); 10973 TemplateParameterList *SecondTPL = 10974 SecondTTPD->getTemplateParameters(); 10975 10976 if (ComputeTemplateParameterListODRHash(FirstTPL) != 10977 ComputeTemplateParameterListODRHash(SecondTPL)) { 10978 ODRDiagDeclError(FirstRecord, FirstModule, 10979 FirstTemplate->getLocation(), 10980 FirstTemplate->getSourceRange(), 10981 FunctionTemplateParameterDifferentType) 10982 << FirstTemplate << (i + 1); 10983 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10984 SecondTemplate->getSourceRange(), 10985 FunctionTemplateParameterDifferentType) 10986 << SecondTemplate << (i + 1); 10987 ParameterMismatch = true; 10988 break; 10989 } 10990 10991 bool HasFirstDefaultArgument = 10992 FirstTTPD->hasDefaultArgument() && 10993 !FirstTTPD->defaultArgumentWasInherited(); 10994 bool HasSecondDefaultArgument = 10995 SecondTTPD->hasDefaultArgument() && 10996 !SecondTTPD->defaultArgumentWasInherited(); 10997 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10998 ODRDiagDeclError(FirstRecord, FirstModule, 10999 FirstTemplate->getLocation(), 11000 FirstTemplate->getSourceRange(), 11001 FunctionTemplateParameterSingleDefaultArgument) 11002 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11003 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11004 SecondTemplate->getSourceRange(), 11005 FunctionTemplateParameterSingleDefaultArgument) 11006 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11007 ParameterMismatch = true; 11008 break; 11009 } 11010 11011 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11012 TemplateArgument FirstTA = 11013 FirstTTPD->getDefaultArgument().getArgument(); 11014 TemplateArgument SecondTA = 11015 SecondTTPD->getDefaultArgument().getArgument(); 11016 if (ComputeTemplateArgumentODRHash(FirstTA) != 11017 ComputeTemplateArgumentODRHash(SecondTA)) { 11018 ODRDiagDeclError( 11019 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11020 FirstTemplate->getSourceRange(), 11021 FunctionTemplateParameterDifferentDefaultArgument) 11022 << FirstTemplate << (i + 1) << FirstTA; 11023 ODRDiagDeclNote( 11024 SecondModule, SecondTemplate->getLocation(), 11025 SecondTemplate->getSourceRange(), 11026 FunctionTemplateParameterDifferentDefaultArgument) 11027 << SecondTemplate << (i + 1) << SecondTA; 11028 ParameterMismatch = true; 11029 break; 11030 } 11031 } 11032 11033 if (FirstTTPD->isParameterPack() != 11034 SecondTTPD->isParameterPack()) { 11035 ODRDiagDeclError(FirstRecord, FirstModule, 11036 FirstTemplate->getLocation(), 11037 FirstTemplate->getSourceRange(), 11038 FunctionTemplatePackParameter) 11039 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11040 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11041 SecondTemplate->getSourceRange(), 11042 FunctionTemplatePackParameter) 11043 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11044 ParameterMismatch = true; 11045 break; 11046 } 11047 } 11048 11049 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11050 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11051 NonTypeTemplateParmDecl *FirstNTTPD = 11052 cast<NonTypeTemplateParmDecl>(FirstParam); 11053 NonTypeTemplateParmDecl *SecondNTTPD = 11054 cast<NonTypeTemplateParmDecl>(SecondParam); 11055 11056 QualType FirstType = FirstNTTPD->getType(); 11057 QualType SecondType = SecondNTTPD->getType(); 11058 if (ComputeQualTypeODRHash(FirstType) != 11059 ComputeQualTypeODRHash(SecondType)) { 11060 ODRDiagDeclError(FirstRecord, FirstModule, 11061 FirstTemplate->getLocation(), 11062 FirstTemplate->getSourceRange(), 11063 FunctionTemplateParameterDifferentType) 11064 << FirstTemplate << (i + 1); 11065 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11066 SecondTemplate->getSourceRange(), 11067 FunctionTemplateParameterDifferentType) 11068 << SecondTemplate << (i + 1); 11069 ParameterMismatch = true; 11070 break; 11071 } 11072 11073 bool HasFirstDefaultArgument = 11074 FirstNTTPD->hasDefaultArgument() && 11075 !FirstNTTPD->defaultArgumentWasInherited(); 11076 bool HasSecondDefaultArgument = 11077 SecondNTTPD->hasDefaultArgument() && 11078 !SecondNTTPD->defaultArgumentWasInherited(); 11079 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11080 ODRDiagDeclError(FirstRecord, FirstModule, 11081 FirstTemplate->getLocation(), 11082 FirstTemplate->getSourceRange(), 11083 FunctionTemplateParameterSingleDefaultArgument) 11084 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11085 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11086 SecondTemplate->getSourceRange(), 11087 FunctionTemplateParameterSingleDefaultArgument) 11088 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11089 ParameterMismatch = true; 11090 break; 11091 } 11092 11093 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11094 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11095 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11096 if (ComputeODRHash(FirstDefaultArgument) != 11097 ComputeODRHash(SecondDefaultArgument)) { 11098 ODRDiagDeclError( 11099 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11100 FirstTemplate->getSourceRange(), 11101 FunctionTemplateParameterDifferentDefaultArgument) 11102 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11103 ODRDiagDeclNote( 11104 SecondModule, SecondTemplate->getLocation(), 11105 SecondTemplate->getSourceRange(), 11106 FunctionTemplateParameterDifferentDefaultArgument) 11107 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11108 ParameterMismatch = true; 11109 break; 11110 } 11111 } 11112 11113 if (FirstNTTPD->isParameterPack() != 11114 SecondNTTPD->isParameterPack()) { 11115 ODRDiagDeclError(FirstRecord, FirstModule, 11116 FirstTemplate->getLocation(), 11117 FirstTemplate->getSourceRange(), 11118 FunctionTemplatePackParameter) 11119 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11120 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11121 SecondTemplate->getSourceRange(), 11122 FunctionTemplatePackParameter) 11123 << SecondTemplate << (i + 1) 11124 << SecondNTTPD->isParameterPack(); 11125 ParameterMismatch = true; 11126 break; 11127 } 11128 } 11129 } 11130 11131 if (ParameterMismatch) { 11132 Diagnosed = true; 11133 break; 11134 } 11135 11136 break; 11137 } 11138 } 11139 11140 if (Diagnosed) 11141 continue; 11142 11143 Diag(FirstDecl->getLocation(), 11144 diag::err_module_odr_violation_mismatch_decl_unknown) 11145 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11146 << FirstDecl->getSourceRange(); 11147 Diag(SecondDecl->getLocation(), 11148 diag::note_module_odr_violation_mismatch_decl_unknown) 11149 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11150 Diagnosed = true; 11151 } 11152 11153 if (!Diagnosed) { 11154 // All definitions are updates to the same declaration. This happens if a 11155 // module instantiates the declaration of a class template specialization 11156 // and two or more other modules instantiate its definition. 11157 // 11158 // FIXME: Indicate which modules had instantiations of this definition. 11159 // FIXME: How can this even happen? 11160 Diag(Merge.first->getLocation(), 11161 diag::err_module_odr_violation_different_instantiations) 11162 << Merge.first; 11163 } 11164 } 11165 11166 // Issue ODR failures diagnostics for functions. 11167 for (auto &Merge : FunctionOdrMergeFailures) { 11168 enum ODRFunctionDifference { 11169 ReturnType, 11170 ParameterName, 11171 ParameterType, 11172 ParameterSingleDefaultArgument, 11173 ParameterDifferentDefaultArgument, 11174 FunctionBody, 11175 }; 11176 11177 FunctionDecl *FirstFunction = Merge.first; 11178 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11179 11180 bool Diagnosed = false; 11181 for (auto &SecondFunction : Merge.second) { 11182 11183 if (FirstFunction == SecondFunction) 11184 continue; 11185 11186 std::string SecondModule = 11187 getOwningModuleNameForDiagnostic(SecondFunction); 11188 11189 auto ODRDiagError = [FirstFunction, &FirstModule, 11190 this](SourceLocation Loc, SourceRange Range, 11191 ODRFunctionDifference DiffType) { 11192 return Diag(Loc, diag::err_module_odr_violation_function) 11193 << FirstFunction << FirstModule.empty() << FirstModule << Range 11194 << DiffType; 11195 }; 11196 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11197 SourceRange Range, 11198 ODRFunctionDifference DiffType) { 11199 return Diag(Loc, diag::note_module_odr_violation_function) 11200 << SecondModule << Range << DiffType; 11201 }; 11202 11203 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11204 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11205 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11206 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11207 << FirstFunction->getReturnType(); 11208 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11209 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11210 << SecondFunction->getReturnType(); 11211 Diagnosed = true; 11212 break; 11213 } 11214 11215 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11216 "Merged functions with different number of parameters"); 11217 11218 auto ParamSize = FirstFunction->param_size(); 11219 bool ParameterMismatch = false; 11220 for (unsigned I = 0; I < ParamSize; ++I) { 11221 auto *FirstParam = FirstFunction->getParamDecl(I); 11222 auto *SecondParam = SecondFunction->getParamDecl(I); 11223 11224 assert(getContext().hasSameType(FirstParam->getType(), 11225 SecondParam->getType()) && 11226 "Merged function has different parameter types."); 11227 11228 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11229 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11230 ParameterName) 11231 << I + 1 << FirstParam->getDeclName(); 11232 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11233 ParameterName) 11234 << I + 1 << SecondParam->getDeclName(); 11235 ParameterMismatch = true; 11236 break; 11237 }; 11238 11239 QualType FirstParamType = FirstParam->getType(); 11240 QualType SecondParamType = SecondParam->getType(); 11241 if (FirstParamType != SecondParamType && 11242 ComputeQualTypeODRHash(FirstParamType) != 11243 ComputeQualTypeODRHash(SecondParamType)) { 11244 if (const DecayedType *ParamDecayedType = 11245 FirstParamType->getAs<DecayedType>()) { 11246 ODRDiagError(FirstParam->getLocation(), 11247 FirstParam->getSourceRange(), ParameterType) 11248 << (I + 1) << FirstParamType << true 11249 << ParamDecayedType->getOriginalType(); 11250 } else { 11251 ODRDiagError(FirstParam->getLocation(), 11252 FirstParam->getSourceRange(), ParameterType) 11253 << (I + 1) << FirstParamType << false; 11254 } 11255 11256 if (const DecayedType *ParamDecayedType = 11257 SecondParamType->getAs<DecayedType>()) { 11258 ODRDiagNote(SecondParam->getLocation(), 11259 SecondParam->getSourceRange(), ParameterType) 11260 << (I + 1) << SecondParamType << true 11261 << ParamDecayedType->getOriginalType(); 11262 } else { 11263 ODRDiagNote(SecondParam->getLocation(), 11264 SecondParam->getSourceRange(), ParameterType) 11265 << (I + 1) << SecondParamType << false; 11266 } 11267 ParameterMismatch = true; 11268 break; 11269 } 11270 11271 const Expr *FirstInit = FirstParam->getInit(); 11272 const Expr *SecondInit = SecondParam->getInit(); 11273 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11274 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11275 ParameterSingleDefaultArgument) 11276 << (I + 1) << (FirstInit == nullptr) 11277 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11278 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11279 ParameterSingleDefaultArgument) 11280 << (I + 1) << (SecondInit == nullptr) 11281 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11282 ParameterMismatch = true; 11283 break; 11284 } 11285 11286 if (FirstInit && SecondInit && 11287 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11288 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11289 ParameterDifferentDefaultArgument) 11290 << (I + 1) << FirstInit->getSourceRange(); 11291 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11292 ParameterDifferentDefaultArgument) 11293 << (I + 1) << SecondInit->getSourceRange(); 11294 ParameterMismatch = true; 11295 break; 11296 } 11297 11298 assert(ComputeSubDeclODRHash(FirstParam) == 11299 ComputeSubDeclODRHash(SecondParam) && 11300 "Undiagnosed parameter difference."); 11301 } 11302 11303 if (ParameterMismatch) { 11304 Diagnosed = true; 11305 break; 11306 } 11307 11308 // If no error has been generated before now, assume the problem is in 11309 // the body and generate a message. 11310 ODRDiagError(FirstFunction->getLocation(), 11311 FirstFunction->getSourceRange(), FunctionBody); 11312 ODRDiagNote(SecondFunction->getLocation(), 11313 SecondFunction->getSourceRange(), FunctionBody); 11314 Diagnosed = true; 11315 break; 11316 } 11317 (void)Diagnosed; 11318 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11319 } 11320 11321 // Issue ODR failures diagnostics for enums. 11322 for (auto &Merge : EnumOdrMergeFailures) { 11323 enum ODREnumDifference { 11324 SingleScopedEnum, 11325 EnumTagKeywordMismatch, 11326 SingleSpecifiedType, 11327 DifferentSpecifiedTypes, 11328 DifferentNumberEnumConstants, 11329 EnumConstantName, 11330 EnumConstantSingleInitilizer, 11331 EnumConstantDifferentInitilizer, 11332 }; 11333 11334 // If we've already pointed out a specific problem with this enum, don't 11335 // bother issuing a general "something's different" diagnostic. 11336 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11337 continue; 11338 11339 EnumDecl *FirstEnum = Merge.first; 11340 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11341 11342 using DeclHashes = 11343 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11344 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11345 DeclHashes &Hashes, EnumDecl *Enum) { 11346 for (auto *D : Enum->decls()) { 11347 // Due to decl merging, the first EnumDecl is the parent of 11348 // Decls in both records. 11349 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum)) 11350 continue; 11351 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11352 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11353 ComputeSubDeclODRHash(D)); 11354 } 11355 }; 11356 DeclHashes FirstHashes; 11357 PopulateHashes(FirstHashes, FirstEnum); 11358 bool Diagnosed = false; 11359 for (auto &SecondEnum : Merge.second) { 11360 11361 if (FirstEnum == SecondEnum) 11362 continue; 11363 11364 std::string SecondModule = 11365 getOwningModuleNameForDiagnostic(SecondEnum); 11366 11367 auto ODRDiagError = [FirstEnum, &FirstModule, 11368 this](SourceLocation Loc, SourceRange Range, 11369 ODREnumDifference DiffType) { 11370 return Diag(Loc, diag::err_module_odr_violation_enum) 11371 << FirstEnum << FirstModule.empty() << FirstModule << Range 11372 << DiffType; 11373 }; 11374 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11375 SourceRange Range, 11376 ODREnumDifference DiffType) { 11377 return Diag(Loc, diag::note_module_odr_violation_enum) 11378 << SecondModule << Range << DiffType; 11379 }; 11380 11381 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11382 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11383 SingleScopedEnum) 11384 << FirstEnum->isScoped(); 11385 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11386 SingleScopedEnum) 11387 << SecondEnum->isScoped(); 11388 Diagnosed = true; 11389 continue; 11390 } 11391 11392 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11393 if (FirstEnum->isScopedUsingClassTag() != 11394 SecondEnum->isScopedUsingClassTag()) { 11395 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11396 EnumTagKeywordMismatch) 11397 << FirstEnum->isScopedUsingClassTag(); 11398 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11399 EnumTagKeywordMismatch) 11400 << SecondEnum->isScopedUsingClassTag(); 11401 Diagnosed = true; 11402 continue; 11403 } 11404 } 11405 11406 QualType FirstUnderlyingType = 11407 FirstEnum->getIntegerTypeSourceInfo() 11408 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11409 : QualType(); 11410 QualType SecondUnderlyingType = 11411 SecondEnum->getIntegerTypeSourceInfo() 11412 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11413 : QualType(); 11414 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11415 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11416 SingleSpecifiedType) 11417 << !FirstUnderlyingType.isNull(); 11418 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11419 SingleSpecifiedType) 11420 << !SecondUnderlyingType.isNull(); 11421 Diagnosed = true; 11422 continue; 11423 } 11424 11425 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11426 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11427 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11428 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11429 DifferentSpecifiedTypes) 11430 << FirstUnderlyingType; 11431 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11432 DifferentSpecifiedTypes) 11433 << SecondUnderlyingType; 11434 Diagnosed = true; 11435 continue; 11436 } 11437 } 11438 11439 DeclHashes SecondHashes; 11440 PopulateHashes(SecondHashes, SecondEnum); 11441 11442 if (FirstHashes.size() != SecondHashes.size()) { 11443 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11444 DifferentNumberEnumConstants) 11445 << (int)FirstHashes.size(); 11446 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11447 DifferentNumberEnumConstants) 11448 << (int)SecondHashes.size(); 11449 Diagnosed = true; 11450 continue; 11451 } 11452 11453 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11454 if (FirstHashes[I].second == SecondHashes[I].second) 11455 continue; 11456 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11457 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11458 11459 if (FirstEnumConstant->getDeclName() != 11460 SecondEnumConstant->getDeclName()) { 11461 11462 ODRDiagError(FirstEnumConstant->getLocation(), 11463 FirstEnumConstant->getSourceRange(), EnumConstantName) 11464 << I + 1 << FirstEnumConstant; 11465 ODRDiagNote(SecondEnumConstant->getLocation(), 11466 SecondEnumConstant->getSourceRange(), EnumConstantName) 11467 << I + 1 << SecondEnumConstant; 11468 Diagnosed = true; 11469 break; 11470 } 11471 11472 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11473 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11474 if (!FirstInit && !SecondInit) 11475 continue; 11476 11477 if (!FirstInit || !SecondInit) { 11478 ODRDiagError(FirstEnumConstant->getLocation(), 11479 FirstEnumConstant->getSourceRange(), 11480 EnumConstantSingleInitilizer) 11481 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11482 ODRDiagNote(SecondEnumConstant->getLocation(), 11483 SecondEnumConstant->getSourceRange(), 11484 EnumConstantSingleInitilizer) 11485 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11486 Diagnosed = true; 11487 break; 11488 } 11489 11490 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11491 ODRDiagError(FirstEnumConstant->getLocation(), 11492 FirstEnumConstant->getSourceRange(), 11493 EnumConstantDifferentInitilizer) 11494 << I + 1 << FirstEnumConstant; 11495 ODRDiagNote(SecondEnumConstant->getLocation(), 11496 SecondEnumConstant->getSourceRange(), 11497 EnumConstantDifferentInitilizer) 11498 << I + 1 << SecondEnumConstant; 11499 Diagnosed = true; 11500 break; 11501 } 11502 } 11503 } 11504 11505 (void)Diagnosed; 11506 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11507 } 11508 } 11509 11510 void ASTReader::StartedDeserializing() { 11511 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11512 ReadTimer->startTimer(); 11513 } 11514 11515 void ASTReader::FinishedDeserializing() { 11516 assert(NumCurrentElementsDeserializing && 11517 "FinishedDeserializing not paired with StartedDeserializing"); 11518 if (NumCurrentElementsDeserializing == 1) { 11519 // We decrease NumCurrentElementsDeserializing only after pending actions 11520 // are finished, to avoid recursively re-calling finishPendingActions(). 11521 finishPendingActions(); 11522 } 11523 --NumCurrentElementsDeserializing; 11524 11525 if (NumCurrentElementsDeserializing == 0) { 11526 // Propagate exception specification and deduced type updates along 11527 // redeclaration chains. 11528 // 11529 // We do this now rather than in finishPendingActions because we want to 11530 // be able to walk the complete redeclaration chains of the updated decls. 11531 while (!PendingExceptionSpecUpdates.empty() || 11532 !PendingDeducedTypeUpdates.empty()) { 11533 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11534 PendingExceptionSpecUpdates.clear(); 11535 for (auto Update : ESUpdates) { 11536 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11537 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11538 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11539 if (auto *Listener = getContext().getASTMutationListener()) 11540 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11541 for (auto *Redecl : Update.second->redecls()) 11542 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11543 } 11544 11545 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11546 PendingDeducedTypeUpdates.clear(); 11547 for (auto Update : DTUpdates) { 11548 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11549 // FIXME: If the return type is already deduced, check that it matches. 11550 getContext().adjustDeducedFunctionResultType(Update.first, 11551 Update.second); 11552 } 11553 } 11554 11555 if (ReadTimer) 11556 ReadTimer->stopTimer(); 11557 11558 diagnoseOdrViolations(); 11559 11560 // We are not in recursive loading, so it's safe to pass the "interesting" 11561 // decls to the consumer. 11562 if (Consumer) 11563 PassInterestingDeclsToConsumer(); 11564 } 11565 } 11566 11567 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11568 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11569 // Remove any fake results before adding any real ones. 11570 auto It = PendingFakeLookupResults.find(II); 11571 if (It != PendingFakeLookupResults.end()) { 11572 for (auto *ND : It->second) 11573 SemaObj->IdResolver.RemoveDecl(ND); 11574 // FIXME: this works around module+PCH performance issue. 11575 // Rather than erase the result from the map, which is O(n), just clear 11576 // the vector of NamedDecls. 11577 It->second.clear(); 11578 } 11579 } 11580 11581 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11582 SemaObj->TUScope->AddDecl(D); 11583 } else if (SemaObj->TUScope) { 11584 // Adding the decl to IdResolver may have failed because it was already in 11585 // (even though it was not added in scope). If it is already in, make sure 11586 // it gets in the scope as well. 11587 if (std::find(SemaObj->IdResolver.begin(Name), 11588 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11589 SemaObj->TUScope->AddDecl(D); 11590 } 11591 } 11592 11593 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11594 ASTContext *Context, 11595 const PCHContainerReader &PCHContainerRdr, 11596 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11597 StringRef isysroot, 11598 DisableValidationForModuleKind DisableValidationKind, 11599 bool AllowASTWithCompilerErrors, 11600 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11601 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11602 std::unique_ptr<llvm::Timer> ReadTimer) 11603 : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH) 11604 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11605 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11606 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11607 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11608 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11609 PCHContainerRdr, PP.getHeaderSearchInfo()), 11610 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11611 DisableValidationKind(DisableValidationKind), 11612 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11613 AllowConfigurationMismatch(AllowConfigurationMismatch), 11614 ValidateSystemInputs(ValidateSystemInputs), 11615 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11616 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11617 SourceMgr.setExternalSLocEntrySource(this); 11618 11619 for (const auto &Ext : Extensions) { 11620 auto BlockName = Ext->getExtensionMetadata().BlockName; 11621 auto Known = ModuleFileExtensions.find(BlockName); 11622 if (Known != ModuleFileExtensions.end()) { 11623 Diags.Report(diag::warn_duplicate_module_file_extension) 11624 << BlockName; 11625 continue; 11626 } 11627 11628 ModuleFileExtensions.insert({BlockName, Ext}); 11629 } 11630 } 11631 11632 ASTReader::~ASTReader() { 11633 if (OwnsDeserializationListener) 11634 delete DeserializationListener; 11635 } 11636 11637 IdentifierResolver &ASTReader::getIdResolver() { 11638 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11639 } 11640 11641 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11642 unsigned AbbrevID) { 11643 Idx = 0; 11644 Record.clear(); 11645 return Cursor.readRecord(AbbrevID, Record); 11646 } 11647 //===----------------------------------------------------------------------===// 11648 //// OMPClauseReader implementation 11649 ////===----------------------------------------------------------------------===// 11650 11651 // This has to be in namespace clang because it's friended by all 11652 // of the OMP clauses. 11653 namespace clang { 11654 11655 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11656 ASTRecordReader &Record; 11657 ASTContext &Context; 11658 11659 public: 11660 OMPClauseReader(ASTRecordReader &Record) 11661 : Record(Record), Context(Record.getContext()) {} 11662 #define GEN_CLANG_CLAUSE_CLASS 11663 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11664 #include "llvm/Frontend/OpenMP/OMP.inc" 11665 OMPClause *readClause(); 11666 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11667 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11668 }; 11669 11670 } // end namespace clang 11671 11672 OMPClause *ASTRecordReader::readOMPClause() { 11673 return OMPClauseReader(*this).readClause(); 11674 } 11675 11676 OMPClause *OMPClauseReader::readClause() { 11677 OMPClause *C = nullptr; 11678 switch (llvm::omp::Clause(Record.readInt())) { 11679 case llvm::omp::OMPC_if: 11680 C = new (Context) OMPIfClause(); 11681 break; 11682 case llvm::omp::OMPC_final: 11683 C = new (Context) OMPFinalClause(); 11684 break; 11685 case llvm::omp::OMPC_num_threads: 11686 C = new (Context) OMPNumThreadsClause(); 11687 break; 11688 case llvm::omp::OMPC_safelen: 11689 C = new (Context) OMPSafelenClause(); 11690 break; 11691 case llvm::omp::OMPC_simdlen: 11692 C = new (Context) OMPSimdlenClause(); 11693 break; 11694 case llvm::omp::OMPC_sizes: { 11695 unsigned NumSizes = Record.readInt(); 11696 C = OMPSizesClause::CreateEmpty(Context, NumSizes); 11697 break; 11698 } 11699 case llvm::omp::OMPC_full: 11700 C = OMPFullClause::CreateEmpty(Context); 11701 break; 11702 case llvm::omp::OMPC_partial: 11703 C = OMPPartialClause::CreateEmpty(Context); 11704 break; 11705 case llvm::omp::OMPC_allocator: 11706 C = new (Context) OMPAllocatorClause(); 11707 break; 11708 case llvm::omp::OMPC_collapse: 11709 C = new (Context) OMPCollapseClause(); 11710 break; 11711 case llvm::omp::OMPC_default: 11712 C = new (Context) OMPDefaultClause(); 11713 break; 11714 case llvm::omp::OMPC_proc_bind: 11715 C = new (Context) OMPProcBindClause(); 11716 break; 11717 case llvm::omp::OMPC_schedule: 11718 C = new (Context) OMPScheduleClause(); 11719 break; 11720 case llvm::omp::OMPC_ordered: 11721 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11722 break; 11723 case llvm::omp::OMPC_nowait: 11724 C = new (Context) OMPNowaitClause(); 11725 break; 11726 case llvm::omp::OMPC_untied: 11727 C = new (Context) OMPUntiedClause(); 11728 break; 11729 case llvm::omp::OMPC_mergeable: 11730 C = new (Context) OMPMergeableClause(); 11731 break; 11732 case llvm::omp::OMPC_read: 11733 C = new (Context) OMPReadClause(); 11734 break; 11735 case llvm::omp::OMPC_write: 11736 C = new (Context) OMPWriteClause(); 11737 break; 11738 case llvm::omp::OMPC_update: 11739 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11740 break; 11741 case llvm::omp::OMPC_capture: 11742 C = new (Context) OMPCaptureClause(); 11743 break; 11744 case llvm::omp::OMPC_compare: 11745 C = new (Context) OMPCompareClause(); 11746 break; 11747 case llvm::omp::OMPC_seq_cst: 11748 C = new (Context) OMPSeqCstClause(); 11749 break; 11750 case llvm::omp::OMPC_acq_rel: 11751 C = new (Context) OMPAcqRelClause(); 11752 break; 11753 case llvm::omp::OMPC_acquire: 11754 C = new (Context) OMPAcquireClause(); 11755 break; 11756 case llvm::omp::OMPC_release: 11757 C = new (Context) OMPReleaseClause(); 11758 break; 11759 case llvm::omp::OMPC_relaxed: 11760 C = new (Context) OMPRelaxedClause(); 11761 break; 11762 case llvm::omp::OMPC_threads: 11763 C = new (Context) OMPThreadsClause(); 11764 break; 11765 case llvm::omp::OMPC_simd: 11766 C = new (Context) OMPSIMDClause(); 11767 break; 11768 case llvm::omp::OMPC_nogroup: 11769 C = new (Context) OMPNogroupClause(); 11770 break; 11771 case llvm::omp::OMPC_unified_address: 11772 C = new (Context) OMPUnifiedAddressClause(); 11773 break; 11774 case llvm::omp::OMPC_unified_shared_memory: 11775 C = new (Context) OMPUnifiedSharedMemoryClause(); 11776 break; 11777 case llvm::omp::OMPC_reverse_offload: 11778 C = new (Context) OMPReverseOffloadClause(); 11779 break; 11780 case llvm::omp::OMPC_dynamic_allocators: 11781 C = new (Context) OMPDynamicAllocatorsClause(); 11782 break; 11783 case llvm::omp::OMPC_atomic_default_mem_order: 11784 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11785 break; 11786 case llvm::omp::OMPC_private: 11787 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11788 break; 11789 case llvm::omp::OMPC_firstprivate: 11790 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11791 break; 11792 case llvm::omp::OMPC_lastprivate: 11793 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11794 break; 11795 case llvm::omp::OMPC_shared: 11796 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11797 break; 11798 case llvm::omp::OMPC_reduction: { 11799 unsigned N = Record.readInt(); 11800 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11801 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11802 break; 11803 } 11804 case llvm::omp::OMPC_task_reduction: 11805 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11806 break; 11807 case llvm::omp::OMPC_in_reduction: 11808 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11809 break; 11810 case llvm::omp::OMPC_linear: 11811 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11812 break; 11813 case llvm::omp::OMPC_aligned: 11814 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11815 break; 11816 case llvm::omp::OMPC_copyin: 11817 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11818 break; 11819 case llvm::omp::OMPC_copyprivate: 11820 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11821 break; 11822 case llvm::omp::OMPC_flush: 11823 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11824 break; 11825 case llvm::omp::OMPC_depobj: 11826 C = OMPDepobjClause::CreateEmpty(Context); 11827 break; 11828 case llvm::omp::OMPC_depend: { 11829 unsigned NumVars = Record.readInt(); 11830 unsigned NumLoops = Record.readInt(); 11831 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11832 break; 11833 } 11834 case llvm::omp::OMPC_device: 11835 C = new (Context) OMPDeviceClause(); 11836 break; 11837 case llvm::omp::OMPC_map: { 11838 OMPMappableExprListSizeTy Sizes; 11839 Sizes.NumVars = Record.readInt(); 11840 Sizes.NumUniqueDeclarations = Record.readInt(); 11841 Sizes.NumComponentLists = Record.readInt(); 11842 Sizes.NumComponents = Record.readInt(); 11843 C = OMPMapClause::CreateEmpty(Context, Sizes); 11844 break; 11845 } 11846 case llvm::omp::OMPC_num_teams: 11847 C = new (Context) OMPNumTeamsClause(); 11848 break; 11849 case llvm::omp::OMPC_thread_limit: 11850 C = new (Context) OMPThreadLimitClause(); 11851 break; 11852 case llvm::omp::OMPC_priority: 11853 C = new (Context) OMPPriorityClause(); 11854 break; 11855 case llvm::omp::OMPC_grainsize: 11856 C = new (Context) OMPGrainsizeClause(); 11857 break; 11858 case llvm::omp::OMPC_num_tasks: 11859 C = new (Context) OMPNumTasksClause(); 11860 break; 11861 case llvm::omp::OMPC_hint: 11862 C = new (Context) OMPHintClause(); 11863 break; 11864 case llvm::omp::OMPC_dist_schedule: 11865 C = new (Context) OMPDistScheduleClause(); 11866 break; 11867 case llvm::omp::OMPC_defaultmap: 11868 C = new (Context) OMPDefaultmapClause(); 11869 break; 11870 case llvm::omp::OMPC_to: { 11871 OMPMappableExprListSizeTy Sizes; 11872 Sizes.NumVars = Record.readInt(); 11873 Sizes.NumUniqueDeclarations = Record.readInt(); 11874 Sizes.NumComponentLists = Record.readInt(); 11875 Sizes.NumComponents = Record.readInt(); 11876 C = OMPToClause::CreateEmpty(Context, Sizes); 11877 break; 11878 } 11879 case llvm::omp::OMPC_from: { 11880 OMPMappableExprListSizeTy Sizes; 11881 Sizes.NumVars = Record.readInt(); 11882 Sizes.NumUniqueDeclarations = Record.readInt(); 11883 Sizes.NumComponentLists = Record.readInt(); 11884 Sizes.NumComponents = Record.readInt(); 11885 C = OMPFromClause::CreateEmpty(Context, Sizes); 11886 break; 11887 } 11888 case llvm::omp::OMPC_use_device_ptr: { 11889 OMPMappableExprListSizeTy Sizes; 11890 Sizes.NumVars = Record.readInt(); 11891 Sizes.NumUniqueDeclarations = Record.readInt(); 11892 Sizes.NumComponentLists = Record.readInt(); 11893 Sizes.NumComponents = Record.readInt(); 11894 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11895 break; 11896 } 11897 case llvm::omp::OMPC_use_device_addr: { 11898 OMPMappableExprListSizeTy Sizes; 11899 Sizes.NumVars = Record.readInt(); 11900 Sizes.NumUniqueDeclarations = Record.readInt(); 11901 Sizes.NumComponentLists = Record.readInt(); 11902 Sizes.NumComponents = Record.readInt(); 11903 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11904 break; 11905 } 11906 case llvm::omp::OMPC_is_device_ptr: { 11907 OMPMappableExprListSizeTy Sizes; 11908 Sizes.NumVars = Record.readInt(); 11909 Sizes.NumUniqueDeclarations = Record.readInt(); 11910 Sizes.NumComponentLists = Record.readInt(); 11911 Sizes.NumComponents = Record.readInt(); 11912 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11913 break; 11914 } 11915 case llvm::omp::OMPC_has_device_addr: { 11916 OMPMappableExprListSizeTy Sizes; 11917 Sizes.NumVars = Record.readInt(); 11918 Sizes.NumUniqueDeclarations = Record.readInt(); 11919 Sizes.NumComponentLists = Record.readInt(); 11920 Sizes.NumComponents = Record.readInt(); 11921 C = OMPHasDeviceAddrClause::CreateEmpty(Context, Sizes); 11922 break; 11923 } 11924 case llvm::omp::OMPC_allocate: 11925 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11926 break; 11927 case llvm::omp::OMPC_nontemporal: 11928 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11929 break; 11930 case llvm::omp::OMPC_inclusive: 11931 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11932 break; 11933 case llvm::omp::OMPC_exclusive: 11934 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11935 break; 11936 case llvm::omp::OMPC_order: 11937 C = new (Context) OMPOrderClause(); 11938 break; 11939 case llvm::omp::OMPC_init: 11940 C = OMPInitClause::CreateEmpty(Context, Record.readInt()); 11941 break; 11942 case llvm::omp::OMPC_use: 11943 C = new (Context) OMPUseClause(); 11944 break; 11945 case llvm::omp::OMPC_destroy: 11946 C = new (Context) OMPDestroyClause(); 11947 break; 11948 case llvm::omp::OMPC_novariants: 11949 C = new (Context) OMPNovariantsClause(); 11950 break; 11951 case llvm::omp::OMPC_nocontext: 11952 C = new (Context) OMPNocontextClause(); 11953 break; 11954 case llvm::omp::OMPC_detach: 11955 C = new (Context) OMPDetachClause(); 11956 break; 11957 case llvm::omp::OMPC_uses_allocators: 11958 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11959 break; 11960 case llvm::omp::OMPC_affinity: 11961 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 11962 break; 11963 case llvm::omp::OMPC_filter: 11964 C = new (Context) OMPFilterClause(); 11965 break; 11966 case llvm::omp::OMPC_bind: 11967 C = OMPBindClause::CreateEmpty(Context); 11968 break; 11969 case llvm::omp::OMPC_align: 11970 C = new (Context) OMPAlignClause(); 11971 break; 11972 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 11973 case llvm::omp::Enum: \ 11974 break; 11975 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11976 default: 11977 break; 11978 } 11979 assert(C && "Unknown OMPClause type"); 11980 11981 Visit(C); 11982 C->setLocStart(Record.readSourceLocation()); 11983 C->setLocEnd(Record.readSourceLocation()); 11984 11985 return C; 11986 } 11987 11988 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 11989 C->setPreInitStmt(Record.readSubStmt(), 11990 static_cast<OpenMPDirectiveKind>(Record.readInt())); 11991 } 11992 11993 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 11994 VisitOMPClauseWithPreInit(C); 11995 C->setPostUpdateExpr(Record.readSubExpr()); 11996 } 11997 11998 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 11999 VisitOMPClauseWithPreInit(C); 12000 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 12001 C->setNameModifierLoc(Record.readSourceLocation()); 12002 C->setColonLoc(Record.readSourceLocation()); 12003 C->setCondition(Record.readSubExpr()); 12004 C->setLParenLoc(Record.readSourceLocation()); 12005 } 12006 12007 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12008 VisitOMPClauseWithPreInit(C); 12009 C->setCondition(Record.readSubExpr()); 12010 C->setLParenLoc(Record.readSourceLocation()); 12011 } 12012 12013 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12014 VisitOMPClauseWithPreInit(C); 12015 C->setNumThreads(Record.readSubExpr()); 12016 C->setLParenLoc(Record.readSourceLocation()); 12017 } 12018 12019 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12020 C->setSafelen(Record.readSubExpr()); 12021 C->setLParenLoc(Record.readSourceLocation()); 12022 } 12023 12024 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12025 C->setSimdlen(Record.readSubExpr()); 12026 C->setLParenLoc(Record.readSourceLocation()); 12027 } 12028 12029 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) { 12030 for (Expr *&E : C->getSizesRefs()) 12031 E = Record.readSubExpr(); 12032 C->setLParenLoc(Record.readSourceLocation()); 12033 } 12034 12035 void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {} 12036 12037 void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) { 12038 C->setFactor(Record.readSubExpr()); 12039 C->setLParenLoc(Record.readSourceLocation()); 12040 } 12041 12042 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12043 C->setAllocator(Record.readExpr()); 12044 C->setLParenLoc(Record.readSourceLocation()); 12045 } 12046 12047 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12048 C->setNumForLoops(Record.readSubExpr()); 12049 C->setLParenLoc(Record.readSourceLocation()); 12050 } 12051 12052 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12053 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12054 C->setLParenLoc(Record.readSourceLocation()); 12055 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12056 } 12057 12058 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12059 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12060 C->setLParenLoc(Record.readSourceLocation()); 12061 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12062 } 12063 12064 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12065 VisitOMPClauseWithPreInit(C); 12066 C->setScheduleKind( 12067 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12068 C->setFirstScheduleModifier( 12069 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12070 C->setSecondScheduleModifier( 12071 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12072 C->setChunkSize(Record.readSubExpr()); 12073 C->setLParenLoc(Record.readSourceLocation()); 12074 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12075 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12076 C->setScheduleKindLoc(Record.readSourceLocation()); 12077 C->setCommaLoc(Record.readSourceLocation()); 12078 } 12079 12080 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12081 C->setNumForLoops(Record.readSubExpr()); 12082 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12083 C->setLoopNumIterations(I, Record.readSubExpr()); 12084 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12085 C->setLoopCounter(I, Record.readSubExpr()); 12086 C->setLParenLoc(Record.readSourceLocation()); 12087 } 12088 12089 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12090 C->setEventHandler(Record.readSubExpr()); 12091 C->setLParenLoc(Record.readSourceLocation()); 12092 } 12093 12094 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12095 12096 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12097 12098 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12099 12100 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12101 12102 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12103 12104 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12105 if (C->isExtended()) { 12106 C->setLParenLoc(Record.readSourceLocation()); 12107 C->setArgumentLoc(Record.readSourceLocation()); 12108 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12109 } 12110 } 12111 12112 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12113 12114 void OMPClauseReader::VisitOMPCompareClause(OMPCompareClause *) {} 12115 12116 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12117 12118 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12119 12120 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12121 12122 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12123 12124 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12125 12126 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12127 12128 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12129 12130 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12131 12132 void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) { 12133 unsigned NumVars = C->varlist_size(); 12134 SmallVector<Expr *, 16> Vars; 12135 Vars.reserve(NumVars); 12136 for (unsigned I = 0; I != NumVars; ++I) 12137 Vars.push_back(Record.readSubExpr()); 12138 C->setVarRefs(Vars); 12139 C->setIsTarget(Record.readBool()); 12140 C->setIsTargetSync(Record.readBool()); 12141 C->setLParenLoc(Record.readSourceLocation()); 12142 C->setVarLoc(Record.readSourceLocation()); 12143 } 12144 12145 void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) { 12146 C->setInteropVar(Record.readSubExpr()); 12147 C->setLParenLoc(Record.readSourceLocation()); 12148 C->setVarLoc(Record.readSourceLocation()); 12149 } 12150 12151 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) { 12152 C->setInteropVar(Record.readSubExpr()); 12153 C->setLParenLoc(Record.readSourceLocation()); 12154 C->setVarLoc(Record.readSourceLocation()); 12155 } 12156 12157 void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) { 12158 VisitOMPClauseWithPreInit(C); 12159 C->setCondition(Record.readSubExpr()); 12160 C->setLParenLoc(Record.readSourceLocation()); 12161 } 12162 12163 void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) { 12164 VisitOMPClauseWithPreInit(C); 12165 C->setCondition(Record.readSubExpr()); 12166 C->setLParenLoc(Record.readSourceLocation()); 12167 } 12168 12169 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12170 12171 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12172 OMPUnifiedSharedMemoryClause *) {} 12173 12174 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12175 12176 void 12177 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12178 } 12179 12180 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12181 OMPAtomicDefaultMemOrderClause *C) { 12182 C->setAtomicDefaultMemOrderKind( 12183 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12184 C->setLParenLoc(Record.readSourceLocation()); 12185 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12186 } 12187 12188 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12189 C->setLParenLoc(Record.readSourceLocation()); 12190 unsigned NumVars = C->varlist_size(); 12191 SmallVector<Expr *, 16> Vars; 12192 Vars.reserve(NumVars); 12193 for (unsigned i = 0; i != NumVars; ++i) 12194 Vars.push_back(Record.readSubExpr()); 12195 C->setVarRefs(Vars); 12196 Vars.clear(); 12197 for (unsigned i = 0; i != NumVars; ++i) 12198 Vars.push_back(Record.readSubExpr()); 12199 C->setPrivateCopies(Vars); 12200 } 12201 12202 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12203 VisitOMPClauseWithPreInit(C); 12204 C->setLParenLoc(Record.readSourceLocation()); 12205 unsigned NumVars = C->varlist_size(); 12206 SmallVector<Expr *, 16> Vars; 12207 Vars.reserve(NumVars); 12208 for (unsigned i = 0; i != NumVars; ++i) 12209 Vars.push_back(Record.readSubExpr()); 12210 C->setVarRefs(Vars); 12211 Vars.clear(); 12212 for (unsigned i = 0; i != NumVars; ++i) 12213 Vars.push_back(Record.readSubExpr()); 12214 C->setPrivateCopies(Vars); 12215 Vars.clear(); 12216 for (unsigned i = 0; i != NumVars; ++i) 12217 Vars.push_back(Record.readSubExpr()); 12218 C->setInits(Vars); 12219 } 12220 12221 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12222 VisitOMPClauseWithPostUpdate(C); 12223 C->setLParenLoc(Record.readSourceLocation()); 12224 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12225 C->setKindLoc(Record.readSourceLocation()); 12226 C->setColonLoc(Record.readSourceLocation()); 12227 unsigned NumVars = C->varlist_size(); 12228 SmallVector<Expr *, 16> Vars; 12229 Vars.reserve(NumVars); 12230 for (unsigned i = 0; i != NumVars; ++i) 12231 Vars.push_back(Record.readSubExpr()); 12232 C->setVarRefs(Vars); 12233 Vars.clear(); 12234 for (unsigned i = 0; i != NumVars; ++i) 12235 Vars.push_back(Record.readSubExpr()); 12236 C->setPrivateCopies(Vars); 12237 Vars.clear(); 12238 for (unsigned i = 0; i != NumVars; ++i) 12239 Vars.push_back(Record.readSubExpr()); 12240 C->setSourceExprs(Vars); 12241 Vars.clear(); 12242 for (unsigned i = 0; i != NumVars; ++i) 12243 Vars.push_back(Record.readSubExpr()); 12244 C->setDestinationExprs(Vars); 12245 Vars.clear(); 12246 for (unsigned i = 0; i != NumVars; ++i) 12247 Vars.push_back(Record.readSubExpr()); 12248 C->setAssignmentOps(Vars); 12249 } 12250 12251 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12252 C->setLParenLoc(Record.readSourceLocation()); 12253 unsigned NumVars = C->varlist_size(); 12254 SmallVector<Expr *, 16> Vars; 12255 Vars.reserve(NumVars); 12256 for (unsigned i = 0; i != NumVars; ++i) 12257 Vars.push_back(Record.readSubExpr()); 12258 C->setVarRefs(Vars); 12259 } 12260 12261 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12262 VisitOMPClauseWithPostUpdate(C); 12263 C->setLParenLoc(Record.readSourceLocation()); 12264 C->setModifierLoc(Record.readSourceLocation()); 12265 C->setColonLoc(Record.readSourceLocation()); 12266 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12267 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12268 C->setQualifierLoc(NNSL); 12269 C->setNameInfo(DNI); 12270 12271 unsigned NumVars = C->varlist_size(); 12272 SmallVector<Expr *, 16> Vars; 12273 Vars.reserve(NumVars); 12274 for (unsigned i = 0; i != NumVars; ++i) 12275 Vars.push_back(Record.readSubExpr()); 12276 C->setVarRefs(Vars); 12277 Vars.clear(); 12278 for (unsigned i = 0; i != NumVars; ++i) 12279 Vars.push_back(Record.readSubExpr()); 12280 C->setPrivates(Vars); 12281 Vars.clear(); 12282 for (unsigned i = 0; i != NumVars; ++i) 12283 Vars.push_back(Record.readSubExpr()); 12284 C->setLHSExprs(Vars); 12285 Vars.clear(); 12286 for (unsigned i = 0; i != NumVars; ++i) 12287 Vars.push_back(Record.readSubExpr()); 12288 C->setRHSExprs(Vars); 12289 Vars.clear(); 12290 for (unsigned i = 0; i != NumVars; ++i) 12291 Vars.push_back(Record.readSubExpr()); 12292 C->setReductionOps(Vars); 12293 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12294 Vars.clear(); 12295 for (unsigned i = 0; i != NumVars; ++i) 12296 Vars.push_back(Record.readSubExpr()); 12297 C->setInscanCopyOps(Vars); 12298 Vars.clear(); 12299 for (unsigned i = 0; i != NumVars; ++i) 12300 Vars.push_back(Record.readSubExpr()); 12301 C->setInscanCopyArrayTemps(Vars); 12302 Vars.clear(); 12303 for (unsigned i = 0; i != NumVars; ++i) 12304 Vars.push_back(Record.readSubExpr()); 12305 C->setInscanCopyArrayElems(Vars); 12306 } 12307 } 12308 12309 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12310 VisitOMPClauseWithPostUpdate(C); 12311 C->setLParenLoc(Record.readSourceLocation()); 12312 C->setColonLoc(Record.readSourceLocation()); 12313 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12314 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12315 C->setQualifierLoc(NNSL); 12316 C->setNameInfo(DNI); 12317 12318 unsigned NumVars = C->varlist_size(); 12319 SmallVector<Expr *, 16> Vars; 12320 Vars.reserve(NumVars); 12321 for (unsigned I = 0; I != NumVars; ++I) 12322 Vars.push_back(Record.readSubExpr()); 12323 C->setVarRefs(Vars); 12324 Vars.clear(); 12325 for (unsigned I = 0; I != NumVars; ++I) 12326 Vars.push_back(Record.readSubExpr()); 12327 C->setPrivates(Vars); 12328 Vars.clear(); 12329 for (unsigned I = 0; I != NumVars; ++I) 12330 Vars.push_back(Record.readSubExpr()); 12331 C->setLHSExprs(Vars); 12332 Vars.clear(); 12333 for (unsigned I = 0; I != NumVars; ++I) 12334 Vars.push_back(Record.readSubExpr()); 12335 C->setRHSExprs(Vars); 12336 Vars.clear(); 12337 for (unsigned I = 0; I != NumVars; ++I) 12338 Vars.push_back(Record.readSubExpr()); 12339 C->setReductionOps(Vars); 12340 } 12341 12342 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12343 VisitOMPClauseWithPostUpdate(C); 12344 C->setLParenLoc(Record.readSourceLocation()); 12345 C->setColonLoc(Record.readSourceLocation()); 12346 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12347 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12348 C->setQualifierLoc(NNSL); 12349 C->setNameInfo(DNI); 12350 12351 unsigned NumVars = C->varlist_size(); 12352 SmallVector<Expr *, 16> Vars; 12353 Vars.reserve(NumVars); 12354 for (unsigned I = 0; I != NumVars; ++I) 12355 Vars.push_back(Record.readSubExpr()); 12356 C->setVarRefs(Vars); 12357 Vars.clear(); 12358 for (unsigned I = 0; I != NumVars; ++I) 12359 Vars.push_back(Record.readSubExpr()); 12360 C->setPrivates(Vars); 12361 Vars.clear(); 12362 for (unsigned I = 0; I != NumVars; ++I) 12363 Vars.push_back(Record.readSubExpr()); 12364 C->setLHSExprs(Vars); 12365 Vars.clear(); 12366 for (unsigned I = 0; I != NumVars; ++I) 12367 Vars.push_back(Record.readSubExpr()); 12368 C->setRHSExprs(Vars); 12369 Vars.clear(); 12370 for (unsigned I = 0; I != NumVars; ++I) 12371 Vars.push_back(Record.readSubExpr()); 12372 C->setReductionOps(Vars); 12373 Vars.clear(); 12374 for (unsigned I = 0; I != NumVars; ++I) 12375 Vars.push_back(Record.readSubExpr()); 12376 C->setTaskgroupDescriptors(Vars); 12377 } 12378 12379 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12380 VisitOMPClauseWithPostUpdate(C); 12381 C->setLParenLoc(Record.readSourceLocation()); 12382 C->setColonLoc(Record.readSourceLocation()); 12383 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12384 C->setModifierLoc(Record.readSourceLocation()); 12385 unsigned NumVars = C->varlist_size(); 12386 SmallVector<Expr *, 16> Vars; 12387 Vars.reserve(NumVars); 12388 for (unsigned i = 0; i != NumVars; ++i) 12389 Vars.push_back(Record.readSubExpr()); 12390 C->setVarRefs(Vars); 12391 Vars.clear(); 12392 for (unsigned i = 0; i != NumVars; ++i) 12393 Vars.push_back(Record.readSubExpr()); 12394 C->setPrivates(Vars); 12395 Vars.clear(); 12396 for (unsigned i = 0; i != NumVars; ++i) 12397 Vars.push_back(Record.readSubExpr()); 12398 C->setInits(Vars); 12399 Vars.clear(); 12400 for (unsigned i = 0; i != NumVars; ++i) 12401 Vars.push_back(Record.readSubExpr()); 12402 C->setUpdates(Vars); 12403 Vars.clear(); 12404 for (unsigned i = 0; i != NumVars; ++i) 12405 Vars.push_back(Record.readSubExpr()); 12406 C->setFinals(Vars); 12407 C->setStep(Record.readSubExpr()); 12408 C->setCalcStep(Record.readSubExpr()); 12409 Vars.clear(); 12410 for (unsigned I = 0; I != NumVars + 1; ++I) 12411 Vars.push_back(Record.readSubExpr()); 12412 C->setUsedExprs(Vars); 12413 } 12414 12415 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12416 C->setLParenLoc(Record.readSourceLocation()); 12417 C->setColonLoc(Record.readSourceLocation()); 12418 unsigned NumVars = C->varlist_size(); 12419 SmallVector<Expr *, 16> Vars; 12420 Vars.reserve(NumVars); 12421 for (unsigned i = 0; i != NumVars; ++i) 12422 Vars.push_back(Record.readSubExpr()); 12423 C->setVarRefs(Vars); 12424 C->setAlignment(Record.readSubExpr()); 12425 } 12426 12427 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12428 C->setLParenLoc(Record.readSourceLocation()); 12429 unsigned NumVars = C->varlist_size(); 12430 SmallVector<Expr *, 16> Exprs; 12431 Exprs.reserve(NumVars); 12432 for (unsigned i = 0; i != NumVars; ++i) 12433 Exprs.push_back(Record.readSubExpr()); 12434 C->setVarRefs(Exprs); 12435 Exprs.clear(); 12436 for (unsigned i = 0; i != NumVars; ++i) 12437 Exprs.push_back(Record.readSubExpr()); 12438 C->setSourceExprs(Exprs); 12439 Exprs.clear(); 12440 for (unsigned i = 0; i != NumVars; ++i) 12441 Exprs.push_back(Record.readSubExpr()); 12442 C->setDestinationExprs(Exprs); 12443 Exprs.clear(); 12444 for (unsigned i = 0; i != NumVars; ++i) 12445 Exprs.push_back(Record.readSubExpr()); 12446 C->setAssignmentOps(Exprs); 12447 } 12448 12449 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12450 C->setLParenLoc(Record.readSourceLocation()); 12451 unsigned NumVars = C->varlist_size(); 12452 SmallVector<Expr *, 16> Exprs; 12453 Exprs.reserve(NumVars); 12454 for (unsigned i = 0; i != NumVars; ++i) 12455 Exprs.push_back(Record.readSubExpr()); 12456 C->setVarRefs(Exprs); 12457 Exprs.clear(); 12458 for (unsigned i = 0; i != NumVars; ++i) 12459 Exprs.push_back(Record.readSubExpr()); 12460 C->setSourceExprs(Exprs); 12461 Exprs.clear(); 12462 for (unsigned i = 0; i != NumVars; ++i) 12463 Exprs.push_back(Record.readSubExpr()); 12464 C->setDestinationExprs(Exprs); 12465 Exprs.clear(); 12466 for (unsigned i = 0; i != NumVars; ++i) 12467 Exprs.push_back(Record.readSubExpr()); 12468 C->setAssignmentOps(Exprs); 12469 } 12470 12471 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12472 C->setLParenLoc(Record.readSourceLocation()); 12473 unsigned NumVars = C->varlist_size(); 12474 SmallVector<Expr *, 16> Vars; 12475 Vars.reserve(NumVars); 12476 for (unsigned i = 0; i != NumVars; ++i) 12477 Vars.push_back(Record.readSubExpr()); 12478 C->setVarRefs(Vars); 12479 } 12480 12481 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12482 C->setDepobj(Record.readSubExpr()); 12483 C->setLParenLoc(Record.readSourceLocation()); 12484 } 12485 12486 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12487 C->setLParenLoc(Record.readSourceLocation()); 12488 C->setModifier(Record.readSubExpr()); 12489 C->setDependencyKind( 12490 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12491 C->setDependencyLoc(Record.readSourceLocation()); 12492 C->setColonLoc(Record.readSourceLocation()); 12493 C->setOmpAllMemoryLoc(Record.readSourceLocation()); 12494 unsigned NumVars = C->varlist_size(); 12495 SmallVector<Expr *, 16> Vars; 12496 Vars.reserve(NumVars); 12497 for (unsigned I = 0; I != NumVars; ++I) 12498 Vars.push_back(Record.readSubExpr()); 12499 C->setVarRefs(Vars); 12500 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12501 C->setLoopData(I, Record.readSubExpr()); 12502 } 12503 12504 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12505 VisitOMPClauseWithPreInit(C); 12506 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12507 C->setDevice(Record.readSubExpr()); 12508 C->setModifierLoc(Record.readSourceLocation()); 12509 C->setLParenLoc(Record.readSourceLocation()); 12510 } 12511 12512 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12513 C->setLParenLoc(Record.readSourceLocation()); 12514 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12515 C->setMapTypeModifier( 12516 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12517 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12518 } 12519 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12520 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12521 C->setMapType( 12522 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12523 C->setMapLoc(Record.readSourceLocation()); 12524 C->setColonLoc(Record.readSourceLocation()); 12525 auto NumVars = C->varlist_size(); 12526 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12527 auto TotalLists = C->getTotalComponentListNum(); 12528 auto TotalComponents = C->getTotalComponentsNum(); 12529 12530 SmallVector<Expr *, 16> Vars; 12531 Vars.reserve(NumVars); 12532 for (unsigned i = 0; i != NumVars; ++i) 12533 Vars.push_back(Record.readExpr()); 12534 C->setVarRefs(Vars); 12535 12536 SmallVector<Expr *, 16> UDMappers; 12537 UDMappers.reserve(NumVars); 12538 for (unsigned I = 0; I < NumVars; ++I) 12539 UDMappers.push_back(Record.readExpr()); 12540 C->setUDMapperRefs(UDMappers); 12541 12542 SmallVector<ValueDecl *, 16> Decls; 12543 Decls.reserve(UniqueDecls); 12544 for (unsigned i = 0; i < UniqueDecls; ++i) 12545 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12546 C->setUniqueDecls(Decls); 12547 12548 SmallVector<unsigned, 16> ListsPerDecl; 12549 ListsPerDecl.reserve(UniqueDecls); 12550 for (unsigned i = 0; i < UniqueDecls; ++i) 12551 ListsPerDecl.push_back(Record.readInt()); 12552 C->setDeclNumLists(ListsPerDecl); 12553 12554 SmallVector<unsigned, 32> ListSizes; 12555 ListSizes.reserve(TotalLists); 12556 for (unsigned i = 0; i < TotalLists; ++i) 12557 ListSizes.push_back(Record.readInt()); 12558 C->setComponentListSizes(ListSizes); 12559 12560 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12561 Components.reserve(TotalComponents); 12562 for (unsigned i = 0; i < TotalComponents; ++i) { 12563 Expr *AssociatedExprPr = Record.readExpr(); 12564 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12565 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12566 /*IsNonContiguous=*/false); 12567 } 12568 C->setComponents(Components, ListSizes); 12569 } 12570 12571 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12572 C->setLParenLoc(Record.readSourceLocation()); 12573 C->setColonLoc(Record.readSourceLocation()); 12574 C->setAllocator(Record.readSubExpr()); 12575 unsigned NumVars = C->varlist_size(); 12576 SmallVector<Expr *, 16> Vars; 12577 Vars.reserve(NumVars); 12578 for (unsigned i = 0; i != NumVars; ++i) 12579 Vars.push_back(Record.readSubExpr()); 12580 C->setVarRefs(Vars); 12581 } 12582 12583 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12584 VisitOMPClauseWithPreInit(C); 12585 C->setNumTeams(Record.readSubExpr()); 12586 C->setLParenLoc(Record.readSourceLocation()); 12587 } 12588 12589 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12590 VisitOMPClauseWithPreInit(C); 12591 C->setThreadLimit(Record.readSubExpr()); 12592 C->setLParenLoc(Record.readSourceLocation()); 12593 } 12594 12595 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12596 VisitOMPClauseWithPreInit(C); 12597 C->setPriority(Record.readSubExpr()); 12598 C->setLParenLoc(Record.readSourceLocation()); 12599 } 12600 12601 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12602 VisitOMPClauseWithPreInit(C); 12603 C->setGrainsize(Record.readSubExpr()); 12604 C->setLParenLoc(Record.readSourceLocation()); 12605 } 12606 12607 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12608 VisitOMPClauseWithPreInit(C); 12609 C->setNumTasks(Record.readSubExpr()); 12610 C->setLParenLoc(Record.readSourceLocation()); 12611 } 12612 12613 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12614 C->setHint(Record.readSubExpr()); 12615 C->setLParenLoc(Record.readSourceLocation()); 12616 } 12617 12618 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12619 VisitOMPClauseWithPreInit(C); 12620 C->setDistScheduleKind( 12621 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12622 C->setChunkSize(Record.readSubExpr()); 12623 C->setLParenLoc(Record.readSourceLocation()); 12624 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12625 C->setCommaLoc(Record.readSourceLocation()); 12626 } 12627 12628 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12629 C->setDefaultmapKind( 12630 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12631 C->setDefaultmapModifier( 12632 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12633 C->setLParenLoc(Record.readSourceLocation()); 12634 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12635 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12636 } 12637 12638 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12639 C->setLParenLoc(Record.readSourceLocation()); 12640 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12641 C->setMotionModifier( 12642 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12643 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12644 } 12645 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12646 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12647 C->setColonLoc(Record.readSourceLocation()); 12648 auto NumVars = C->varlist_size(); 12649 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12650 auto TotalLists = C->getTotalComponentListNum(); 12651 auto TotalComponents = C->getTotalComponentsNum(); 12652 12653 SmallVector<Expr *, 16> Vars; 12654 Vars.reserve(NumVars); 12655 for (unsigned i = 0; i != NumVars; ++i) 12656 Vars.push_back(Record.readSubExpr()); 12657 C->setVarRefs(Vars); 12658 12659 SmallVector<Expr *, 16> UDMappers; 12660 UDMappers.reserve(NumVars); 12661 for (unsigned I = 0; I < NumVars; ++I) 12662 UDMappers.push_back(Record.readSubExpr()); 12663 C->setUDMapperRefs(UDMappers); 12664 12665 SmallVector<ValueDecl *, 16> Decls; 12666 Decls.reserve(UniqueDecls); 12667 for (unsigned i = 0; i < UniqueDecls; ++i) 12668 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12669 C->setUniqueDecls(Decls); 12670 12671 SmallVector<unsigned, 16> ListsPerDecl; 12672 ListsPerDecl.reserve(UniqueDecls); 12673 for (unsigned i = 0; i < UniqueDecls; ++i) 12674 ListsPerDecl.push_back(Record.readInt()); 12675 C->setDeclNumLists(ListsPerDecl); 12676 12677 SmallVector<unsigned, 32> ListSizes; 12678 ListSizes.reserve(TotalLists); 12679 for (unsigned i = 0; i < TotalLists; ++i) 12680 ListSizes.push_back(Record.readInt()); 12681 C->setComponentListSizes(ListSizes); 12682 12683 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12684 Components.reserve(TotalComponents); 12685 for (unsigned i = 0; i < TotalComponents; ++i) { 12686 Expr *AssociatedExprPr = Record.readSubExpr(); 12687 bool IsNonContiguous = Record.readBool(); 12688 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12689 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12690 } 12691 C->setComponents(Components, ListSizes); 12692 } 12693 12694 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12695 C->setLParenLoc(Record.readSourceLocation()); 12696 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12697 C->setMotionModifier( 12698 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12699 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12700 } 12701 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12702 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12703 C->setColonLoc(Record.readSourceLocation()); 12704 auto NumVars = C->varlist_size(); 12705 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12706 auto TotalLists = C->getTotalComponentListNum(); 12707 auto TotalComponents = C->getTotalComponentsNum(); 12708 12709 SmallVector<Expr *, 16> Vars; 12710 Vars.reserve(NumVars); 12711 for (unsigned i = 0; i != NumVars; ++i) 12712 Vars.push_back(Record.readSubExpr()); 12713 C->setVarRefs(Vars); 12714 12715 SmallVector<Expr *, 16> UDMappers; 12716 UDMappers.reserve(NumVars); 12717 for (unsigned I = 0; I < NumVars; ++I) 12718 UDMappers.push_back(Record.readSubExpr()); 12719 C->setUDMapperRefs(UDMappers); 12720 12721 SmallVector<ValueDecl *, 16> Decls; 12722 Decls.reserve(UniqueDecls); 12723 for (unsigned i = 0; i < UniqueDecls; ++i) 12724 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12725 C->setUniqueDecls(Decls); 12726 12727 SmallVector<unsigned, 16> ListsPerDecl; 12728 ListsPerDecl.reserve(UniqueDecls); 12729 for (unsigned i = 0; i < UniqueDecls; ++i) 12730 ListsPerDecl.push_back(Record.readInt()); 12731 C->setDeclNumLists(ListsPerDecl); 12732 12733 SmallVector<unsigned, 32> ListSizes; 12734 ListSizes.reserve(TotalLists); 12735 for (unsigned i = 0; i < TotalLists; ++i) 12736 ListSizes.push_back(Record.readInt()); 12737 C->setComponentListSizes(ListSizes); 12738 12739 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12740 Components.reserve(TotalComponents); 12741 for (unsigned i = 0; i < TotalComponents; ++i) { 12742 Expr *AssociatedExprPr = Record.readSubExpr(); 12743 bool IsNonContiguous = Record.readBool(); 12744 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12745 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12746 } 12747 C->setComponents(Components, ListSizes); 12748 } 12749 12750 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12751 C->setLParenLoc(Record.readSourceLocation()); 12752 auto NumVars = C->varlist_size(); 12753 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12754 auto TotalLists = C->getTotalComponentListNum(); 12755 auto TotalComponents = C->getTotalComponentsNum(); 12756 12757 SmallVector<Expr *, 16> Vars; 12758 Vars.reserve(NumVars); 12759 for (unsigned i = 0; i != NumVars; ++i) 12760 Vars.push_back(Record.readSubExpr()); 12761 C->setVarRefs(Vars); 12762 Vars.clear(); 12763 for (unsigned i = 0; i != NumVars; ++i) 12764 Vars.push_back(Record.readSubExpr()); 12765 C->setPrivateCopies(Vars); 12766 Vars.clear(); 12767 for (unsigned i = 0; i != NumVars; ++i) 12768 Vars.push_back(Record.readSubExpr()); 12769 C->setInits(Vars); 12770 12771 SmallVector<ValueDecl *, 16> Decls; 12772 Decls.reserve(UniqueDecls); 12773 for (unsigned i = 0; i < UniqueDecls; ++i) 12774 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12775 C->setUniqueDecls(Decls); 12776 12777 SmallVector<unsigned, 16> ListsPerDecl; 12778 ListsPerDecl.reserve(UniqueDecls); 12779 for (unsigned i = 0; i < UniqueDecls; ++i) 12780 ListsPerDecl.push_back(Record.readInt()); 12781 C->setDeclNumLists(ListsPerDecl); 12782 12783 SmallVector<unsigned, 32> ListSizes; 12784 ListSizes.reserve(TotalLists); 12785 for (unsigned i = 0; i < TotalLists; ++i) 12786 ListSizes.push_back(Record.readInt()); 12787 C->setComponentListSizes(ListSizes); 12788 12789 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12790 Components.reserve(TotalComponents); 12791 for (unsigned i = 0; i < TotalComponents; ++i) { 12792 auto *AssociatedExprPr = Record.readSubExpr(); 12793 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12794 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12795 /*IsNonContiguous=*/false); 12796 } 12797 C->setComponents(Components, ListSizes); 12798 } 12799 12800 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12801 C->setLParenLoc(Record.readSourceLocation()); 12802 auto NumVars = C->varlist_size(); 12803 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12804 auto TotalLists = C->getTotalComponentListNum(); 12805 auto TotalComponents = C->getTotalComponentsNum(); 12806 12807 SmallVector<Expr *, 16> Vars; 12808 Vars.reserve(NumVars); 12809 for (unsigned i = 0; i != NumVars; ++i) 12810 Vars.push_back(Record.readSubExpr()); 12811 C->setVarRefs(Vars); 12812 12813 SmallVector<ValueDecl *, 16> Decls; 12814 Decls.reserve(UniqueDecls); 12815 for (unsigned i = 0; i < UniqueDecls; ++i) 12816 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12817 C->setUniqueDecls(Decls); 12818 12819 SmallVector<unsigned, 16> ListsPerDecl; 12820 ListsPerDecl.reserve(UniqueDecls); 12821 for (unsigned i = 0; i < UniqueDecls; ++i) 12822 ListsPerDecl.push_back(Record.readInt()); 12823 C->setDeclNumLists(ListsPerDecl); 12824 12825 SmallVector<unsigned, 32> ListSizes; 12826 ListSizes.reserve(TotalLists); 12827 for (unsigned i = 0; i < TotalLists; ++i) 12828 ListSizes.push_back(Record.readInt()); 12829 C->setComponentListSizes(ListSizes); 12830 12831 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12832 Components.reserve(TotalComponents); 12833 for (unsigned i = 0; i < TotalComponents; ++i) { 12834 Expr *AssociatedExpr = Record.readSubExpr(); 12835 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12836 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12837 /*IsNonContiguous*/ false); 12838 } 12839 C->setComponents(Components, ListSizes); 12840 } 12841 12842 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12843 C->setLParenLoc(Record.readSourceLocation()); 12844 auto NumVars = C->varlist_size(); 12845 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12846 auto TotalLists = C->getTotalComponentListNum(); 12847 auto TotalComponents = C->getTotalComponentsNum(); 12848 12849 SmallVector<Expr *, 16> Vars; 12850 Vars.reserve(NumVars); 12851 for (unsigned i = 0; i != NumVars; ++i) 12852 Vars.push_back(Record.readSubExpr()); 12853 C->setVarRefs(Vars); 12854 Vars.clear(); 12855 12856 SmallVector<ValueDecl *, 16> Decls; 12857 Decls.reserve(UniqueDecls); 12858 for (unsigned i = 0; i < UniqueDecls; ++i) 12859 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12860 C->setUniqueDecls(Decls); 12861 12862 SmallVector<unsigned, 16> ListsPerDecl; 12863 ListsPerDecl.reserve(UniqueDecls); 12864 for (unsigned i = 0; i < UniqueDecls; ++i) 12865 ListsPerDecl.push_back(Record.readInt()); 12866 C->setDeclNumLists(ListsPerDecl); 12867 12868 SmallVector<unsigned, 32> ListSizes; 12869 ListSizes.reserve(TotalLists); 12870 for (unsigned i = 0; i < TotalLists; ++i) 12871 ListSizes.push_back(Record.readInt()); 12872 C->setComponentListSizes(ListSizes); 12873 12874 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12875 Components.reserve(TotalComponents); 12876 for (unsigned i = 0; i < TotalComponents; ++i) { 12877 Expr *AssociatedExpr = Record.readSubExpr(); 12878 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12879 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12880 /*IsNonContiguous=*/false); 12881 } 12882 C->setComponents(Components, ListSizes); 12883 } 12884 12885 void OMPClauseReader::VisitOMPHasDeviceAddrClause(OMPHasDeviceAddrClause *C) { 12886 C->setLParenLoc(Record.readSourceLocation()); 12887 auto NumVars = C->varlist_size(); 12888 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12889 auto TotalLists = C->getTotalComponentListNum(); 12890 auto TotalComponents = C->getTotalComponentsNum(); 12891 12892 SmallVector<Expr *, 16> Vars; 12893 Vars.reserve(NumVars); 12894 for (unsigned I = 0; I != NumVars; ++I) 12895 Vars.push_back(Record.readSubExpr()); 12896 C->setVarRefs(Vars); 12897 Vars.clear(); 12898 12899 SmallVector<ValueDecl *, 16> Decls; 12900 Decls.reserve(UniqueDecls); 12901 for (unsigned I = 0; I < UniqueDecls; ++I) 12902 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12903 C->setUniqueDecls(Decls); 12904 12905 SmallVector<unsigned, 16> ListsPerDecl; 12906 ListsPerDecl.reserve(UniqueDecls); 12907 for (unsigned I = 0; I < UniqueDecls; ++I) 12908 ListsPerDecl.push_back(Record.readInt()); 12909 C->setDeclNumLists(ListsPerDecl); 12910 12911 SmallVector<unsigned, 32> ListSizes; 12912 ListSizes.reserve(TotalLists); 12913 for (unsigned i = 0; i < TotalLists; ++i) 12914 ListSizes.push_back(Record.readInt()); 12915 C->setComponentListSizes(ListSizes); 12916 12917 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12918 Components.reserve(TotalComponents); 12919 for (unsigned I = 0; I < TotalComponents; ++I) { 12920 Expr *AssociatedExpr = Record.readSubExpr(); 12921 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12922 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12923 /*IsNonContiguous=*/false); 12924 } 12925 C->setComponents(Components, ListSizes); 12926 } 12927 12928 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12929 C->setLParenLoc(Record.readSourceLocation()); 12930 unsigned NumVars = C->varlist_size(); 12931 SmallVector<Expr *, 16> Vars; 12932 Vars.reserve(NumVars); 12933 for (unsigned i = 0; i != NumVars; ++i) 12934 Vars.push_back(Record.readSubExpr()); 12935 C->setVarRefs(Vars); 12936 Vars.clear(); 12937 Vars.reserve(NumVars); 12938 for (unsigned i = 0; i != NumVars; ++i) 12939 Vars.push_back(Record.readSubExpr()); 12940 C->setPrivateRefs(Vars); 12941 } 12942 12943 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12944 C->setLParenLoc(Record.readSourceLocation()); 12945 unsigned NumVars = C->varlist_size(); 12946 SmallVector<Expr *, 16> Vars; 12947 Vars.reserve(NumVars); 12948 for (unsigned i = 0; i != NumVars; ++i) 12949 Vars.push_back(Record.readSubExpr()); 12950 C->setVarRefs(Vars); 12951 } 12952 12953 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12954 C->setLParenLoc(Record.readSourceLocation()); 12955 unsigned NumVars = C->varlist_size(); 12956 SmallVector<Expr *, 16> Vars; 12957 Vars.reserve(NumVars); 12958 for (unsigned i = 0; i != NumVars; ++i) 12959 Vars.push_back(Record.readSubExpr()); 12960 C->setVarRefs(Vars); 12961 } 12962 12963 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12964 C->setLParenLoc(Record.readSourceLocation()); 12965 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12966 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12967 Data.reserve(NumOfAllocators); 12968 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12969 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12970 D.Allocator = Record.readSubExpr(); 12971 D.AllocatorTraits = Record.readSubExpr(); 12972 D.LParenLoc = Record.readSourceLocation(); 12973 D.RParenLoc = Record.readSourceLocation(); 12974 } 12975 C->setAllocatorsData(Data); 12976 } 12977 12978 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12979 C->setLParenLoc(Record.readSourceLocation()); 12980 C->setModifier(Record.readSubExpr()); 12981 C->setColonLoc(Record.readSourceLocation()); 12982 unsigned NumOfLocators = C->varlist_size(); 12983 SmallVector<Expr *, 4> Locators; 12984 Locators.reserve(NumOfLocators); 12985 for (unsigned I = 0; I != NumOfLocators; ++I) 12986 Locators.push_back(Record.readSubExpr()); 12987 C->setVarRefs(Locators); 12988 } 12989 12990 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12991 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12992 C->setLParenLoc(Record.readSourceLocation()); 12993 C->setKindKwLoc(Record.readSourceLocation()); 12994 } 12995 12996 void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) { 12997 VisitOMPClauseWithPreInit(C); 12998 C->setThreadID(Record.readSubExpr()); 12999 C->setLParenLoc(Record.readSourceLocation()); 13000 } 13001 13002 void OMPClauseReader::VisitOMPBindClause(OMPBindClause *C) { 13003 C->setBindKind(Record.readEnum<OpenMPBindClauseKind>()); 13004 C->setLParenLoc(Record.readSourceLocation()); 13005 C->setBindKindLoc(Record.readSourceLocation()); 13006 } 13007 13008 void OMPClauseReader::VisitOMPAlignClause(OMPAlignClause *C) { 13009 C->setAlignment(Record.readExpr()); 13010 C->setLParenLoc(Record.readSourceLocation()); 13011 } 13012 13013 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 13014 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 13015 TI.Sets.resize(readUInt32()); 13016 for (auto &Set : TI.Sets) { 13017 Set.Kind = readEnum<llvm::omp::TraitSet>(); 13018 Set.Selectors.resize(readUInt32()); 13019 for (auto &Selector : Set.Selectors) { 13020 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 13021 Selector.ScoreOrCondition = nullptr; 13022 if (readBool()) 13023 Selector.ScoreOrCondition = readExprRef(); 13024 Selector.Properties.resize(readUInt32()); 13025 for (auto &Property : Selector.Properties) 13026 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 13027 } 13028 } 13029 return &TI; 13030 } 13031 13032 void ASTRecordReader::readOMPChildren(OMPChildren *Data) { 13033 if (!Data) 13034 return; 13035 if (Reader->ReadingKind == ASTReader::Read_Stmt) { 13036 // Skip NumClauses, NumChildren and HasAssociatedStmt fields. 13037 skipInts(3); 13038 } 13039 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses()); 13040 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I) 13041 Clauses[I] = readOMPClause(); 13042 Data->setClauses(Clauses); 13043 if (Data->hasAssociatedStmt()) 13044 Data->setAssociatedStmt(readStmt()); 13045 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I) 13046 Data->getChildren()[I] = readStmt(); 13047 } 13048