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 "clang/Basic/OpenMPKinds.h" 14 #include "clang/Serialization/ASTRecordReader.h" 15 #include "ASTCommon.h" 16 #include "ASTReaderInternals.h" 17 #include "clang/AST/AbstractTypeReader.h" 18 #include "clang/AST/ASTConsumer.h" 19 #include "clang/AST/ASTContext.h" 20 #include "clang/AST/ASTMutationListener.h" 21 #include "clang/AST/ASTUnresolvedSet.h" 22 #include "clang/AST/Decl.h" 23 #include "clang/AST/DeclBase.h" 24 #include "clang/AST/DeclCXX.h" 25 #include "clang/AST/DeclFriend.h" 26 #include "clang/AST/DeclGroup.h" 27 #include "clang/AST/DeclObjC.h" 28 #include "clang/AST/DeclTemplate.h" 29 #include "clang/AST/DeclarationName.h" 30 #include "clang/AST/Expr.h" 31 #include "clang/AST/ExprCXX.h" 32 #include "clang/AST/ExternalASTSource.h" 33 #include "clang/AST/NestedNameSpecifier.h" 34 #include "clang/AST/OpenMPClause.h" 35 #include "clang/AST/ODRHash.h" 36 #include "clang/AST/RawCommentList.h" 37 #include "clang/AST/TemplateBase.h" 38 #include "clang/AST/TemplateName.h" 39 #include "clang/AST/Type.h" 40 #include "clang/AST/TypeLoc.h" 41 #include "clang/AST/TypeLocVisitor.h" 42 #include "clang/AST/UnresolvedSet.h" 43 #include "clang/Basic/CommentOptions.h" 44 #include "clang/Basic/Diagnostic.h" 45 #include "clang/Basic/DiagnosticOptions.h" 46 #include "clang/Basic/ExceptionSpecificationType.h" 47 #include "clang/Basic/FileManager.h" 48 #include "clang/Basic/FileSystemOptions.h" 49 #include "clang/Basic/IdentifierTable.h" 50 #include "clang/Basic/LLVM.h" 51 #include "clang/Basic/LangOptions.h" 52 #include "clang/Basic/Module.h" 53 #include "clang/Basic/ObjCRuntime.h" 54 #include "clang/Basic/OperatorKinds.h" 55 #include "clang/Basic/PragmaKinds.h" 56 #include "clang/Basic/Sanitizers.h" 57 #include "clang/Basic/SourceLocation.h" 58 #include "clang/Basic/SourceManager.h" 59 #include "clang/Basic/SourceManagerInternals.h" 60 #include "clang/Basic/Specifiers.h" 61 #include "clang/Basic/TargetInfo.h" 62 #include "clang/Basic/TargetOptions.h" 63 #include "clang/Basic/TokenKinds.h" 64 #include "clang/Basic/Version.h" 65 #include "clang/Lex/HeaderSearch.h" 66 #include "clang/Lex/HeaderSearchOptions.h" 67 #include "clang/Lex/MacroInfo.h" 68 #include "clang/Lex/ModuleMap.h" 69 #include "clang/Lex/PreprocessingRecord.h" 70 #include "clang/Lex/Preprocessor.h" 71 #include "clang/Lex/PreprocessorOptions.h" 72 #include "clang/Lex/Token.h" 73 #include "clang/Sema/ObjCMethodList.h" 74 #include "clang/Sema/Scope.h" 75 #include "clang/Sema/Sema.h" 76 #include "clang/Sema/Weak.h" 77 #include "clang/Serialization/ASTBitCodes.h" 78 #include "clang/Serialization/ASTDeserializationListener.h" 79 #include "clang/Serialization/ContinuousRangeMap.h" 80 #include "clang/Serialization/GlobalModuleIndex.h" 81 #include "clang/Serialization/InMemoryModuleCache.h" 82 #include "clang/Serialization/ModuleFile.h" 83 #include "clang/Serialization/ModuleFileExtension.h" 84 #include "clang/Serialization/ModuleManager.h" 85 #include "clang/Serialization/PCHContainerOperations.h" 86 #include "clang/Serialization/SerializationDiagnostic.h" 87 #include "llvm/ADT/APFloat.h" 88 #include "llvm/ADT/APInt.h" 89 #include "llvm/ADT/APSInt.h" 90 #include "llvm/ADT/ArrayRef.h" 91 #include "llvm/ADT/DenseMap.h" 92 #include "llvm/ADT/FloatingPointMode.h" 93 #include "llvm/ADT/FoldingSet.h" 94 #include "llvm/ADT/Hashing.h" 95 #include "llvm/ADT/IntrusiveRefCntPtr.h" 96 #include "llvm/ADT/None.h" 97 #include "llvm/ADT/Optional.h" 98 #include "llvm/ADT/STLExtras.h" 99 #include "llvm/ADT/ScopeExit.h" 100 #include "llvm/ADT/SmallPtrSet.h" 101 #include "llvm/ADT/SmallString.h" 102 #include "llvm/ADT/SmallVector.h" 103 #include "llvm/ADT/StringExtras.h" 104 #include "llvm/ADT/StringMap.h" 105 #include "llvm/ADT/StringRef.h" 106 #include "llvm/ADT/Triple.h" 107 #include "llvm/ADT/iterator_range.h" 108 #include "llvm/Bitstream/BitstreamReader.h" 109 #include "llvm/Support/Casting.h" 110 #include "llvm/Support/Compiler.h" 111 #include "llvm/Support/Compression.h" 112 #include "llvm/Support/DJB.h" 113 #include "llvm/Support/Endian.h" 114 #include "llvm/Support/Error.h" 115 #include "llvm/Support/ErrorHandling.h" 116 #include "llvm/Support/FileSystem.h" 117 #include "llvm/Support/LEB128.h" 118 #include "llvm/Support/MemoryBuffer.h" 119 #include "llvm/Support/Path.h" 120 #include "llvm/Support/SaveAndRestore.h" 121 #include "llvm/Support/Timer.h" 122 #include "llvm/Support/VersionTuple.h" 123 #include "llvm/Support/raw_ostream.h" 124 #include <algorithm> 125 #include <cassert> 126 #include <cstddef> 127 #include <cstdint> 128 #include <cstdio> 129 #include <ctime> 130 #include <iterator> 131 #include <limits> 132 #include <map> 133 #include <memory> 134 #include <string> 135 #include <system_error> 136 #include <tuple> 137 #include <utility> 138 #include <vector> 139 140 using namespace clang; 141 using namespace clang::serialization; 142 using namespace clang::serialization::reader; 143 using llvm::BitstreamCursor; 144 using llvm::RoundingMode; 145 146 //===----------------------------------------------------------------------===// 147 // ChainedASTReaderListener implementation 148 //===----------------------------------------------------------------------===// 149 150 bool 151 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 152 return First->ReadFullVersionInformation(FullVersion) || 153 Second->ReadFullVersionInformation(FullVersion); 154 } 155 156 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 157 First->ReadModuleName(ModuleName); 158 Second->ReadModuleName(ModuleName); 159 } 160 161 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 162 First->ReadModuleMapFile(ModuleMapPath); 163 Second->ReadModuleMapFile(ModuleMapPath); 164 } 165 166 bool 167 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 168 bool Complain, 169 bool AllowCompatibleDifferences) { 170 return First->ReadLanguageOptions(LangOpts, Complain, 171 AllowCompatibleDifferences) || 172 Second->ReadLanguageOptions(LangOpts, Complain, 173 AllowCompatibleDifferences); 174 } 175 176 bool ChainedASTReaderListener::ReadTargetOptions( 177 const TargetOptions &TargetOpts, bool Complain, 178 bool AllowCompatibleDifferences) { 179 return First->ReadTargetOptions(TargetOpts, Complain, 180 AllowCompatibleDifferences) || 181 Second->ReadTargetOptions(TargetOpts, Complain, 182 AllowCompatibleDifferences); 183 } 184 185 bool ChainedASTReaderListener::ReadDiagnosticOptions( 186 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 187 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 188 Second->ReadDiagnosticOptions(DiagOpts, Complain); 189 } 190 191 bool 192 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 193 bool Complain) { 194 return First->ReadFileSystemOptions(FSOpts, Complain) || 195 Second->ReadFileSystemOptions(FSOpts, Complain); 196 } 197 198 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 199 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 200 bool Complain) { 201 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 202 Complain) || 203 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 204 Complain); 205 } 206 207 bool ChainedASTReaderListener::ReadPreprocessorOptions( 208 const PreprocessorOptions &PPOpts, bool Complain, 209 std::string &SuggestedPredefines) { 210 return First->ReadPreprocessorOptions(PPOpts, Complain, 211 SuggestedPredefines) || 212 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 213 } 214 215 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 216 unsigned Value) { 217 First->ReadCounter(M, Value); 218 Second->ReadCounter(M, Value); 219 } 220 221 bool ChainedASTReaderListener::needsInputFileVisitation() { 222 return First->needsInputFileVisitation() || 223 Second->needsInputFileVisitation(); 224 } 225 226 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 227 return First->needsSystemInputFileVisitation() || 228 Second->needsSystemInputFileVisitation(); 229 } 230 231 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 232 ModuleKind Kind) { 233 First->visitModuleFile(Filename, Kind); 234 Second->visitModuleFile(Filename, Kind); 235 } 236 237 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 238 bool isSystem, 239 bool isOverridden, 240 bool isExplicitModule) { 241 bool Continue = false; 242 if (First->needsInputFileVisitation() && 243 (!isSystem || First->needsSystemInputFileVisitation())) 244 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 245 isExplicitModule); 246 if (Second->needsInputFileVisitation() && 247 (!isSystem || Second->needsSystemInputFileVisitation())) 248 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 249 isExplicitModule); 250 return Continue; 251 } 252 253 void ChainedASTReaderListener::readModuleFileExtension( 254 const ModuleFileExtensionMetadata &Metadata) { 255 First->readModuleFileExtension(Metadata); 256 Second->readModuleFileExtension(Metadata); 257 } 258 259 //===----------------------------------------------------------------------===// 260 // PCH validator implementation 261 //===----------------------------------------------------------------------===// 262 263 ASTReaderListener::~ASTReaderListener() = default; 264 265 /// Compare the given set of language options against an existing set of 266 /// language options. 267 /// 268 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 269 /// \param AllowCompatibleDifferences If true, differences between compatible 270 /// language options will be permitted. 271 /// 272 /// \returns true if the languagae options mis-match, false otherwise. 273 static bool checkLanguageOptions(const LangOptions &LangOpts, 274 const LangOptions &ExistingLangOpts, 275 DiagnosticsEngine *Diags, 276 bool AllowCompatibleDifferences = true) { 277 #define LANGOPT(Name, Bits, Default, Description) \ 278 if (ExistingLangOpts.Name != LangOpts.Name) { \ 279 if (Diags) \ 280 Diags->Report(diag::err_pch_langopt_mismatch) \ 281 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 282 return true; \ 283 } 284 285 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 286 if (ExistingLangOpts.Name != LangOpts.Name) { \ 287 if (Diags) \ 288 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 289 << Description; \ 290 return true; \ 291 } 292 293 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 294 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 295 if (Diags) \ 296 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 297 << Description; \ 298 return true; \ 299 } 300 301 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 302 if (!AllowCompatibleDifferences) \ 303 LANGOPT(Name, Bits, Default, Description) 304 305 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 306 if (!AllowCompatibleDifferences) \ 307 ENUM_LANGOPT(Name, Bits, Default, Description) 308 309 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 310 if (!AllowCompatibleDifferences) \ 311 VALUE_LANGOPT(Name, Bits, Default, Description) 312 313 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 314 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 315 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) 316 #include "clang/Basic/LangOptions.def" 317 318 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 319 if (Diags) 320 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 321 return true; 322 } 323 324 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 325 if (Diags) 326 Diags->Report(diag::err_pch_langopt_value_mismatch) 327 << "target Objective-C runtime"; 328 return true; 329 } 330 331 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 332 LangOpts.CommentOpts.BlockCommandNames) { 333 if (Diags) 334 Diags->Report(diag::err_pch_langopt_value_mismatch) 335 << "block command names"; 336 return true; 337 } 338 339 // Sanitizer feature mismatches are treated as compatible differences. If 340 // compatible differences aren't allowed, we still only want to check for 341 // mismatches of non-modular sanitizers (the only ones which can affect AST 342 // generation). 343 if (!AllowCompatibleDifferences) { 344 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 345 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 346 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 347 ExistingSanitizers.clear(ModularSanitizers); 348 ImportedSanitizers.clear(ModularSanitizers); 349 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 350 const std::string Flag = "-fsanitize="; 351 if (Diags) { 352 #define SANITIZER(NAME, ID) \ 353 { \ 354 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 355 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 356 if (InExistingModule != InImportedModule) \ 357 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 358 << InExistingModule << (Flag + NAME); \ 359 } 360 #include "clang/Basic/Sanitizers.def" 361 } 362 return true; 363 } 364 } 365 366 return false; 367 } 368 369 /// Compare the given set of target options against an existing set of 370 /// target options. 371 /// 372 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 373 /// 374 /// \returns true if the target options mis-match, false otherwise. 375 static bool checkTargetOptions(const TargetOptions &TargetOpts, 376 const TargetOptions &ExistingTargetOpts, 377 DiagnosticsEngine *Diags, 378 bool AllowCompatibleDifferences = true) { 379 #define CHECK_TARGET_OPT(Field, Name) \ 380 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 381 if (Diags) \ 382 Diags->Report(diag::err_pch_targetopt_mismatch) \ 383 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 384 return true; \ 385 } 386 387 // The triple and ABI must match exactly. 388 CHECK_TARGET_OPT(Triple, "target"); 389 CHECK_TARGET_OPT(ABI, "target ABI"); 390 391 // We can tolerate different CPUs in many cases, notably when one CPU 392 // supports a strict superset of another. When allowing compatible 393 // differences skip this check. 394 if (!AllowCompatibleDifferences) { 395 CHECK_TARGET_OPT(CPU, "target CPU"); 396 CHECK_TARGET_OPT(TuneCPU, "tune CPU"); 397 } 398 399 #undef CHECK_TARGET_OPT 400 401 // Compare feature sets. 402 SmallVector<StringRef, 4> ExistingFeatures( 403 ExistingTargetOpts.FeaturesAsWritten.begin(), 404 ExistingTargetOpts.FeaturesAsWritten.end()); 405 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 406 TargetOpts.FeaturesAsWritten.end()); 407 llvm::sort(ExistingFeatures); 408 llvm::sort(ReadFeatures); 409 410 // We compute the set difference in both directions explicitly so that we can 411 // diagnose the differences differently. 412 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 413 std::set_difference( 414 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 415 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 416 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 417 ExistingFeatures.begin(), ExistingFeatures.end(), 418 std::back_inserter(UnmatchedReadFeatures)); 419 420 // If we are allowing compatible differences and the read feature set is 421 // a strict subset of the existing feature set, there is nothing to diagnose. 422 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 423 return false; 424 425 if (Diags) { 426 for (StringRef Feature : UnmatchedReadFeatures) 427 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 428 << /* is-existing-feature */ false << Feature; 429 for (StringRef Feature : UnmatchedExistingFeatures) 430 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 431 << /* is-existing-feature */ true << Feature; 432 } 433 434 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 435 } 436 437 bool 438 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 439 bool Complain, 440 bool AllowCompatibleDifferences) { 441 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 442 return checkLanguageOptions(LangOpts, ExistingLangOpts, 443 Complain ? &Reader.Diags : nullptr, 444 AllowCompatibleDifferences); 445 } 446 447 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 448 bool Complain, 449 bool AllowCompatibleDifferences) { 450 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 451 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 452 Complain ? &Reader.Diags : nullptr, 453 AllowCompatibleDifferences); 454 } 455 456 namespace { 457 458 using MacroDefinitionsMap = 459 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 460 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 461 462 } // namespace 463 464 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 465 DiagnosticsEngine &Diags, 466 bool Complain) { 467 using Level = DiagnosticsEngine::Level; 468 469 // Check current mappings for new -Werror mappings, and the stored mappings 470 // for cases that were explicitly mapped to *not* be errors that are now 471 // errors because of options like -Werror. 472 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 473 474 for (DiagnosticsEngine *MappingSource : MappingSources) { 475 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 476 diag::kind DiagID = DiagIDMappingPair.first; 477 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 478 if (CurLevel < DiagnosticsEngine::Error) 479 continue; // not significant 480 Level StoredLevel = 481 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 482 if (StoredLevel < DiagnosticsEngine::Error) { 483 if (Complain) 484 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 485 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 486 return true; 487 } 488 } 489 } 490 491 return false; 492 } 493 494 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 495 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 496 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 497 return true; 498 return Ext >= diag::Severity::Error; 499 } 500 501 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 502 DiagnosticsEngine &Diags, 503 bool IsSystem, bool Complain) { 504 // Top-level options 505 if (IsSystem) { 506 if (Diags.getSuppressSystemWarnings()) 507 return false; 508 // If -Wsystem-headers was not enabled before, be conservative 509 if (StoredDiags.getSuppressSystemWarnings()) { 510 if (Complain) 511 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 512 return true; 513 } 514 } 515 516 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 517 if (Complain) 518 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 519 return true; 520 } 521 522 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 523 !StoredDiags.getEnableAllWarnings()) { 524 if (Complain) 525 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 526 return true; 527 } 528 529 if (isExtHandlingFromDiagsError(Diags) && 530 !isExtHandlingFromDiagsError(StoredDiags)) { 531 if (Complain) 532 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 533 return true; 534 } 535 536 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 537 } 538 539 /// Return the top import module if it is implicit, nullptr otherwise. 540 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 541 Preprocessor &PP) { 542 // If the original import came from a file explicitly generated by the user, 543 // don't check the diagnostic mappings. 544 // FIXME: currently this is approximated by checking whether this is not a 545 // module import of an implicitly-loaded module file. 546 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 547 // the transitive closure of its imports, since unrelated modules cannot be 548 // imported until after this module finishes validation. 549 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 550 while (!TopImport->ImportedBy.empty()) 551 TopImport = TopImport->ImportedBy[0]; 552 if (TopImport->Kind != MK_ImplicitModule) 553 return nullptr; 554 555 StringRef ModuleName = TopImport->ModuleName; 556 assert(!ModuleName.empty() && "diagnostic options read before module name"); 557 558 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName); 559 assert(M && "missing module"); 560 return M; 561 } 562 563 bool PCHValidator::ReadDiagnosticOptions( 564 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 565 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 566 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 567 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 568 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 569 // This should never fail, because we would have processed these options 570 // before writing them to an ASTFile. 571 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 572 573 ModuleManager &ModuleMgr = Reader.getModuleManager(); 574 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 575 576 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 577 if (!TopM) 578 return false; 579 580 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 581 // contains the union of their flags. 582 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 583 Complain); 584 } 585 586 /// Collect the macro definitions provided by the given preprocessor 587 /// options. 588 static void 589 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 590 MacroDefinitionsMap &Macros, 591 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 592 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 593 StringRef Macro = PPOpts.Macros[I].first; 594 bool IsUndef = PPOpts.Macros[I].second; 595 596 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 597 StringRef MacroName = MacroPair.first; 598 StringRef MacroBody = MacroPair.second; 599 600 // For an #undef'd macro, we only care about the name. 601 if (IsUndef) { 602 if (MacroNames && !Macros.count(MacroName)) 603 MacroNames->push_back(MacroName); 604 605 Macros[MacroName] = std::make_pair("", true); 606 continue; 607 } 608 609 // For a #define'd macro, figure out the actual definition. 610 if (MacroName.size() == Macro.size()) 611 MacroBody = "1"; 612 else { 613 // Note: GCC drops anything following an end-of-line character. 614 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 615 MacroBody = MacroBody.substr(0, End); 616 } 617 618 if (MacroNames && !Macros.count(MacroName)) 619 MacroNames->push_back(MacroName); 620 Macros[MacroName] = std::make_pair(MacroBody, false); 621 } 622 } 623 624 /// Check the preprocessor options deserialized from the control block 625 /// against the preprocessor options in an existing preprocessor. 626 /// 627 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 628 /// \param Validate If true, validate preprocessor options. If false, allow 629 /// macros defined by \p ExistingPPOpts to override those defined by 630 /// \p PPOpts in SuggestedPredefines. 631 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 632 const PreprocessorOptions &ExistingPPOpts, 633 DiagnosticsEngine *Diags, 634 FileManager &FileMgr, 635 std::string &SuggestedPredefines, 636 const LangOptions &LangOpts, 637 bool Validate = true) { 638 // Check macro definitions. 639 MacroDefinitionsMap ASTFileMacros; 640 collectMacroDefinitions(PPOpts, ASTFileMacros); 641 MacroDefinitionsMap ExistingMacros; 642 SmallVector<StringRef, 4> ExistingMacroNames; 643 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 644 645 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 646 // Dig out the macro definition in the existing preprocessor options. 647 StringRef MacroName = ExistingMacroNames[I]; 648 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 649 650 // Check whether we know anything about this macro name or not. 651 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 652 ASTFileMacros.find(MacroName); 653 if (!Validate || Known == ASTFileMacros.end()) { 654 // FIXME: Check whether this identifier was referenced anywhere in the 655 // AST file. If so, we should reject the AST file. Unfortunately, this 656 // information isn't in the control block. What shall we do about it? 657 658 if (Existing.second) { 659 SuggestedPredefines += "#undef "; 660 SuggestedPredefines += MacroName.str(); 661 SuggestedPredefines += '\n'; 662 } else { 663 SuggestedPredefines += "#define "; 664 SuggestedPredefines += MacroName.str(); 665 SuggestedPredefines += ' '; 666 SuggestedPredefines += Existing.first.str(); 667 SuggestedPredefines += '\n'; 668 } 669 continue; 670 } 671 672 // If the macro was defined in one but undef'd in the other, we have a 673 // conflict. 674 if (Existing.second != Known->second.second) { 675 if (Diags) { 676 Diags->Report(diag::err_pch_macro_def_undef) 677 << MacroName << Known->second.second; 678 } 679 return true; 680 } 681 682 // If the macro was #undef'd in both, or if the macro bodies are identical, 683 // it's fine. 684 if (Existing.second || Existing.first == Known->second.first) 685 continue; 686 687 // The macro bodies differ; complain. 688 if (Diags) { 689 Diags->Report(diag::err_pch_macro_def_conflict) 690 << MacroName << Known->second.first << Existing.first; 691 } 692 return true; 693 } 694 695 // Check whether we're using predefines. 696 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 697 if (Diags) { 698 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 699 } 700 return true; 701 } 702 703 // Detailed record is important since it is used for the module cache hash. 704 if (LangOpts.Modules && 705 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 706 if (Diags) { 707 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 708 } 709 return true; 710 } 711 712 // Compute the #include and #include_macros lines we need. 713 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 714 StringRef File = ExistingPPOpts.Includes[I]; 715 716 if (!ExistingPPOpts.ImplicitPCHInclude.empty() && 717 !ExistingPPOpts.PCHThroughHeader.empty()) { 718 // In case the through header is an include, we must add all the includes 719 // to the predefines so the start point can be determined. 720 SuggestedPredefines += "#include \""; 721 SuggestedPredefines += File; 722 SuggestedPredefines += "\"\n"; 723 continue; 724 } 725 726 if (File == ExistingPPOpts.ImplicitPCHInclude) 727 continue; 728 729 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 730 != PPOpts.Includes.end()) 731 continue; 732 733 SuggestedPredefines += "#include \""; 734 SuggestedPredefines += File; 735 SuggestedPredefines += "\"\n"; 736 } 737 738 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 739 StringRef File = ExistingPPOpts.MacroIncludes[I]; 740 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 741 File) 742 != PPOpts.MacroIncludes.end()) 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 Error(toString(std::move(Err))); 1267 } 1268 1269 //===----------------------------------------------------------------------===// 1270 // Source Manager Deserialization 1271 //===----------------------------------------------------------------------===// 1272 1273 /// Read the line table in the source manager block. 1274 /// \returns true if there was an error. 1275 bool ASTReader::ParseLineTable(ModuleFile &F, 1276 const RecordData &Record) { 1277 unsigned Idx = 0; 1278 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1279 1280 // Parse the file names 1281 std::map<int, int> FileIDs; 1282 FileIDs[-1] = -1; // For unspecified filenames. 1283 for (unsigned I = 0; Record[Idx]; ++I) { 1284 // Extract the file name 1285 auto Filename = ReadPath(F, Record, Idx); 1286 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1287 } 1288 ++Idx; 1289 1290 // Parse the line entries 1291 std::vector<LineEntry> Entries; 1292 while (Idx < Record.size()) { 1293 int FID = Record[Idx++]; 1294 assert(FID >= 0 && "Serialized line entries for non-local file."); 1295 // Remap FileID from 1-based old view. 1296 FID += F.SLocEntryBaseID - 1; 1297 1298 // Extract the line entries 1299 unsigned NumEntries = Record[Idx++]; 1300 assert(NumEntries && "no line entries for file ID"); 1301 Entries.clear(); 1302 Entries.reserve(NumEntries); 1303 for (unsigned I = 0; I != NumEntries; ++I) { 1304 unsigned FileOffset = Record[Idx++]; 1305 unsigned LineNo = Record[Idx++]; 1306 int FilenameID = FileIDs[Record[Idx++]]; 1307 SrcMgr::CharacteristicKind FileKind 1308 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1309 unsigned IncludeOffset = Record[Idx++]; 1310 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1311 FileKind, IncludeOffset)); 1312 } 1313 LineTable.AddEntry(FileID::get(FID), Entries); 1314 } 1315 1316 return false; 1317 } 1318 1319 /// Read a source manager block 1320 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1321 using namespace SrcMgr; 1322 1323 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1324 1325 // Set the source-location entry cursor to the current position in 1326 // the stream. This cursor will be used to read the contents of the 1327 // source manager block initially, and then lazily read 1328 // source-location entries as needed. 1329 SLocEntryCursor = F.Stream; 1330 1331 // The stream itself is going to skip over the source manager block. 1332 if (llvm::Error Err = F.Stream.SkipBlock()) { 1333 Error(std::move(Err)); 1334 return true; 1335 } 1336 1337 // Enter the source manager block. 1338 if (llvm::Error Err = 1339 SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 1340 Error(std::move(Err)); 1341 return true; 1342 } 1343 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo(); 1344 1345 RecordData Record; 1346 while (true) { 1347 Expected<llvm::BitstreamEntry> MaybeE = 1348 SLocEntryCursor.advanceSkippingSubblocks(); 1349 if (!MaybeE) { 1350 Error(MaybeE.takeError()); 1351 return true; 1352 } 1353 llvm::BitstreamEntry E = MaybeE.get(); 1354 1355 switch (E.Kind) { 1356 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1357 case llvm::BitstreamEntry::Error: 1358 Error("malformed block record in AST file"); 1359 return true; 1360 case llvm::BitstreamEntry::EndBlock: 1361 return false; 1362 case llvm::BitstreamEntry::Record: 1363 // The interesting case. 1364 break; 1365 } 1366 1367 // Read a record. 1368 Record.clear(); 1369 StringRef Blob; 1370 Expected<unsigned> MaybeRecord = 1371 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1372 if (!MaybeRecord) { 1373 Error(MaybeRecord.takeError()); 1374 return true; 1375 } 1376 switch (MaybeRecord.get()) { 1377 default: // Default behavior: ignore. 1378 break; 1379 1380 case SM_SLOC_FILE_ENTRY: 1381 case SM_SLOC_BUFFER_ENTRY: 1382 case SM_SLOC_EXPANSION_ENTRY: 1383 // Once we hit one of the source location entries, we're done. 1384 return false; 1385 } 1386 } 1387 } 1388 1389 /// If a header file is not found at the path that we expect it to be 1390 /// and the PCH file was moved from its original location, try to resolve the 1391 /// file by assuming that header+PCH were moved together and the header is in 1392 /// the same place relative to the PCH. 1393 static std::string 1394 resolveFileRelativeToOriginalDir(const std::string &Filename, 1395 const std::string &OriginalDir, 1396 const std::string &CurrDir) { 1397 assert(OriginalDir != CurrDir && 1398 "No point trying to resolve the file if the PCH dir didn't change"); 1399 1400 using namespace llvm::sys; 1401 1402 SmallString<128> filePath(Filename); 1403 fs::make_absolute(filePath); 1404 assert(path::is_absolute(OriginalDir)); 1405 SmallString<128> currPCHPath(CurrDir); 1406 1407 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1408 fileDirE = path::end(path::parent_path(filePath)); 1409 path::const_iterator origDirI = path::begin(OriginalDir), 1410 origDirE = path::end(OriginalDir); 1411 // Skip the common path components from filePath and OriginalDir. 1412 while (fileDirI != fileDirE && origDirI != origDirE && 1413 *fileDirI == *origDirI) { 1414 ++fileDirI; 1415 ++origDirI; 1416 } 1417 for (; origDirI != origDirE; ++origDirI) 1418 path::append(currPCHPath, ".."); 1419 path::append(currPCHPath, fileDirI, fileDirE); 1420 path::append(currPCHPath, path::filename(Filename)); 1421 return std::string(currPCHPath.str()); 1422 } 1423 1424 bool ASTReader::ReadSLocEntry(int ID) { 1425 if (ID == 0) 1426 return false; 1427 1428 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1429 Error("source location entry ID out-of-range for AST file"); 1430 return true; 1431 } 1432 1433 // Local helper to read the (possibly-compressed) buffer data following the 1434 // entry record. 1435 auto ReadBuffer = [this]( 1436 BitstreamCursor &SLocEntryCursor, 1437 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1438 RecordData Record; 1439 StringRef Blob; 1440 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1441 if (!MaybeCode) { 1442 Error(MaybeCode.takeError()); 1443 return nullptr; 1444 } 1445 unsigned Code = MaybeCode.get(); 1446 1447 Expected<unsigned> MaybeRecCode = 1448 SLocEntryCursor.readRecord(Code, Record, &Blob); 1449 if (!MaybeRecCode) { 1450 Error(MaybeRecCode.takeError()); 1451 return nullptr; 1452 } 1453 unsigned RecCode = MaybeRecCode.get(); 1454 1455 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1456 if (!llvm::zlib::isAvailable()) { 1457 Error("zlib is not available"); 1458 return nullptr; 1459 } 1460 SmallString<0> Uncompressed; 1461 if (llvm::Error E = 1462 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1463 Error("could not decompress embedded file contents: " + 1464 llvm::toString(std::move(E))); 1465 return nullptr; 1466 } 1467 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1468 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1469 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1470 } else { 1471 Error("AST record has invalid code"); 1472 return nullptr; 1473 } 1474 }; 1475 1476 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1477 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1478 F->SLocEntryOffsetsBase + 1479 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1480 Error(std::move(Err)); 1481 return true; 1482 } 1483 1484 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1485 SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset; 1486 1487 ++NumSLocEntriesRead; 1488 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1489 if (!MaybeEntry) { 1490 Error(MaybeEntry.takeError()); 1491 return true; 1492 } 1493 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1494 1495 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1496 Error("incorrectly-formatted source location entry in AST file"); 1497 return true; 1498 } 1499 1500 RecordData Record; 1501 StringRef Blob; 1502 Expected<unsigned> MaybeSLOC = 1503 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1504 if (!MaybeSLOC) { 1505 Error(MaybeSLOC.takeError()); 1506 return true; 1507 } 1508 switch (MaybeSLOC.get()) { 1509 default: 1510 Error("incorrectly-formatted source location entry in AST file"); 1511 return true; 1512 1513 case SM_SLOC_FILE_ENTRY: { 1514 // We will detect whether a file changed and return 'Failure' for it, but 1515 // we will also try to fail gracefully by setting up the SLocEntry. 1516 unsigned InputID = Record[4]; 1517 InputFile IF = getInputFile(*F, InputID); 1518 Optional<FileEntryRef> File = IF.getFile(); 1519 bool OverriddenBuffer = IF.isOverridden(); 1520 1521 // Note that we only check if a File was returned. If it was out-of-date 1522 // we have complained but we will continue creating a FileID to recover 1523 // gracefully. 1524 if (!File) 1525 return true; 1526 1527 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1528 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1529 // This is the module's main file. 1530 IncludeLoc = getImportLocation(F); 1531 } 1532 SrcMgr::CharacteristicKind 1533 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1534 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID, 1535 BaseOffset + Record[0]); 1536 SrcMgr::FileInfo &FileInfo = 1537 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1538 FileInfo.NumCreatedFIDs = Record[5]; 1539 if (Record[3]) 1540 FileInfo.setHasLineDirectives(); 1541 1542 unsigned NumFileDecls = Record[7]; 1543 if (NumFileDecls && ContextObj) { 1544 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1545 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1546 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1547 NumFileDecls)); 1548 } 1549 1550 const SrcMgr::ContentCache &ContentCache = 1551 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter)); 1552 if (OverriddenBuffer && !ContentCache.BufferOverridden && 1553 ContentCache.ContentsEntry == ContentCache.OrigEntry && 1554 !ContentCache.getBufferIfLoaded()) { 1555 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1556 if (!Buffer) 1557 return true; 1558 SourceMgr.overrideFileContents(*File, std::move(Buffer)); 1559 } 1560 1561 break; 1562 } 1563 1564 case SM_SLOC_BUFFER_ENTRY: { 1565 const char *Name = Blob.data(); 1566 unsigned Offset = Record[0]; 1567 SrcMgr::CharacteristicKind 1568 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1569 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1570 if (IncludeLoc.isInvalid() && F->isModule()) { 1571 IncludeLoc = getImportLocation(F); 1572 } 1573 1574 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1575 if (!Buffer) 1576 return true; 1577 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1578 BaseOffset + Offset, IncludeLoc); 1579 break; 1580 } 1581 1582 case SM_SLOC_EXPANSION_ENTRY: { 1583 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1584 SourceMgr.createExpansionLoc(SpellingLoc, 1585 ReadSourceLocation(*F, Record[2]), 1586 ReadSourceLocation(*F, Record[3]), 1587 Record[5], 1588 Record[4], 1589 ID, 1590 BaseOffset + Record[0]); 1591 break; 1592 } 1593 } 1594 1595 return false; 1596 } 1597 1598 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1599 if (ID == 0) 1600 return std::make_pair(SourceLocation(), ""); 1601 1602 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1603 Error("source location entry ID out-of-range for AST file"); 1604 return std::make_pair(SourceLocation(), ""); 1605 } 1606 1607 // Find which module file this entry lands in. 1608 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1609 if (!M->isModule()) 1610 return std::make_pair(SourceLocation(), ""); 1611 1612 // FIXME: Can we map this down to a particular submodule? That would be 1613 // ideal. 1614 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1615 } 1616 1617 /// Find the location where the module F is imported. 1618 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1619 if (F->ImportLoc.isValid()) 1620 return F->ImportLoc; 1621 1622 // Otherwise we have a PCH. It's considered to be "imported" at the first 1623 // location of its includer. 1624 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1625 // Main file is the importer. 1626 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1627 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1628 } 1629 return F->ImportedBy[0]->FirstLoc; 1630 } 1631 1632 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1633 /// the abbreviations that are at the top of the block and then leave the cursor 1634 /// pointing into the block. 1635 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID, 1636 uint64_t *StartOfBlockOffset) { 1637 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 1638 // FIXME this drops errors on the floor. 1639 consumeError(std::move(Err)); 1640 return true; 1641 } 1642 1643 if (StartOfBlockOffset) 1644 *StartOfBlockOffset = Cursor.GetCurrentBitNo(); 1645 1646 while (true) { 1647 uint64_t Offset = Cursor.GetCurrentBitNo(); 1648 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1649 if (!MaybeCode) { 1650 // FIXME this drops errors on the floor. 1651 consumeError(MaybeCode.takeError()); 1652 return true; 1653 } 1654 unsigned Code = MaybeCode.get(); 1655 1656 // We expect all abbrevs to be at the start of the block. 1657 if (Code != llvm::bitc::DEFINE_ABBREV) { 1658 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1659 // FIXME this drops errors on the floor. 1660 consumeError(std::move(Err)); 1661 return true; 1662 } 1663 return false; 1664 } 1665 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) { 1666 // FIXME this drops errors on the floor. 1667 consumeError(std::move(Err)); 1668 return true; 1669 } 1670 } 1671 } 1672 1673 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1674 unsigned &Idx) { 1675 Token Tok; 1676 Tok.startToken(); 1677 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1678 Tok.setLength(Record[Idx++]); 1679 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1680 Tok.setIdentifierInfo(II); 1681 Tok.setKind((tok::TokenKind)Record[Idx++]); 1682 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1683 return Tok; 1684 } 1685 1686 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1687 BitstreamCursor &Stream = F.MacroCursor; 1688 1689 // Keep track of where we are in the stream, then jump back there 1690 // after reading this macro. 1691 SavedStreamPosition SavedPosition(Stream); 1692 1693 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1694 // FIXME this drops errors on the floor. 1695 consumeError(std::move(Err)); 1696 return nullptr; 1697 } 1698 RecordData Record; 1699 SmallVector<IdentifierInfo*, 16> MacroParams; 1700 MacroInfo *Macro = nullptr; 1701 1702 while (true) { 1703 // Advance to the next record, but if we get to the end of the block, don't 1704 // pop it (removing all the abbreviations from the cursor) since we want to 1705 // be able to reseek within the block and read entries. 1706 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1707 Expected<llvm::BitstreamEntry> MaybeEntry = 1708 Stream.advanceSkippingSubblocks(Flags); 1709 if (!MaybeEntry) { 1710 Error(MaybeEntry.takeError()); 1711 return Macro; 1712 } 1713 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1714 1715 switch (Entry.Kind) { 1716 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1717 case llvm::BitstreamEntry::Error: 1718 Error("malformed block record in AST file"); 1719 return Macro; 1720 case llvm::BitstreamEntry::EndBlock: 1721 return Macro; 1722 case llvm::BitstreamEntry::Record: 1723 // The interesting case. 1724 break; 1725 } 1726 1727 // Read a record. 1728 Record.clear(); 1729 PreprocessorRecordTypes RecType; 1730 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1731 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1732 else { 1733 Error(MaybeRecType.takeError()); 1734 return Macro; 1735 } 1736 switch (RecType) { 1737 case PP_MODULE_MACRO: 1738 case PP_MACRO_DIRECTIVE_HISTORY: 1739 return Macro; 1740 1741 case PP_MACRO_OBJECT_LIKE: 1742 case PP_MACRO_FUNCTION_LIKE: { 1743 // If we already have a macro, that means that we've hit the end 1744 // of the definition of the macro we were looking for. We're 1745 // done. 1746 if (Macro) 1747 return Macro; 1748 1749 unsigned NextIndex = 1; // Skip identifier ID. 1750 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1751 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1752 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1753 MI->setIsUsed(Record[NextIndex++]); 1754 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1755 1756 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1757 // Decode function-like macro info. 1758 bool isC99VarArgs = Record[NextIndex++]; 1759 bool isGNUVarArgs = Record[NextIndex++]; 1760 bool hasCommaPasting = Record[NextIndex++]; 1761 MacroParams.clear(); 1762 unsigned NumArgs = Record[NextIndex++]; 1763 for (unsigned i = 0; i != NumArgs; ++i) 1764 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1765 1766 // Install function-like macro info. 1767 MI->setIsFunctionLike(); 1768 if (isC99VarArgs) MI->setIsC99Varargs(); 1769 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1770 if (hasCommaPasting) MI->setHasCommaPasting(); 1771 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1772 } 1773 1774 // Remember that we saw this macro last so that we add the tokens that 1775 // form its body to it. 1776 Macro = MI; 1777 1778 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1779 Record[NextIndex]) { 1780 // We have a macro definition. Register the association 1781 PreprocessedEntityID 1782 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1783 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1784 PreprocessingRecord::PPEntityID PPID = 1785 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1786 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1787 PPRec.getPreprocessedEntity(PPID)); 1788 if (PPDef) 1789 PPRec.RegisterMacroDefinition(Macro, PPDef); 1790 } 1791 1792 ++NumMacrosRead; 1793 break; 1794 } 1795 1796 case PP_TOKEN: { 1797 // If we see a TOKEN before a PP_MACRO_*, then the file is 1798 // erroneous, just pretend we didn't see this. 1799 if (!Macro) break; 1800 1801 unsigned Idx = 0; 1802 Token Tok = ReadToken(F, Record, Idx); 1803 Macro->AddTokenToBody(Tok); 1804 break; 1805 } 1806 } 1807 } 1808 } 1809 1810 PreprocessedEntityID 1811 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1812 unsigned LocalID) const { 1813 if (!M.ModuleOffsetMap.empty()) 1814 ReadModuleOffsetMap(M); 1815 1816 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1817 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1818 assert(I != M.PreprocessedEntityRemap.end() 1819 && "Invalid index into preprocessed entity index remap"); 1820 1821 return LocalID + I->second; 1822 } 1823 1824 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1825 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1826 } 1827 1828 HeaderFileInfoTrait::internal_key_type 1829 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1830 internal_key_type ikey = {FE->getSize(), 1831 M.HasTimestamps ? FE->getModificationTime() : 0, 1832 FE->getName(), /*Imported*/ false}; 1833 return ikey; 1834 } 1835 1836 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1837 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1838 return false; 1839 1840 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1841 return true; 1842 1843 // Determine whether the actual files are equivalent. 1844 FileManager &FileMgr = Reader.getFileManager(); 1845 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1846 if (!Key.Imported) { 1847 if (auto File = FileMgr.getFile(Key.Filename)) 1848 return *File; 1849 return nullptr; 1850 } 1851 1852 std::string Resolved = std::string(Key.Filename); 1853 Reader.ResolveImportedPath(M, Resolved); 1854 if (auto File = FileMgr.getFile(Resolved)) 1855 return *File; 1856 return nullptr; 1857 }; 1858 1859 const FileEntry *FEA = GetFile(a); 1860 const FileEntry *FEB = GetFile(b); 1861 return FEA && FEA == FEB; 1862 } 1863 1864 std::pair<unsigned, unsigned> 1865 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1866 return readULEBKeyDataLength(d); 1867 } 1868 1869 HeaderFileInfoTrait::internal_key_type 1870 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1871 using namespace llvm::support; 1872 1873 internal_key_type ikey; 1874 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1875 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1876 ikey.Filename = (const char *)d; 1877 ikey.Imported = true; 1878 return ikey; 1879 } 1880 1881 HeaderFileInfoTrait::data_type 1882 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1883 unsigned DataLen) { 1884 using namespace llvm::support; 1885 1886 const unsigned char *End = d + DataLen; 1887 HeaderFileInfo HFI; 1888 unsigned Flags = *d++; 1889 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1890 HFI.isImport |= (Flags >> 5) & 0x01; 1891 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1892 HFI.DirInfo = (Flags >> 1) & 0x07; 1893 HFI.IndexHeaderMapHeader = Flags & 0x01; 1894 // FIXME: Find a better way to handle this. Maybe just store a 1895 // "has been included" flag? 1896 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1897 HFI.NumIncludes); 1898 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1899 M, endian::readNext<uint32_t, little, unaligned>(d)); 1900 if (unsigned FrameworkOffset = 1901 endian::readNext<uint32_t, little, unaligned>(d)) { 1902 // The framework offset is 1 greater than the actual offset, 1903 // since 0 is used as an indicator for "no framework name". 1904 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1905 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1906 } 1907 1908 assert((End - d) % 4 == 0 && 1909 "Wrong data length in HeaderFileInfo deserialization"); 1910 while (d != End) { 1911 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1912 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1913 LocalSMID >>= 2; 1914 1915 // This header is part of a module. Associate it with the module to enable 1916 // implicit module import. 1917 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1918 Module *Mod = Reader.getSubmodule(GlobalSMID); 1919 FileManager &FileMgr = Reader.getFileManager(); 1920 ModuleMap &ModMap = 1921 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1922 1923 std::string Filename = std::string(key.Filename); 1924 if (key.Imported) 1925 Reader.ResolveImportedPath(M, Filename); 1926 // FIXME: NameAsWritten 1927 Module::Header H = {std::string(key.Filename), "", 1928 *FileMgr.getFile(Filename)}; 1929 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1930 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1931 } 1932 1933 // This HeaderFileInfo was externally loaded. 1934 HFI.External = true; 1935 HFI.IsValid = true; 1936 return HFI; 1937 } 1938 1939 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1940 uint32_t MacroDirectivesOffset) { 1941 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1942 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1943 } 1944 1945 void ASTReader::ReadDefinedMacros() { 1946 // Note that we are loading defined macros. 1947 Deserializing Macros(this); 1948 1949 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1950 BitstreamCursor &MacroCursor = I.MacroCursor; 1951 1952 // If there was no preprocessor block, skip this file. 1953 if (MacroCursor.getBitcodeBytes().empty()) 1954 continue; 1955 1956 BitstreamCursor Cursor = MacroCursor; 1957 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1958 Error(std::move(Err)); 1959 return; 1960 } 1961 1962 RecordData Record; 1963 while (true) { 1964 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1965 if (!MaybeE) { 1966 Error(MaybeE.takeError()); 1967 return; 1968 } 1969 llvm::BitstreamEntry E = MaybeE.get(); 1970 1971 switch (E.Kind) { 1972 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1973 case llvm::BitstreamEntry::Error: 1974 Error("malformed block record in AST file"); 1975 return; 1976 case llvm::BitstreamEntry::EndBlock: 1977 goto NextCursor; 1978 1979 case llvm::BitstreamEntry::Record: { 1980 Record.clear(); 1981 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1982 if (!MaybeRecord) { 1983 Error(MaybeRecord.takeError()); 1984 return; 1985 } 1986 switch (MaybeRecord.get()) { 1987 default: // Default behavior: ignore. 1988 break; 1989 1990 case PP_MACRO_OBJECT_LIKE: 1991 case PP_MACRO_FUNCTION_LIKE: { 1992 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1993 if (II->isOutOfDate()) 1994 updateOutOfDateIdentifier(*II); 1995 break; 1996 } 1997 1998 case PP_TOKEN: 1999 // Ignore tokens. 2000 break; 2001 } 2002 break; 2003 } 2004 } 2005 } 2006 NextCursor: ; 2007 } 2008 } 2009 2010 namespace { 2011 2012 /// Visitor class used to look up identifirs in an AST file. 2013 class IdentifierLookupVisitor { 2014 StringRef Name; 2015 unsigned NameHash; 2016 unsigned PriorGeneration; 2017 unsigned &NumIdentifierLookups; 2018 unsigned &NumIdentifierLookupHits; 2019 IdentifierInfo *Found = nullptr; 2020 2021 public: 2022 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2023 unsigned &NumIdentifierLookups, 2024 unsigned &NumIdentifierLookupHits) 2025 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2026 PriorGeneration(PriorGeneration), 2027 NumIdentifierLookups(NumIdentifierLookups), 2028 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2029 2030 bool operator()(ModuleFile &M) { 2031 // If we've already searched this module file, skip it now. 2032 if (M.Generation <= PriorGeneration) 2033 return true; 2034 2035 ASTIdentifierLookupTable *IdTable 2036 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2037 if (!IdTable) 2038 return false; 2039 2040 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2041 Found); 2042 ++NumIdentifierLookups; 2043 ASTIdentifierLookupTable::iterator Pos = 2044 IdTable->find_hashed(Name, NameHash, &Trait); 2045 if (Pos == IdTable->end()) 2046 return false; 2047 2048 // Dereferencing the iterator has the effect of building the 2049 // IdentifierInfo node and populating it with the various 2050 // declarations it needs. 2051 ++NumIdentifierLookupHits; 2052 Found = *Pos; 2053 return true; 2054 } 2055 2056 // Retrieve the identifier info found within the module 2057 // files. 2058 IdentifierInfo *getIdentifierInfo() const { return Found; } 2059 }; 2060 2061 } // namespace 2062 2063 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2064 // Note that we are loading an identifier. 2065 Deserializing AnIdentifier(this); 2066 2067 unsigned PriorGeneration = 0; 2068 if (getContext().getLangOpts().Modules) 2069 PriorGeneration = IdentifierGeneration[&II]; 2070 2071 // If there is a global index, look there first to determine which modules 2072 // provably do not have any results for this identifier. 2073 GlobalModuleIndex::HitSet Hits; 2074 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2075 if (!loadGlobalIndex()) { 2076 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2077 HitsPtr = &Hits; 2078 } 2079 } 2080 2081 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2082 NumIdentifierLookups, 2083 NumIdentifierLookupHits); 2084 ModuleMgr.visit(Visitor, HitsPtr); 2085 markIdentifierUpToDate(&II); 2086 } 2087 2088 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2089 if (!II) 2090 return; 2091 2092 II->setOutOfDate(false); 2093 2094 // Update the generation for this identifier. 2095 if (getContext().getLangOpts().Modules) 2096 IdentifierGeneration[II] = getGeneration(); 2097 } 2098 2099 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2100 const PendingMacroInfo &PMInfo) { 2101 ModuleFile &M = *PMInfo.M; 2102 2103 BitstreamCursor &Cursor = M.MacroCursor; 2104 SavedStreamPosition SavedPosition(Cursor); 2105 if (llvm::Error Err = 2106 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2107 Error(std::move(Err)); 2108 return; 2109 } 2110 2111 struct ModuleMacroRecord { 2112 SubmoduleID SubModID; 2113 MacroInfo *MI; 2114 SmallVector<SubmoduleID, 8> Overrides; 2115 }; 2116 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2117 2118 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2119 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2120 // macro histroy. 2121 RecordData Record; 2122 while (true) { 2123 Expected<llvm::BitstreamEntry> MaybeEntry = 2124 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2125 if (!MaybeEntry) { 2126 Error(MaybeEntry.takeError()); 2127 return; 2128 } 2129 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2130 2131 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2132 Error("malformed block record in AST file"); 2133 return; 2134 } 2135 2136 Record.clear(); 2137 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2138 if (!MaybePP) { 2139 Error(MaybePP.takeError()); 2140 return; 2141 } 2142 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2143 case PP_MACRO_DIRECTIVE_HISTORY: 2144 break; 2145 2146 case PP_MODULE_MACRO: { 2147 ModuleMacros.push_back(ModuleMacroRecord()); 2148 auto &Info = ModuleMacros.back(); 2149 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2150 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2151 for (int I = 2, N = Record.size(); I != N; ++I) 2152 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2153 continue; 2154 } 2155 2156 default: 2157 Error("malformed block record in AST file"); 2158 return; 2159 } 2160 2161 // We found the macro directive history; that's the last record 2162 // for this macro. 2163 break; 2164 } 2165 2166 // Module macros are listed in reverse dependency order. 2167 { 2168 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2169 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2170 for (auto &MMR : ModuleMacros) { 2171 Overrides.clear(); 2172 for (unsigned ModID : MMR.Overrides) { 2173 Module *Mod = getSubmodule(ModID); 2174 auto *Macro = PP.getModuleMacro(Mod, II); 2175 assert(Macro && "missing definition for overridden macro"); 2176 Overrides.push_back(Macro); 2177 } 2178 2179 bool Inserted = false; 2180 Module *Owner = getSubmodule(MMR.SubModID); 2181 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2182 } 2183 } 2184 2185 // Don't read the directive history for a module; we don't have anywhere 2186 // to put it. 2187 if (M.isModule()) 2188 return; 2189 2190 // Deserialize the macro directives history in reverse source-order. 2191 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2192 unsigned Idx = 0, N = Record.size(); 2193 while (Idx < N) { 2194 MacroDirective *MD = nullptr; 2195 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2196 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2197 switch (K) { 2198 case MacroDirective::MD_Define: { 2199 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2200 MD = PP.AllocateDefMacroDirective(MI, Loc); 2201 break; 2202 } 2203 case MacroDirective::MD_Undefine: 2204 MD = PP.AllocateUndefMacroDirective(Loc); 2205 break; 2206 case MacroDirective::MD_Visibility: 2207 bool isPublic = Record[Idx++]; 2208 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2209 break; 2210 } 2211 2212 if (!Latest) 2213 Latest = MD; 2214 if (Earliest) 2215 Earliest->setPrevious(MD); 2216 Earliest = MD; 2217 } 2218 2219 if (Latest) 2220 PP.setLoadedMacroDirective(II, Earliest, Latest); 2221 } 2222 2223 bool ASTReader::shouldDisableValidationForFile( 2224 const serialization::ModuleFile &M) const { 2225 if (DisableValidationKind == DisableValidationForModuleKind::None) 2226 return false; 2227 2228 // If a PCH is loaded and validation is disabled for PCH then disable 2229 // validation for the PCH and the modules it loads. 2230 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind); 2231 2232 switch (K) { 2233 case MK_MainFile: 2234 case MK_Preamble: 2235 case MK_PCH: 2236 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH); 2237 case MK_ImplicitModule: 2238 case MK_ExplicitModule: 2239 case MK_PrebuiltModule: 2240 return bool(DisableValidationKind & DisableValidationForModuleKind::Module); 2241 } 2242 2243 return false; 2244 } 2245 2246 ASTReader::InputFileInfo 2247 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2248 // Go find this input file. 2249 BitstreamCursor &Cursor = F.InputFilesCursor; 2250 SavedStreamPosition SavedPosition(Cursor); 2251 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2252 // FIXME this drops errors on the floor. 2253 consumeError(std::move(Err)); 2254 } 2255 2256 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2257 if (!MaybeCode) { 2258 // FIXME this drops errors on the floor. 2259 consumeError(MaybeCode.takeError()); 2260 } 2261 unsigned Code = MaybeCode.get(); 2262 RecordData Record; 2263 StringRef Blob; 2264 2265 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2266 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2267 "invalid record type for input file"); 2268 else { 2269 // FIXME this drops errors on the floor. 2270 consumeError(Maybe.takeError()); 2271 } 2272 2273 assert(Record[0] == ID && "Bogus stored ID or offset"); 2274 InputFileInfo R; 2275 R.StoredSize = static_cast<off_t>(Record[1]); 2276 R.StoredTime = static_cast<time_t>(Record[2]); 2277 R.Overridden = static_cast<bool>(Record[3]); 2278 R.Transient = static_cast<bool>(Record[4]); 2279 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2280 R.Filename = std::string(Blob); 2281 ResolveImportedPath(F, R.Filename); 2282 2283 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2284 if (!MaybeEntry) // FIXME this drops errors on the floor. 2285 consumeError(MaybeEntry.takeError()); 2286 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2287 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2288 "expected record type for input file hash"); 2289 2290 Record.clear(); 2291 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2292 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2293 "invalid record type for input file hash"); 2294 else { 2295 // FIXME this drops errors on the floor. 2296 consumeError(Maybe.takeError()); 2297 } 2298 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2299 static_cast<uint64_t>(Record[0]); 2300 return R; 2301 } 2302 2303 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2304 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2305 // If this ID is bogus, just return an empty input file. 2306 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2307 return InputFile(); 2308 2309 // If we've already loaded this input file, return it. 2310 if (F.InputFilesLoaded[ID-1].getFile()) 2311 return F.InputFilesLoaded[ID-1]; 2312 2313 if (F.InputFilesLoaded[ID-1].isNotFound()) 2314 return InputFile(); 2315 2316 // Go find this input file. 2317 BitstreamCursor &Cursor = F.InputFilesCursor; 2318 SavedStreamPosition SavedPosition(Cursor); 2319 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2320 // FIXME this drops errors on the floor. 2321 consumeError(std::move(Err)); 2322 } 2323 2324 InputFileInfo FI = readInputFileInfo(F, ID); 2325 off_t StoredSize = FI.StoredSize; 2326 time_t StoredTime = FI.StoredTime; 2327 bool Overridden = FI.Overridden; 2328 bool Transient = FI.Transient; 2329 StringRef Filename = FI.Filename; 2330 uint64_t StoredContentHash = FI.ContentHash; 2331 2332 OptionalFileEntryRefDegradesToFileEntryPtr File = 2333 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false)); 2334 2335 // If we didn't find the file, resolve it relative to the 2336 // original directory from which this AST file was created. 2337 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2338 F.OriginalDir != F.BaseDirectory) { 2339 std::string Resolved = resolveFileRelativeToOriginalDir( 2340 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2341 if (!Resolved.empty()) 2342 File = expectedToOptional(FileMgr.getFileRef(Resolved)); 2343 } 2344 2345 // For an overridden file, create a virtual file with the stored 2346 // size/timestamp. 2347 if ((Overridden || Transient) && !File) 2348 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime); 2349 2350 if (!File) { 2351 if (Complain) { 2352 std::string ErrorStr = "could not find file '"; 2353 ErrorStr += Filename; 2354 ErrorStr += "' referenced by AST file '"; 2355 ErrorStr += F.FileName; 2356 ErrorStr += "'"; 2357 Error(ErrorStr); 2358 } 2359 // Record that we didn't find the file. 2360 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2361 return InputFile(); 2362 } 2363 2364 // Check if there was a request to override the contents of the file 2365 // that was part of the precompiled header. Overriding such a file 2366 // can lead to problems when lexing using the source locations from the 2367 // PCH. 2368 SourceManager &SM = getSourceManager(); 2369 // FIXME: Reject if the overrides are different. 2370 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2371 if (Complain) 2372 Error(diag::err_fe_pch_file_overridden, Filename); 2373 2374 // After emitting the diagnostic, bypass the overriding file to recover 2375 // (this creates a separate FileEntry). 2376 File = SM.bypassFileContentsOverride(*File); 2377 if (!File) { 2378 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2379 return InputFile(); 2380 } 2381 } 2382 2383 enum ModificationType { 2384 Size, 2385 ModTime, 2386 Content, 2387 None, 2388 }; 2389 auto HasInputFileChanged = [&]() { 2390 if (StoredSize != File->getSize()) 2391 return ModificationType::Size; 2392 if (!shouldDisableValidationForFile(F) && StoredTime && 2393 StoredTime != File->getModificationTime()) { 2394 // In case the modification time changes but not the content, 2395 // accept the cached file as legit. 2396 if (ValidateASTInputFilesContent && 2397 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2398 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2399 if (!MemBuffOrError) { 2400 if (!Complain) 2401 return ModificationType::ModTime; 2402 std::string ErrorStr = "could not get buffer for file '"; 2403 ErrorStr += File->getName(); 2404 ErrorStr += "'"; 2405 Error(ErrorStr); 2406 return ModificationType::ModTime; 2407 } 2408 2409 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2410 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2411 return ModificationType::None; 2412 return ModificationType::Content; 2413 } 2414 return ModificationType::ModTime; 2415 } 2416 return ModificationType::None; 2417 }; 2418 2419 bool IsOutOfDate = false; 2420 auto FileChange = HasInputFileChanged(); 2421 // For an overridden file, there is nothing to validate. 2422 if (!Overridden && FileChange != ModificationType::None) { 2423 if (Complain && !Diags.isDiagnosticInFlight()) { 2424 // Build a list of the PCH imports that got us here (in reverse). 2425 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2426 while (!ImportStack.back()->ImportedBy.empty()) 2427 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2428 2429 // The top-level PCH is stale. 2430 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2431 Diag(diag::err_fe_ast_file_modified) 2432 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind) 2433 << TopLevelPCHName << FileChange; 2434 2435 // Print the import stack. 2436 if (ImportStack.size() > 1) { 2437 Diag(diag::note_pch_required_by) 2438 << Filename << ImportStack[0]->FileName; 2439 for (unsigned I = 1; I < ImportStack.size(); ++I) 2440 Diag(diag::note_pch_required_by) 2441 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2442 } 2443 2444 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2445 } 2446 2447 IsOutOfDate = true; 2448 } 2449 // FIXME: If the file is overridden and we've already opened it, 2450 // issue an error (or split it into a separate FileEntry). 2451 2452 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate); 2453 2454 // Note that we've loaded this input file. 2455 F.InputFilesLoaded[ID-1] = IF; 2456 return IF; 2457 } 2458 2459 /// If we are loading a relocatable PCH or module file, and the filename 2460 /// is not an absolute path, add the system or module root to the beginning of 2461 /// the file name. 2462 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2463 // Resolve relative to the base directory, if we have one. 2464 if (!M.BaseDirectory.empty()) 2465 return ResolveImportedPath(Filename, M.BaseDirectory); 2466 } 2467 2468 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2469 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2470 return; 2471 2472 SmallString<128> Buffer; 2473 llvm::sys::path::append(Buffer, Prefix, Filename); 2474 Filename.assign(Buffer.begin(), Buffer.end()); 2475 } 2476 2477 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2478 switch (ARR) { 2479 case ASTReader::Failure: return true; 2480 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2481 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2482 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2483 case ASTReader::ConfigurationMismatch: 2484 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2485 case ASTReader::HadErrors: return true; 2486 case ASTReader::Success: return false; 2487 } 2488 2489 llvm_unreachable("unknown ASTReadResult"); 2490 } 2491 2492 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2493 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2494 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2495 std::string &SuggestedPredefines) { 2496 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2497 // FIXME this drops errors on the floor. 2498 consumeError(std::move(Err)); 2499 return Failure; 2500 } 2501 2502 // Read all of the records in the options block. 2503 RecordData Record; 2504 ASTReadResult Result = Success; 2505 while (true) { 2506 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2507 if (!MaybeEntry) { 2508 // FIXME this drops errors on the floor. 2509 consumeError(MaybeEntry.takeError()); 2510 return Failure; 2511 } 2512 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2513 2514 switch (Entry.Kind) { 2515 case llvm::BitstreamEntry::Error: 2516 case llvm::BitstreamEntry::SubBlock: 2517 return Failure; 2518 2519 case llvm::BitstreamEntry::EndBlock: 2520 return Result; 2521 2522 case llvm::BitstreamEntry::Record: 2523 // The interesting case. 2524 break; 2525 } 2526 2527 // Read and process a record. 2528 Record.clear(); 2529 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2530 if (!MaybeRecordType) { 2531 // FIXME this drops errors on the floor. 2532 consumeError(MaybeRecordType.takeError()); 2533 return Failure; 2534 } 2535 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2536 case LANGUAGE_OPTIONS: { 2537 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2538 if (ParseLanguageOptions(Record, Complain, Listener, 2539 AllowCompatibleConfigurationMismatch)) 2540 Result = ConfigurationMismatch; 2541 break; 2542 } 2543 2544 case TARGET_OPTIONS: { 2545 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2546 if (ParseTargetOptions(Record, Complain, Listener, 2547 AllowCompatibleConfigurationMismatch)) 2548 Result = ConfigurationMismatch; 2549 break; 2550 } 2551 2552 case FILE_SYSTEM_OPTIONS: { 2553 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2554 if (!AllowCompatibleConfigurationMismatch && 2555 ParseFileSystemOptions(Record, Complain, Listener)) 2556 Result = ConfigurationMismatch; 2557 break; 2558 } 2559 2560 case HEADER_SEARCH_OPTIONS: { 2561 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2562 if (!AllowCompatibleConfigurationMismatch && 2563 ParseHeaderSearchOptions(Record, Complain, Listener)) 2564 Result = ConfigurationMismatch; 2565 break; 2566 } 2567 2568 case PREPROCESSOR_OPTIONS: 2569 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2570 if (!AllowCompatibleConfigurationMismatch && 2571 ParsePreprocessorOptions(Record, Complain, Listener, 2572 SuggestedPredefines)) 2573 Result = ConfigurationMismatch; 2574 break; 2575 } 2576 } 2577 } 2578 2579 ASTReader::ASTReadResult 2580 ASTReader::ReadControlBlock(ModuleFile &F, 2581 SmallVectorImpl<ImportedModule> &Loaded, 2582 const ModuleFile *ImportedBy, 2583 unsigned ClientLoadCapabilities) { 2584 BitstreamCursor &Stream = F.Stream; 2585 2586 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2587 Error(std::move(Err)); 2588 return Failure; 2589 } 2590 2591 // Lambda to read the unhashed control block the first time it's called. 2592 // 2593 // For PCM files, the unhashed control block cannot be read until after the 2594 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2595 // need to look ahead before reading the IMPORTS record. For consistency, 2596 // this block is always read somehow (see BitstreamEntry::EndBlock). 2597 bool HasReadUnhashedControlBlock = false; 2598 auto readUnhashedControlBlockOnce = [&]() { 2599 if (!HasReadUnhashedControlBlock) { 2600 HasReadUnhashedControlBlock = true; 2601 if (ASTReadResult Result = 2602 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2603 return Result; 2604 } 2605 return Success; 2606 }; 2607 2608 bool DisableValidation = shouldDisableValidationForFile(F); 2609 2610 // Read all of the records and blocks in the control block. 2611 RecordData Record; 2612 unsigned NumInputs = 0; 2613 unsigned NumUserInputs = 0; 2614 StringRef BaseDirectoryAsWritten; 2615 while (true) { 2616 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2617 if (!MaybeEntry) { 2618 Error(MaybeEntry.takeError()); 2619 return Failure; 2620 } 2621 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2622 2623 switch (Entry.Kind) { 2624 case llvm::BitstreamEntry::Error: 2625 Error("malformed block record in AST file"); 2626 return Failure; 2627 case llvm::BitstreamEntry::EndBlock: { 2628 // Validate the module before returning. This call catches an AST with 2629 // no module name and no imports. 2630 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2631 return Result; 2632 2633 // Validate input files. 2634 const HeaderSearchOptions &HSOpts = 2635 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2636 2637 // All user input files reside at the index range [0, NumUserInputs), and 2638 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2639 // loaded module files, ignore missing inputs. 2640 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2641 F.Kind != MK_PrebuiltModule) { 2642 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2643 2644 // If we are reading a module, we will create a verification timestamp, 2645 // so we verify all input files. Otherwise, verify only user input 2646 // files. 2647 2648 unsigned N = NumUserInputs; 2649 if (ValidateSystemInputs || 2650 (HSOpts.ModulesValidateOncePerBuildSession && 2651 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2652 F.Kind == MK_ImplicitModule)) 2653 N = NumInputs; 2654 2655 for (unsigned I = 0; I < N; ++I) { 2656 InputFile IF = getInputFile(F, I+1, Complain); 2657 if (!IF.getFile() || IF.isOutOfDate()) 2658 return OutOfDate; 2659 } 2660 } 2661 2662 if (Listener) 2663 Listener->visitModuleFile(F.FileName, F.Kind); 2664 2665 if (Listener && Listener->needsInputFileVisitation()) { 2666 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2667 : NumUserInputs; 2668 for (unsigned I = 0; I < N; ++I) { 2669 bool IsSystem = I >= NumUserInputs; 2670 InputFileInfo FI = readInputFileInfo(F, I+1); 2671 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2672 F.Kind == MK_ExplicitModule || 2673 F.Kind == MK_PrebuiltModule); 2674 } 2675 } 2676 2677 return Success; 2678 } 2679 2680 case llvm::BitstreamEntry::SubBlock: 2681 switch (Entry.ID) { 2682 case INPUT_FILES_BLOCK_ID: 2683 F.InputFilesCursor = Stream; 2684 if (llvm::Error Err = Stream.SkipBlock()) { 2685 Error(std::move(Err)); 2686 return Failure; 2687 } 2688 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2689 Error("malformed block record in AST file"); 2690 return Failure; 2691 } 2692 continue; 2693 2694 case OPTIONS_BLOCK_ID: 2695 // If we're reading the first module for this group, check its options 2696 // are compatible with ours. For modules it imports, no further checking 2697 // is required, because we checked them when we built it. 2698 if (Listener && !ImportedBy) { 2699 // Should we allow the configuration of the module file to differ from 2700 // the configuration of the current translation unit in a compatible 2701 // way? 2702 // 2703 // FIXME: Allow this for files explicitly specified with -include-pch. 2704 bool AllowCompatibleConfigurationMismatch = 2705 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2706 2707 ASTReadResult Result = 2708 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2709 AllowCompatibleConfigurationMismatch, *Listener, 2710 SuggestedPredefines); 2711 if (Result == Failure) { 2712 Error("malformed block record in AST file"); 2713 return Result; 2714 } 2715 2716 if (DisableValidation || 2717 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2718 Result = Success; 2719 2720 // If we can't load the module, exit early since we likely 2721 // will rebuild the module anyway. The stream may be in the 2722 // middle of a block. 2723 if (Result != Success) 2724 return Result; 2725 } else if (llvm::Error Err = Stream.SkipBlock()) { 2726 Error(std::move(Err)); 2727 return Failure; 2728 } 2729 continue; 2730 2731 default: 2732 if (llvm::Error Err = Stream.SkipBlock()) { 2733 Error(std::move(Err)); 2734 return Failure; 2735 } 2736 continue; 2737 } 2738 2739 case llvm::BitstreamEntry::Record: 2740 // The interesting case. 2741 break; 2742 } 2743 2744 // Read and process a record. 2745 Record.clear(); 2746 StringRef Blob; 2747 Expected<unsigned> MaybeRecordType = 2748 Stream.readRecord(Entry.ID, Record, &Blob); 2749 if (!MaybeRecordType) { 2750 Error(MaybeRecordType.takeError()); 2751 return Failure; 2752 } 2753 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2754 case METADATA: { 2755 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2756 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2757 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2758 : diag::err_pch_version_too_new); 2759 return VersionMismatch; 2760 } 2761 2762 bool hasErrors = Record[6]; 2763 if (hasErrors && !DisableValidation) { 2764 // If requested by the caller and the module hasn't already been read 2765 // or compiled, mark modules on error as out-of-date. 2766 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) && 2767 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2768 return OutOfDate; 2769 2770 if (!AllowASTWithCompilerErrors) { 2771 Diag(diag::err_pch_with_compiler_errors); 2772 return HadErrors; 2773 } 2774 } 2775 if (hasErrors) { 2776 Diags.ErrorOccurred = true; 2777 Diags.UncompilableErrorOccurred = true; 2778 Diags.UnrecoverableErrorOccurred = true; 2779 } 2780 2781 F.RelocatablePCH = Record[4]; 2782 // Relative paths in a relocatable PCH are relative to our sysroot. 2783 if (F.RelocatablePCH) 2784 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2785 2786 F.HasTimestamps = Record[5]; 2787 2788 const std::string &CurBranch = getClangFullRepositoryVersion(); 2789 StringRef ASTBranch = Blob; 2790 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2791 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2792 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2793 return VersionMismatch; 2794 } 2795 break; 2796 } 2797 2798 case IMPORTS: { 2799 // Validate the AST before processing any imports (otherwise, untangling 2800 // them can be error-prone and expensive). A module will have a name and 2801 // will already have been validated, but this catches the PCH case. 2802 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2803 return Result; 2804 2805 // Load each of the imported PCH files. 2806 unsigned Idx = 0, N = Record.size(); 2807 while (Idx < N) { 2808 // Read information about the AST file. 2809 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2810 // The import location will be the local one for now; we will adjust 2811 // all import locations of module imports after the global source 2812 // location info are setup, in ReadAST. 2813 SourceLocation ImportLoc = 2814 ReadUntranslatedSourceLocation(Record[Idx++]); 2815 off_t StoredSize = (off_t)Record[Idx++]; 2816 time_t StoredModTime = (time_t)Record[Idx++]; 2817 auto FirstSignatureByte = Record.begin() + Idx; 2818 ASTFileSignature StoredSignature = ASTFileSignature::create( 2819 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size); 2820 Idx += ASTFileSignature::size; 2821 2822 std::string ImportedName = ReadString(Record, Idx); 2823 std::string ImportedFile; 2824 2825 // For prebuilt and explicit modules first consult the file map for 2826 // an override. Note that here we don't search prebuilt module 2827 // directories, only the explicit name to file mappings. Also, we will 2828 // still verify the size/signature making sure it is essentially the 2829 // same file but perhaps in a different location. 2830 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2831 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2832 ImportedName, /*FileMapOnly*/ true); 2833 2834 if (ImportedFile.empty()) 2835 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2836 // ModuleCache as when writing. 2837 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2838 else 2839 SkipPath(Record, Idx); 2840 2841 // If our client can't cope with us being out of date, we can't cope with 2842 // our dependency being missing. 2843 unsigned Capabilities = ClientLoadCapabilities; 2844 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2845 Capabilities &= ~ARR_Missing; 2846 2847 // Load the AST file. 2848 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2849 Loaded, StoredSize, StoredModTime, 2850 StoredSignature, Capabilities); 2851 2852 // If we diagnosed a problem, produce a backtrace. 2853 bool recompilingFinalized = 2854 Result == OutOfDate && (Capabilities & ARR_OutOfDate) && 2855 getModuleManager().getModuleCache().isPCMFinal(F.FileName); 2856 if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized) 2857 Diag(diag::note_module_file_imported_by) 2858 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2859 if (recompilingFinalized) 2860 Diag(diag::note_module_file_conflict); 2861 2862 switch (Result) { 2863 case Failure: return Failure; 2864 // If we have to ignore the dependency, we'll have to ignore this too. 2865 case Missing: 2866 case OutOfDate: return OutOfDate; 2867 case VersionMismatch: return VersionMismatch; 2868 case ConfigurationMismatch: return ConfigurationMismatch; 2869 case HadErrors: return HadErrors; 2870 case Success: break; 2871 } 2872 } 2873 break; 2874 } 2875 2876 case ORIGINAL_FILE: 2877 F.OriginalSourceFileID = FileID::get(Record[0]); 2878 F.ActualOriginalSourceFileName = std::string(Blob); 2879 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2880 ResolveImportedPath(F, F.OriginalSourceFileName); 2881 break; 2882 2883 case ORIGINAL_FILE_ID: 2884 F.OriginalSourceFileID = FileID::get(Record[0]); 2885 break; 2886 2887 case ORIGINAL_PCH_DIR: 2888 F.OriginalDir = std::string(Blob); 2889 break; 2890 2891 case MODULE_NAME: 2892 F.ModuleName = std::string(Blob); 2893 Diag(diag::remark_module_import) 2894 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2895 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2896 if (Listener) 2897 Listener->ReadModuleName(F.ModuleName); 2898 2899 // Validate the AST as soon as we have a name so we can exit early on 2900 // failure. 2901 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2902 return Result; 2903 2904 break; 2905 2906 case MODULE_DIRECTORY: { 2907 // Save the BaseDirectory as written in the PCM for computing the module 2908 // filename for the ModuleCache. 2909 BaseDirectoryAsWritten = Blob; 2910 assert(!F.ModuleName.empty() && 2911 "MODULE_DIRECTORY found before MODULE_NAME"); 2912 // If we've already loaded a module map file covering this module, we may 2913 // have a better path for it (relative to the current build). 2914 Module *M = PP.getHeaderSearchInfo().lookupModule( 2915 F.ModuleName, /*AllowSearch*/ true, 2916 /*AllowExtraModuleMapSearch*/ true); 2917 if (M && M->Directory) { 2918 // If we're implicitly loading a module, the base directory can't 2919 // change between the build and use. 2920 // Don't emit module relocation error if we have -fno-validate-pch 2921 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 2922 DisableValidationForModuleKind::Module) && 2923 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2924 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2925 if (!BuildDir || *BuildDir != M->Directory) { 2926 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2927 Diag(diag::err_imported_module_relocated) 2928 << F.ModuleName << Blob << M->Directory->getName(); 2929 return OutOfDate; 2930 } 2931 } 2932 F.BaseDirectory = std::string(M->Directory->getName()); 2933 } else { 2934 F.BaseDirectory = std::string(Blob); 2935 } 2936 break; 2937 } 2938 2939 case MODULE_MAP_FILE: 2940 if (ASTReadResult Result = 2941 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2942 return Result; 2943 break; 2944 2945 case INPUT_FILE_OFFSETS: 2946 NumInputs = Record[0]; 2947 NumUserInputs = Record[1]; 2948 F.InputFileOffsets = 2949 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2950 F.InputFilesLoaded.resize(NumInputs); 2951 F.NumUserInputFiles = NumUserInputs; 2952 break; 2953 } 2954 } 2955 } 2956 2957 ASTReader::ASTReadResult 2958 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2959 BitstreamCursor &Stream = F.Stream; 2960 2961 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) { 2962 Error(std::move(Err)); 2963 return Failure; 2964 } 2965 F.ASTBlockStartOffset = Stream.GetCurrentBitNo(); 2966 2967 // Read all of the records and blocks for the AST file. 2968 RecordData Record; 2969 while (true) { 2970 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2971 if (!MaybeEntry) { 2972 Error(MaybeEntry.takeError()); 2973 return Failure; 2974 } 2975 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2976 2977 switch (Entry.Kind) { 2978 case llvm::BitstreamEntry::Error: 2979 Error("error at end of module block in AST file"); 2980 return Failure; 2981 case llvm::BitstreamEntry::EndBlock: 2982 // Outside of C++, we do not store a lookup map for the translation unit. 2983 // Instead, mark it as needing a lookup map to be built if this module 2984 // contains any declarations lexically within it (which it always does!). 2985 // This usually has no cost, since we very rarely need the lookup map for 2986 // the translation unit outside C++. 2987 if (ASTContext *Ctx = ContextObj) { 2988 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2989 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2990 DC->setMustBuildLookupTable(); 2991 } 2992 2993 return Success; 2994 case llvm::BitstreamEntry::SubBlock: 2995 switch (Entry.ID) { 2996 case DECLTYPES_BLOCK_ID: 2997 // We lazily load the decls block, but we want to set up the 2998 // DeclsCursor cursor to point into it. Clone our current bitcode 2999 // cursor to it, enter the block and read the abbrevs in that block. 3000 // With the main cursor, we just skip over it. 3001 F.DeclsCursor = Stream; 3002 if (llvm::Error Err = Stream.SkipBlock()) { 3003 Error(std::move(Err)); 3004 return Failure; 3005 } 3006 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID, 3007 &F.DeclsBlockStartOffset)) { 3008 Error("malformed block record in AST file"); 3009 return Failure; 3010 } 3011 break; 3012 3013 case PREPROCESSOR_BLOCK_ID: 3014 F.MacroCursor = Stream; 3015 if (!PP.getExternalSource()) 3016 PP.setExternalSource(this); 3017 3018 if (llvm::Error Err = Stream.SkipBlock()) { 3019 Error(std::move(Err)); 3020 return Failure; 3021 } 3022 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 3023 Error("malformed block record in AST file"); 3024 return Failure; 3025 } 3026 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 3027 break; 3028 3029 case PREPROCESSOR_DETAIL_BLOCK_ID: 3030 F.PreprocessorDetailCursor = Stream; 3031 3032 if (llvm::Error Err = Stream.SkipBlock()) { 3033 Error(std::move(Err)); 3034 return Failure; 3035 } 3036 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3037 PREPROCESSOR_DETAIL_BLOCK_ID)) { 3038 Error("malformed preprocessor detail record in AST file"); 3039 return Failure; 3040 } 3041 F.PreprocessorDetailStartOffset 3042 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3043 3044 if (!PP.getPreprocessingRecord()) 3045 PP.createPreprocessingRecord(); 3046 if (!PP.getPreprocessingRecord()->getExternalSource()) 3047 PP.getPreprocessingRecord()->SetExternalSource(*this); 3048 break; 3049 3050 case SOURCE_MANAGER_BLOCK_ID: 3051 if (ReadSourceManagerBlock(F)) 3052 return Failure; 3053 break; 3054 3055 case SUBMODULE_BLOCK_ID: 3056 if (ASTReadResult Result = 3057 ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3058 return Result; 3059 break; 3060 3061 case COMMENTS_BLOCK_ID: { 3062 BitstreamCursor C = Stream; 3063 3064 if (llvm::Error Err = Stream.SkipBlock()) { 3065 Error(std::move(Err)); 3066 return Failure; 3067 } 3068 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 3069 Error("malformed comments block in AST file"); 3070 return Failure; 3071 } 3072 CommentsCursors.push_back(std::make_pair(C, &F)); 3073 break; 3074 } 3075 3076 default: 3077 if (llvm::Error Err = Stream.SkipBlock()) { 3078 Error(std::move(Err)); 3079 return Failure; 3080 } 3081 break; 3082 } 3083 continue; 3084 3085 case llvm::BitstreamEntry::Record: 3086 // The interesting case. 3087 break; 3088 } 3089 3090 // Read and process a record. 3091 Record.clear(); 3092 StringRef Blob; 3093 Expected<unsigned> MaybeRecordType = 3094 Stream.readRecord(Entry.ID, Record, &Blob); 3095 if (!MaybeRecordType) { 3096 Error(MaybeRecordType.takeError()); 3097 return Failure; 3098 } 3099 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3100 3101 // If we're not loading an AST context, we don't care about most records. 3102 if (!ContextObj) { 3103 switch (RecordType) { 3104 case IDENTIFIER_TABLE: 3105 case IDENTIFIER_OFFSET: 3106 case INTERESTING_IDENTIFIERS: 3107 case STATISTICS: 3108 case PP_CONDITIONAL_STACK: 3109 case PP_COUNTER_VALUE: 3110 case SOURCE_LOCATION_OFFSETS: 3111 case MODULE_OFFSET_MAP: 3112 case SOURCE_MANAGER_LINE_TABLE: 3113 case SOURCE_LOCATION_PRELOADS: 3114 case PPD_ENTITIES_OFFSETS: 3115 case HEADER_SEARCH_TABLE: 3116 case IMPORTED_MODULES: 3117 case MACRO_OFFSET: 3118 break; 3119 default: 3120 continue; 3121 } 3122 } 3123 3124 switch (RecordType) { 3125 default: // Default behavior: ignore. 3126 break; 3127 3128 case TYPE_OFFSET: { 3129 if (F.LocalNumTypes != 0) { 3130 Error("duplicate TYPE_OFFSET record in AST file"); 3131 return Failure; 3132 } 3133 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data()); 3134 F.LocalNumTypes = Record[0]; 3135 unsigned LocalBaseTypeIndex = Record[1]; 3136 F.BaseTypeIndex = getTotalNumTypes(); 3137 3138 if (F.LocalNumTypes > 0) { 3139 // Introduce the global -> local mapping for types within this module. 3140 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3141 3142 // Introduce the local -> global mapping for types within this module. 3143 F.TypeRemap.insertOrReplace( 3144 std::make_pair(LocalBaseTypeIndex, 3145 F.BaseTypeIndex - LocalBaseTypeIndex)); 3146 3147 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3148 } 3149 break; 3150 } 3151 3152 case DECL_OFFSET: { 3153 if (F.LocalNumDecls != 0) { 3154 Error("duplicate DECL_OFFSET record in AST file"); 3155 return Failure; 3156 } 3157 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3158 F.LocalNumDecls = Record[0]; 3159 unsigned LocalBaseDeclID = Record[1]; 3160 F.BaseDeclID = getTotalNumDecls(); 3161 3162 if (F.LocalNumDecls > 0) { 3163 // Introduce the global -> local mapping for declarations within this 3164 // module. 3165 GlobalDeclMap.insert( 3166 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3167 3168 // Introduce the local -> global mapping for declarations within this 3169 // module. 3170 F.DeclRemap.insertOrReplace( 3171 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3172 3173 // Introduce the global -> local mapping for declarations within this 3174 // module. 3175 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3176 3177 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3178 } 3179 break; 3180 } 3181 3182 case TU_UPDATE_LEXICAL: { 3183 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3184 LexicalContents Contents( 3185 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3186 Blob.data()), 3187 static_cast<unsigned int>(Blob.size() / 4)); 3188 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3189 TU->setHasExternalLexicalStorage(true); 3190 break; 3191 } 3192 3193 case UPDATE_VISIBLE: { 3194 unsigned Idx = 0; 3195 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3196 auto *Data = (const unsigned char*)Blob.data(); 3197 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3198 // If we've already loaded the decl, perform the updates when we finish 3199 // loading this block. 3200 if (Decl *D = GetExistingDecl(ID)) 3201 PendingUpdateRecords.push_back( 3202 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3203 break; 3204 } 3205 3206 case IDENTIFIER_TABLE: 3207 F.IdentifierTableData = 3208 reinterpret_cast<const unsigned char *>(Blob.data()); 3209 if (Record[0]) { 3210 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3211 F.IdentifierTableData + Record[0], 3212 F.IdentifierTableData + sizeof(uint32_t), 3213 F.IdentifierTableData, 3214 ASTIdentifierLookupTrait(*this, F)); 3215 3216 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3217 } 3218 break; 3219 3220 case IDENTIFIER_OFFSET: { 3221 if (F.LocalNumIdentifiers != 0) { 3222 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 3223 return Failure; 3224 } 3225 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3226 F.LocalNumIdentifiers = Record[0]; 3227 unsigned LocalBaseIdentifierID = Record[1]; 3228 F.BaseIdentifierID = getTotalNumIdentifiers(); 3229 3230 if (F.LocalNumIdentifiers > 0) { 3231 // Introduce the global -> local mapping for identifiers within this 3232 // module. 3233 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3234 &F)); 3235 3236 // Introduce the local -> global mapping for identifiers within this 3237 // module. 3238 F.IdentifierRemap.insertOrReplace( 3239 std::make_pair(LocalBaseIdentifierID, 3240 F.BaseIdentifierID - LocalBaseIdentifierID)); 3241 3242 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3243 + F.LocalNumIdentifiers); 3244 } 3245 break; 3246 } 3247 3248 case INTERESTING_IDENTIFIERS: 3249 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3250 break; 3251 3252 case EAGERLY_DESERIALIZED_DECLS: 3253 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3254 // about "interesting" decls (for instance, if we're building a module). 3255 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3256 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3257 break; 3258 3259 case MODULAR_CODEGEN_DECLS: 3260 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3261 // them (ie: if we're not codegenerating this module). 3262 if (F.Kind == MK_MainFile || 3263 getContext().getLangOpts().BuildingPCHWithObjectFile) 3264 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3265 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3266 break; 3267 3268 case SPECIAL_TYPES: 3269 if (SpecialTypes.empty()) { 3270 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3271 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3272 break; 3273 } 3274 3275 if (SpecialTypes.size() != Record.size()) { 3276 Error("invalid special-types record"); 3277 return Failure; 3278 } 3279 3280 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3281 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3282 if (!SpecialTypes[I]) 3283 SpecialTypes[I] = ID; 3284 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3285 // merge step? 3286 } 3287 break; 3288 3289 case STATISTICS: 3290 TotalNumStatements += Record[0]; 3291 TotalNumMacros += Record[1]; 3292 TotalLexicalDeclContexts += Record[2]; 3293 TotalVisibleDeclContexts += Record[3]; 3294 break; 3295 3296 case UNUSED_FILESCOPED_DECLS: 3297 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3298 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3299 break; 3300 3301 case DELEGATING_CTORS: 3302 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3303 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3304 break; 3305 3306 case WEAK_UNDECLARED_IDENTIFIERS: 3307 if (Record.size() % 4 != 0) { 3308 Error("invalid weak identifiers record"); 3309 return Failure; 3310 } 3311 3312 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3313 // files. This isn't the way to do it :) 3314 WeakUndeclaredIdentifiers.clear(); 3315 3316 // Translate the weak, undeclared identifiers into global IDs. 3317 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3318 WeakUndeclaredIdentifiers.push_back( 3319 getGlobalIdentifierID(F, Record[I++])); 3320 WeakUndeclaredIdentifiers.push_back( 3321 getGlobalIdentifierID(F, Record[I++])); 3322 WeakUndeclaredIdentifiers.push_back( 3323 ReadSourceLocation(F, Record, I).getRawEncoding()); 3324 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3325 } 3326 break; 3327 3328 case SELECTOR_OFFSETS: { 3329 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3330 F.LocalNumSelectors = Record[0]; 3331 unsigned LocalBaseSelectorID = Record[1]; 3332 F.BaseSelectorID = getTotalNumSelectors(); 3333 3334 if (F.LocalNumSelectors > 0) { 3335 // Introduce the global -> local mapping for selectors within this 3336 // module. 3337 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3338 3339 // Introduce the local -> global mapping for selectors within this 3340 // module. 3341 F.SelectorRemap.insertOrReplace( 3342 std::make_pair(LocalBaseSelectorID, 3343 F.BaseSelectorID - LocalBaseSelectorID)); 3344 3345 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3346 } 3347 break; 3348 } 3349 3350 case METHOD_POOL: 3351 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3352 if (Record[0]) 3353 F.SelectorLookupTable 3354 = ASTSelectorLookupTable::Create( 3355 F.SelectorLookupTableData + Record[0], 3356 F.SelectorLookupTableData, 3357 ASTSelectorLookupTrait(*this, F)); 3358 TotalNumMethodPoolEntries += Record[1]; 3359 break; 3360 3361 case REFERENCED_SELECTOR_POOL: 3362 if (!Record.empty()) { 3363 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3364 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3365 Record[Idx++])); 3366 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3367 getRawEncoding()); 3368 } 3369 } 3370 break; 3371 3372 case PP_CONDITIONAL_STACK: 3373 if (!Record.empty()) { 3374 unsigned Idx = 0, End = Record.size() - 1; 3375 bool ReachedEOFWhileSkipping = Record[Idx++]; 3376 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3377 if (ReachedEOFWhileSkipping) { 3378 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3379 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3380 bool FoundNonSkipPortion = Record[Idx++]; 3381 bool FoundElse = Record[Idx++]; 3382 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3383 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3384 FoundElse, ElseLoc); 3385 } 3386 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3387 while (Idx < End) { 3388 auto Loc = ReadSourceLocation(F, Record, Idx); 3389 bool WasSkipping = Record[Idx++]; 3390 bool FoundNonSkip = Record[Idx++]; 3391 bool FoundElse = Record[Idx++]; 3392 ConditionalStack.push_back( 3393 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3394 } 3395 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3396 } 3397 break; 3398 3399 case PP_COUNTER_VALUE: 3400 if (!Record.empty() && Listener) 3401 Listener->ReadCounter(F, Record[0]); 3402 break; 3403 3404 case FILE_SORTED_DECLS: 3405 F.FileSortedDecls = (const DeclID *)Blob.data(); 3406 F.NumFileSortedDecls = Record[0]; 3407 break; 3408 3409 case SOURCE_LOCATION_OFFSETS: { 3410 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3411 F.LocalNumSLocEntries = Record[0]; 3412 SourceLocation::UIntTy SLocSpaceSize = Record[1]; 3413 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset; 3414 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3415 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3416 SLocSpaceSize); 3417 if (!F.SLocEntryBaseID) { 3418 Error("ran out of source locations"); 3419 break; 3420 } 3421 // Make our entry in the range map. BaseID is negative and growing, so 3422 // we invert it. Because we invert it, though, we need the other end of 3423 // the range. 3424 unsigned RangeStart = 3425 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3426 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3427 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3428 3429 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3430 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0); 3431 GlobalSLocOffsetMap.insert( 3432 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3433 - SLocSpaceSize,&F)); 3434 3435 // Initialize the remapping table. 3436 // Invalid stays invalid. 3437 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3438 // This module. Base was 2 when being compiled. 3439 F.SLocRemap.insertOrReplace(std::make_pair( 3440 2U, static_cast<SourceLocation::IntTy>(F.SLocEntryBaseOffset - 2))); 3441 3442 TotalNumSLocEntries += F.LocalNumSLocEntries; 3443 break; 3444 } 3445 3446 case MODULE_OFFSET_MAP: 3447 F.ModuleOffsetMap = Blob; 3448 break; 3449 3450 case SOURCE_MANAGER_LINE_TABLE: 3451 if (ParseLineTable(F, Record)) { 3452 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file"); 3453 return Failure; 3454 } 3455 break; 3456 3457 case SOURCE_LOCATION_PRELOADS: { 3458 // Need to transform from the local view (1-based IDs) to the global view, 3459 // which is based off F.SLocEntryBaseID. 3460 if (!F.PreloadSLocEntries.empty()) { 3461 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3462 return Failure; 3463 } 3464 3465 F.PreloadSLocEntries.swap(Record); 3466 break; 3467 } 3468 3469 case EXT_VECTOR_DECLS: 3470 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3471 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3472 break; 3473 3474 case VTABLE_USES: 3475 if (Record.size() % 3 != 0) { 3476 Error("Invalid VTABLE_USES record"); 3477 return Failure; 3478 } 3479 3480 // Later tables overwrite earlier ones. 3481 // FIXME: Modules will have some trouble with this. This is clearly not 3482 // the right way to do this. 3483 VTableUses.clear(); 3484 3485 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3486 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3487 VTableUses.push_back( 3488 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3489 VTableUses.push_back(Record[Idx++]); 3490 } 3491 break; 3492 3493 case PENDING_IMPLICIT_INSTANTIATIONS: 3494 if (PendingInstantiations.size() % 2 != 0) { 3495 Error("Invalid existing PendingInstantiations"); 3496 return Failure; 3497 } 3498 3499 if (Record.size() % 2 != 0) { 3500 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3501 return Failure; 3502 } 3503 3504 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3505 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3506 PendingInstantiations.push_back( 3507 ReadSourceLocation(F, Record, I).getRawEncoding()); 3508 } 3509 break; 3510 3511 case SEMA_DECL_REFS: 3512 if (Record.size() != 3) { 3513 Error("Invalid SEMA_DECL_REFS block"); 3514 return Failure; 3515 } 3516 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3517 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3518 break; 3519 3520 case PPD_ENTITIES_OFFSETS: { 3521 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3522 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3523 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3524 3525 unsigned LocalBasePreprocessedEntityID = Record[0]; 3526 3527 unsigned StartingID; 3528 if (!PP.getPreprocessingRecord()) 3529 PP.createPreprocessingRecord(); 3530 if (!PP.getPreprocessingRecord()->getExternalSource()) 3531 PP.getPreprocessingRecord()->SetExternalSource(*this); 3532 StartingID 3533 = PP.getPreprocessingRecord() 3534 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3535 F.BasePreprocessedEntityID = StartingID; 3536 3537 if (F.NumPreprocessedEntities > 0) { 3538 // Introduce the global -> local mapping for preprocessed entities in 3539 // this module. 3540 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3541 3542 // Introduce the local -> global mapping for preprocessed entities in 3543 // this module. 3544 F.PreprocessedEntityRemap.insertOrReplace( 3545 std::make_pair(LocalBasePreprocessedEntityID, 3546 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3547 } 3548 3549 break; 3550 } 3551 3552 case PPD_SKIPPED_RANGES: { 3553 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3554 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3555 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3556 3557 if (!PP.getPreprocessingRecord()) 3558 PP.createPreprocessingRecord(); 3559 if (!PP.getPreprocessingRecord()->getExternalSource()) 3560 PP.getPreprocessingRecord()->SetExternalSource(*this); 3561 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3562 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3563 3564 if (F.NumPreprocessedSkippedRanges > 0) 3565 GlobalSkippedRangeMap.insert( 3566 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3567 break; 3568 } 3569 3570 case DECL_UPDATE_OFFSETS: 3571 if (Record.size() % 2 != 0) { 3572 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3573 return Failure; 3574 } 3575 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3576 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3577 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3578 3579 // If we've already loaded the decl, perform the updates when we finish 3580 // loading this block. 3581 if (Decl *D = GetExistingDecl(ID)) 3582 PendingUpdateRecords.push_back( 3583 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3584 } 3585 break; 3586 3587 case OBJC_CATEGORIES_MAP: 3588 if (F.LocalNumObjCCategoriesInMap != 0) { 3589 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3590 return Failure; 3591 } 3592 3593 F.LocalNumObjCCategoriesInMap = Record[0]; 3594 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3595 break; 3596 3597 case OBJC_CATEGORIES: 3598 F.ObjCCategories.swap(Record); 3599 break; 3600 3601 case CUDA_SPECIAL_DECL_REFS: 3602 // Later tables overwrite earlier ones. 3603 // FIXME: Modules will have trouble with this. 3604 CUDASpecialDeclRefs.clear(); 3605 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3606 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3607 break; 3608 3609 case HEADER_SEARCH_TABLE: 3610 F.HeaderFileInfoTableData = Blob.data(); 3611 F.LocalNumHeaderFileInfos = Record[1]; 3612 if (Record[0]) { 3613 F.HeaderFileInfoTable 3614 = HeaderFileInfoLookupTable::Create( 3615 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3616 (const unsigned char *)F.HeaderFileInfoTableData, 3617 HeaderFileInfoTrait(*this, F, 3618 &PP.getHeaderSearchInfo(), 3619 Blob.data() + Record[2])); 3620 3621 PP.getHeaderSearchInfo().SetExternalSource(this); 3622 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3623 PP.getHeaderSearchInfo().SetExternalLookup(this); 3624 } 3625 break; 3626 3627 case FP_PRAGMA_OPTIONS: 3628 // Later tables overwrite earlier ones. 3629 FPPragmaOptions.swap(Record); 3630 break; 3631 3632 case OPENCL_EXTENSIONS: 3633 for (unsigned I = 0, E = Record.size(); I != E; ) { 3634 auto Name = ReadString(Record, I); 3635 auto &OptInfo = OpenCLExtensions.OptMap[Name]; 3636 OptInfo.Supported = Record[I++] != 0; 3637 OptInfo.Enabled = Record[I++] != 0; 3638 OptInfo.WithPragma = Record[I++] != 0; 3639 OptInfo.Avail = Record[I++]; 3640 OptInfo.Core = Record[I++]; 3641 OptInfo.Opt = Record[I++]; 3642 } 3643 break; 3644 3645 case TENTATIVE_DEFINITIONS: 3646 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3647 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3648 break; 3649 3650 case KNOWN_NAMESPACES: 3651 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3652 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3653 break; 3654 3655 case UNDEFINED_BUT_USED: 3656 if (UndefinedButUsed.size() % 2 != 0) { 3657 Error("Invalid existing UndefinedButUsed"); 3658 return Failure; 3659 } 3660 3661 if (Record.size() % 2 != 0) { 3662 Error("invalid undefined-but-used record"); 3663 return Failure; 3664 } 3665 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3666 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3667 UndefinedButUsed.push_back( 3668 ReadSourceLocation(F, Record, I).getRawEncoding()); 3669 } 3670 break; 3671 3672 case DELETE_EXPRS_TO_ANALYZE: 3673 for (unsigned I = 0, N = Record.size(); I != N;) { 3674 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3675 const uint64_t Count = Record[I++]; 3676 DelayedDeleteExprs.push_back(Count); 3677 for (uint64_t C = 0; C < Count; ++C) { 3678 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3679 bool IsArrayForm = Record[I++] == 1; 3680 DelayedDeleteExprs.push_back(IsArrayForm); 3681 } 3682 } 3683 break; 3684 3685 case IMPORTED_MODULES: 3686 if (!F.isModule()) { 3687 // If we aren't loading a module (which has its own exports), make 3688 // all of the imported modules visible. 3689 // FIXME: Deal with macros-only imports. 3690 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3691 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3692 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3693 if (GlobalID) { 3694 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3695 if (DeserializationListener) 3696 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3697 } 3698 } 3699 } 3700 break; 3701 3702 case MACRO_OFFSET: { 3703 if (F.LocalNumMacros != 0) { 3704 Error("duplicate MACRO_OFFSET record in AST file"); 3705 return Failure; 3706 } 3707 F.MacroOffsets = (const uint32_t *)Blob.data(); 3708 F.LocalNumMacros = Record[0]; 3709 unsigned LocalBaseMacroID = Record[1]; 3710 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset; 3711 F.BaseMacroID = getTotalNumMacros(); 3712 3713 if (F.LocalNumMacros > 0) { 3714 // Introduce the global -> local mapping for macros within this module. 3715 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3716 3717 // Introduce the local -> global mapping for macros within this module. 3718 F.MacroRemap.insertOrReplace( 3719 std::make_pair(LocalBaseMacroID, 3720 F.BaseMacroID - LocalBaseMacroID)); 3721 3722 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3723 } 3724 break; 3725 } 3726 3727 case LATE_PARSED_TEMPLATE: 3728 LateParsedTemplates.emplace_back( 3729 std::piecewise_construct, std::forward_as_tuple(&F), 3730 std::forward_as_tuple(Record.begin(), Record.end())); 3731 break; 3732 3733 case OPTIMIZE_PRAGMA_OPTIONS: 3734 if (Record.size() != 1) { 3735 Error("invalid pragma optimize record"); 3736 return Failure; 3737 } 3738 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3739 break; 3740 3741 case MSSTRUCT_PRAGMA_OPTIONS: 3742 if (Record.size() != 1) { 3743 Error("invalid pragma ms_struct record"); 3744 return Failure; 3745 } 3746 PragmaMSStructState = Record[0]; 3747 break; 3748 3749 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3750 if (Record.size() != 2) { 3751 Error("invalid pragma ms_struct record"); 3752 return Failure; 3753 } 3754 PragmaMSPointersToMembersState = Record[0]; 3755 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3756 break; 3757 3758 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3759 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3760 UnusedLocalTypedefNameCandidates.push_back( 3761 getGlobalDeclID(F, Record[I])); 3762 break; 3763 3764 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3765 if (Record.size() != 1) { 3766 Error("invalid cuda pragma options record"); 3767 return Failure; 3768 } 3769 ForceCUDAHostDeviceDepth = Record[0]; 3770 break; 3771 3772 case ALIGN_PACK_PRAGMA_OPTIONS: { 3773 if (Record.size() < 3) { 3774 Error("invalid pragma pack record"); 3775 return Failure; 3776 } 3777 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]); 3778 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3779 unsigned NumStackEntries = Record[2]; 3780 unsigned Idx = 3; 3781 // Reset the stack when importing a new module. 3782 PragmaAlignPackStack.clear(); 3783 for (unsigned I = 0; I < NumStackEntries; ++I) { 3784 PragmaAlignPackStackEntry Entry; 3785 Entry.Value = ReadAlignPackInfo(Record[Idx++]); 3786 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3787 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3788 PragmaAlignPackStrings.push_back(ReadString(Record, Idx)); 3789 Entry.SlotLabel = PragmaAlignPackStrings.back(); 3790 PragmaAlignPackStack.push_back(Entry); 3791 } 3792 break; 3793 } 3794 3795 case FLOAT_CONTROL_PRAGMA_OPTIONS: { 3796 if (Record.size() < 3) { 3797 Error("invalid pragma pack record"); 3798 return Failure; 3799 } 3800 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]); 3801 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3802 unsigned NumStackEntries = Record[2]; 3803 unsigned Idx = 3; 3804 // Reset the stack when importing a new module. 3805 FpPragmaStack.clear(); 3806 for (unsigned I = 0; I < NumStackEntries; ++I) { 3807 FpPragmaStackEntry Entry; 3808 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]); 3809 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3810 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3811 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3812 Entry.SlotLabel = FpPragmaStrings.back(); 3813 FpPragmaStack.push_back(Entry); 3814 } 3815 break; 3816 } 3817 3818 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3819 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3820 DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I])); 3821 break; 3822 } 3823 } 3824 } 3825 3826 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3827 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3828 3829 // Additional remapping information. 3830 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3831 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3832 F.ModuleOffsetMap = StringRef(); 3833 3834 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3835 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3836 F.SLocRemap.insert(std::make_pair(0U, 0)); 3837 F.SLocRemap.insert(std::make_pair(2U, 1)); 3838 } 3839 3840 // Continuous range maps we may be updating in our module. 3841 using SLocRemapBuilder = 3842 ContinuousRangeMap<SourceLocation::UIntTy, SourceLocation::IntTy, 3843 2>::Builder; 3844 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3845 SLocRemapBuilder SLocRemap(F.SLocRemap); 3846 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3847 RemapBuilder MacroRemap(F.MacroRemap); 3848 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3849 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3850 RemapBuilder SelectorRemap(F.SelectorRemap); 3851 RemapBuilder DeclRemap(F.DeclRemap); 3852 RemapBuilder TypeRemap(F.TypeRemap); 3853 3854 while (Data < DataEnd) { 3855 // FIXME: Looking up dependency modules by filename is horrible. Let's 3856 // start fixing this with prebuilt, explicit and implicit modules and see 3857 // how it goes... 3858 using namespace llvm::support; 3859 ModuleKind Kind = static_cast<ModuleKind>( 3860 endian::readNext<uint8_t, little, unaligned>(Data)); 3861 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3862 StringRef Name = StringRef((const char*)Data, Len); 3863 Data += Len; 3864 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule || 3865 Kind == MK_ImplicitModule 3866 ? ModuleMgr.lookupByModuleName(Name) 3867 : ModuleMgr.lookupByFileName(Name)); 3868 if (!OM) { 3869 std::string Msg = 3870 "SourceLocation remap refers to unknown module, cannot find "; 3871 Msg.append(std::string(Name)); 3872 Error(Msg); 3873 return; 3874 } 3875 3876 SourceLocation::UIntTy SLocOffset = 3877 endian::readNext<uint32_t, little, unaligned>(Data); 3878 uint32_t IdentifierIDOffset = 3879 endian::readNext<uint32_t, little, unaligned>(Data); 3880 uint32_t MacroIDOffset = 3881 endian::readNext<uint32_t, little, unaligned>(Data); 3882 uint32_t PreprocessedEntityIDOffset = 3883 endian::readNext<uint32_t, little, unaligned>(Data); 3884 uint32_t SubmoduleIDOffset = 3885 endian::readNext<uint32_t, little, unaligned>(Data); 3886 uint32_t SelectorIDOffset = 3887 endian::readNext<uint32_t, little, unaligned>(Data); 3888 uint32_t DeclIDOffset = 3889 endian::readNext<uint32_t, little, unaligned>(Data); 3890 uint32_t TypeIndexOffset = 3891 endian::readNext<uint32_t, little, unaligned>(Data); 3892 3893 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3894 RemapBuilder &Remap) { 3895 constexpr uint32_t None = std::numeric_limits<uint32_t>::max(); 3896 if (Offset != None) 3897 Remap.insert(std::make_pair(Offset, 3898 static_cast<int>(BaseOffset - Offset))); 3899 }; 3900 3901 constexpr SourceLocation::UIntTy SLocNone = 3902 std::numeric_limits<SourceLocation::UIntTy>::max(); 3903 if (SLocOffset != SLocNone) 3904 SLocRemap.insert(std::make_pair( 3905 SLocOffset, static_cast<SourceLocation::IntTy>( 3906 OM->SLocEntryBaseOffset - SLocOffset))); 3907 3908 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3909 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3910 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3911 PreprocessedEntityRemap); 3912 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3913 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3914 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3915 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3916 3917 // Global -> local mappings. 3918 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3919 } 3920 } 3921 3922 ASTReader::ASTReadResult 3923 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3924 const ModuleFile *ImportedBy, 3925 unsigned ClientLoadCapabilities) { 3926 unsigned Idx = 0; 3927 F.ModuleMapPath = ReadPath(F, Record, Idx); 3928 3929 // Try to resolve ModuleName in the current header search context and 3930 // verify that it is found in the same module map file as we saved. If the 3931 // top-level AST file is a main file, skip this check because there is no 3932 // usable header search context. 3933 assert(!F.ModuleName.empty() && 3934 "MODULE_NAME should come before MODULE_MAP_FILE"); 3935 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3936 // An implicitly-loaded module file should have its module listed in some 3937 // module map file that we've already loaded. 3938 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3939 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3940 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3941 // Don't emit module relocation error if we have -fno-validate-pch 3942 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 3943 DisableValidationForModuleKind::Module) && 3944 !ModMap) { 3945 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) { 3946 if (auto ASTFE = M ? M->getASTFile() : None) { 3947 // This module was defined by an imported (explicit) module. 3948 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3949 << ASTFE->getName(); 3950 } else { 3951 // This module was built with a different module map. 3952 Diag(diag::err_imported_module_not_found) 3953 << F.ModuleName << F.FileName 3954 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3955 << !ImportedBy; 3956 // In case it was imported by a PCH, there's a chance the user is 3957 // just missing to include the search path to the directory containing 3958 // the modulemap. 3959 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3960 Diag(diag::note_imported_by_pch_module_not_found) 3961 << llvm::sys::path::parent_path(F.ModuleMapPath); 3962 } 3963 } 3964 return OutOfDate; 3965 } 3966 3967 assert(M && M->Name == F.ModuleName && "found module with different name"); 3968 3969 // Check the primary module map file. 3970 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3971 if (!StoredModMap || *StoredModMap != ModMap) { 3972 assert(ModMap && "found module is missing module map file"); 3973 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3974 "top-level import should be verified"); 3975 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3976 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3977 Diag(diag::err_imported_module_modmap_changed) 3978 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3979 << ModMap->getName() << F.ModuleMapPath << NotImported; 3980 return OutOfDate; 3981 } 3982 3983 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3984 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3985 // FIXME: we should use input files rather than storing names. 3986 std::string Filename = ReadPath(F, Record, Idx); 3987 auto SF = FileMgr.getFile(Filename, false, false); 3988 if (!SF) { 3989 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3990 Error("could not find file '" + Filename +"' referenced by AST file"); 3991 return OutOfDate; 3992 } 3993 AdditionalStoredMaps.insert(*SF); 3994 } 3995 3996 // Check any additional module map files (e.g. module.private.modulemap) 3997 // that are not in the pcm. 3998 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3999 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 4000 // Remove files that match 4001 // Note: SmallPtrSet::erase is really remove 4002 if (!AdditionalStoredMaps.erase(ModMap)) { 4003 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 4004 Diag(diag::err_module_different_modmap) 4005 << F.ModuleName << /*new*/0 << ModMap->getName(); 4006 return OutOfDate; 4007 } 4008 } 4009 } 4010 4011 // Check any additional module map files that are in the pcm, but not 4012 // found in header search. Cases that match are already removed. 4013 for (const FileEntry *ModMap : AdditionalStoredMaps) { 4014 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 4015 Diag(diag::err_module_different_modmap) 4016 << F.ModuleName << /*not new*/1 << ModMap->getName(); 4017 return OutOfDate; 4018 } 4019 } 4020 4021 if (Listener) 4022 Listener->ReadModuleMapFile(F.ModuleMapPath); 4023 return Success; 4024 } 4025 4026 /// Move the given method to the back of the global list of methods. 4027 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4028 // Find the entry for this selector in the method pool. 4029 Sema::GlobalMethodPool::iterator Known 4030 = S.MethodPool.find(Method->getSelector()); 4031 if (Known == S.MethodPool.end()) 4032 return; 4033 4034 // Retrieve the appropriate method list. 4035 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4036 : Known->second.second; 4037 bool Found = false; 4038 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4039 if (!Found) { 4040 if (List->getMethod() == Method) { 4041 Found = true; 4042 } else { 4043 // Keep searching. 4044 continue; 4045 } 4046 } 4047 4048 if (List->getNext()) 4049 List->setMethod(List->getNext()->getMethod()); 4050 else 4051 List->setMethod(Method); 4052 } 4053 } 4054 4055 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4056 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4057 for (Decl *D : Names) { 4058 bool wasHidden = !D->isUnconditionallyVisible(); 4059 D->setVisibleDespiteOwningModule(); 4060 4061 if (wasHidden && SemaObj) { 4062 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4063 moveMethodToBackOfGlobalList(*SemaObj, Method); 4064 } 4065 } 4066 } 4067 } 4068 4069 void ASTReader::makeModuleVisible(Module *Mod, 4070 Module::NameVisibilityKind NameVisibility, 4071 SourceLocation ImportLoc) { 4072 llvm::SmallPtrSet<Module *, 4> Visited; 4073 SmallVector<Module *, 4> Stack; 4074 Stack.push_back(Mod); 4075 while (!Stack.empty()) { 4076 Mod = Stack.pop_back_val(); 4077 4078 if (NameVisibility <= Mod->NameVisibility) { 4079 // This module already has this level of visibility (or greater), so 4080 // there is nothing more to do. 4081 continue; 4082 } 4083 4084 if (Mod->isUnimportable()) { 4085 // Modules that aren't importable cannot be made visible. 4086 continue; 4087 } 4088 4089 // Update the module's name visibility. 4090 Mod->NameVisibility = NameVisibility; 4091 4092 // If we've already deserialized any names from this module, 4093 // mark them as visible. 4094 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4095 if (Hidden != HiddenNamesMap.end()) { 4096 auto HiddenNames = std::move(*Hidden); 4097 HiddenNamesMap.erase(Hidden); 4098 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4099 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4100 "making names visible added hidden names"); 4101 } 4102 4103 // Push any exported modules onto the stack to be marked as visible. 4104 SmallVector<Module *, 16> Exports; 4105 Mod->getExportedModules(Exports); 4106 for (SmallVectorImpl<Module *>::iterator 4107 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4108 Module *Exported = *I; 4109 if (Visited.insert(Exported).second) 4110 Stack.push_back(Exported); 4111 } 4112 } 4113 } 4114 4115 /// We've merged the definition \p MergedDef into the existing definition 4116 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4117 /// visible. 4118 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4119 NamedDecl *MergedDef) { 4120 if (!Def->isUnconditionallyVisible()) { 4121 // If MergedDef is visible or becomes visible, make the definition visible. 4122 if (MergedDef->isUnconditionallyVisible()) 4123 Def->setVisibleDespiteOwningModule(); 4124 else { 4125 getContext().mergeDefinitionIntoModule( 4126 Def, MergedDef->getImportedOwningModule(), 4127 /*NotifyListeners*/ false); 4128 PendingMergedDefinitionsToDeduplicate.insert(Def); 4129 } 4130 } 4131 } 4132 4133 bool ASTReader::loadGlobalIndex() { 4134 if (GlobalIndex) 4135 return false; 4136 4137 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4138 !PP.getLangOpts().Modules) 4139 return true; 4140 4141 // Try to load the global index. 4142 TriedLoadingGlobalIndex = true; 4143 StringRef ModuleCachePath 4144 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4145 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4146 GlobalModuleIndex::readIndex(ModuleCachePath); 4147 if (llvm::Error Err = std::move(Result.second)) { 4148 assert(!Result.first); 4149 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4150 return true; 4151 } 4152 4153 GlobalIndex.reset(Result.first); 4154 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4155 return false; 4156 } 4157 4158 bool ASTReader::isGlobalIndexUnavailable() const { 4159 return PP.getLangOpts().Modules && UseGlobalIndex && 4160 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4161 } 4162 4163 static void updateModuleTimestamp(ModuleFile &MF) { 4164 // Overwrite the timestamp file contents so that file's mtime changes. 4165 std::string TimestampFilename = MF.getTimestampFilename(); 4166 std::error_code EC; 4167 llvm::raw_fd_ostream OS(TimestampFilename, EC, 4168 llvm::sys::fs::OF_TextWithCRLF); 4169 if (EC) 4170 return; 4171 OS << "Timestamp file\n"; 4172 OS.close(); 4173 OS.clear_error(); // Avoid triggering a fatal error. 4174 } 4175 4176 /// Given a cursor at the start of an AST file, scan ahead and drop the 4177 /// cursor into the start of the given block ID, returning false on success and 4178 /// true on failure. 4179 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4180 while (true) { 4181 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4182 if (!MaybeEntry) { 4183 // FIXME this drops errors on the floor. 4184 consumeError(MaybeEntry.takeError()); 4185 return true; 4186 } 4187 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4188 4189 switch (Entry.Kind) { 4190 case llvm::BitstreamEntry::Error: 4191 case llvm::BitstreamEntry::EndBlock: 4192 return true; 4193 4194 case llvm::BitstreamEntry::Record: 4195 // Ignore top-level records. 4196 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4197 break; 4198 else { 4199 // FIXME this drops errors on the floor. 4200 consumeError(Skipped.takeError()); 4201 return true; 4202 } 4203 4204 case llvm::BitstreamEntry::SubBlock: 4205 if (Entry.ID == BlockID) { 4206 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4207 // FIXME this drops the error on the floor. 4208 consumeError(std::move(Err)); 4209 return true; 4210 } 4211 // Found it! 4212 return false; 4213 } 4214 4215 if (llvm::Error Err = Cursor.SkipBlock()) { 4216 // FIXME this drops the error on the floor. 4217 consumeError(std::move(Err)); 4218 return true; 4219 } 4220 } 4221 } 4222 } 4223 4224 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4225 ModuleKind Type, 4226 SourceLocation ImportLoc, 4227 unsigned ClientLoadCapabilities, 4228 SmallVectorImpl<ImportedSubmodule> *Imported) { 4229 llvm::SaveAndRestore<SourceLocation> 4230 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4231 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII( 4232 CurrentDeserializingModuleKind, Type); 4233 4234 // Defer any pending actions until we get to the end of reading the AST file. 4235 Deserializing AnASTFile(this); 4236 4237 // Bump the generation number. 4238 unsigned PreviousGeneration = 0; 4239 if (ContextObj) 4240 PreviousGeneration = incrementGeneration(*ContextObj); 4241 4242 unsigned NumModules = ModuleMgr.size(); 4243 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) { 4244 assert(ReadResult && "expected to return error"); 4245 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4246 PP.getLangOpts().Modules 4247 ? &PP.getHeaderSearchInfo().getModuleMap() 4248 : nullptr); 4249 4250 // If we find that any modules are unusable, the global index is going 4251 // to be out-of-date. Just remove it. 4252 GlobalIndex.reset(); 4253 ModuleMgr.setGlobalIndex(nullptr); 4254 return ReadResult; 4255 }; 4256 4257 SmallVector<ImportedModule, 4> Loaded; 4258 switch (ASTReadResult ReadResult = 4259 ReadASTCore(FileName, Type, ImportLoc, 4260 /*ImportedBy=*/nullptr, Loaded, 0, 0, 4261 ASTFileSignature(), ClientLoadCapabilities)) { 4262 case Failure: 4263 case Missing: 4264 case OutOfDate: 4265 case VersionMismatch: 4266 case ConfigurationMismatch: 4267 case HadErrors: 4268 return removeModulesAndReturn(ReadResult); 4269 case Success: 4270 break; 4271 } 4272 4273 // Here comes stuff that we only do once the entire chain is loaded. 4274 4275 // Load the AST blocks of all of the modules that we loaded. We can still 4276 // hit errors parsing the ASTs at this point. 4277 for (ImportedModule &M : Loaded) { 4278 ModuleFile &F = *M.Mod; 4279 4280 // Read the AST block. 4281 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 4282 return removeModulesAndReturn(Result); 4283 4284 // The AST block should always have a definition for the main module. 4285 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4286 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4287 return removeModulesAndReturn(Failure); 4288 } 4289 4290 // Read the extension blocks. 4291 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4292 if (ASTReadResult Result = ReadExtensionBlock(F)) 4293 return removeModulesAndReturn(Result); 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 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4758 if (!MaybeRecordType) { 4759 // FIXME this drops the error. 4760 return Failure; 4761 } 4762 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4763 case SIGNATURE: 4764 if (F) 4765 F->Signature = ASTFileSignature::create(Record.begin(), Record.end()); 4766 break; 4767 case AST_BLOCK_HASH: 4768 if (F) 4769 F->ASTBlockHash = 4770 ASTFileSignature::create(Record.begin(), Record.end()); 4771 break; 4772 case DIAGNOSTIC_OPTIONS: { 4773 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4774 if (Listener && ValidateDiagnosticOptions && 4775 !AllowCompatibleConfigurationMismatch && 4776 ParseDiagnosticOptions(Record, Complain, *Listener)) 4777 Result = OutOfDate; // Don't return early. Read the signature. 4778 break; 4779 } 4780 case DIAG_PRAGMA_MAPPINGS: 4781 if (!F) 4782 break; 4783 if (F->PragmaDiagMappings.empty()) 4784 F->PragmaDiagMappings.swap(Record); 4785 else 4786 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4787 Record.begin(), Record.end()); 4788 break; 4789 } 4790 } 4791 } 4792 4793 /// Parse a record and blob containing module file extension metadata. 4794 static bool parseModuleFileExtensionMetadata( 4795 const SmallVectorImpl<uint64_t> &Record, 4796 StringRef Blob, 4797 ModuleFileExtensionMetadata &Metadata) { 4798 if (Record.size() < 4) return true; 4799 4800 Metadata.MajorVersion = Record[0]; 4801 Metadata.MinorVersion = Record[1]; 4802 4803 unsigned BlockNameLen = Record[2]; 4804 unsigned UserInfoLen = Record[3]; 4805 4806 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4807 4808 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4809 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4810 Blob.data() + BlockNameLen + UserInfoLen); 4811 return false; 4812 } 4813 4814 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4815 BitstreamCursor &Stream = F.Stream; 4816 4817 RecordData Record; 4818 while (true) { 4819 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4820 if (!MaybeEntry) { 4821 Error(MaybeEntry.takeError()); 4822 return Failure; 4823 } 4824 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4825 4826 switch (Entry.Kind) { 4827 case llvm::BitstreamEntry::SubBlock: 4828 if (llvm::Error Err = Stream.SkipBlock()) { 4829 Error(std::move(Err)); 4830 return Failure; 4831 } 4832 continue; 4833 4834 case llvm::BitstreamEntry::EndBlock: 4835 return Success; 4836 4837 case llvm::BitstreamEntry::Error: 4838 return HadErrors; 4839 4840 case llvm::BitstreamEntry::Record: 4841 break; 4842 } 4843 4844 Record.clear(); 4845 StringRef Blob; 4846 Expected<unsigned> MaybeRecCode = 4847 Stream.readRecord(Entry.ID, Record, &Blob); 4848 if (!MaybeRecCode) { 4849 Error(MaybeRecCode.takeError()); 4850 return Failure; 4851 } 4852 switch (MaybeRecCode.get()) { 4853 case EXTENSION_METADATA: { 4854 ModuleFileExtensionMetadata Metadata; 4855 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) { 4856 Error("malformed EXTENSION_METADATA in AST file"); 4857 return Failure; 4858 } 4859 4860 // Find a module file extension with this block name. 4861 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4862 if (Known == ModuleFileExtensions.end()) break; 4863 4864 // Form a reader. 4865 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4866 F, Stream)) { 4867 F.ExtensionReaders.push_back(std::move(Reader)); 4868 } 4869 4870 break; 4871 } 4872 } 4873 } 4874 4875 return Success; 4876 } 4877 4878 void ASTReader::InitializeContext() { 4879 assert(ContextObj && "no context to initialize"); 4880 ASTContext &Context = *ContextObj; 4881 4882 // If there's a listener, notify them that we "read" the translation unit. 4883 if (DeserializationListener) 4884 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4885 Context.getTranslationUnitDecl()); 4886 4887 // FIXME: Find a better way to deal with collisions between these 4888 // built-in types. Right now, we just ignore the problem. 4889 4890 // Load the special types. 4891 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4892 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4893 if (!Context.CFConstantStringTypeDecl) 4894 Context.setCFConstantStringType(GetType(String)); 4895 } 4896 4897 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4898 QualType FileType = GetType(File); 4899 if (FileType.isNull()) { 4900 Error("FILE type is NULL"); 4901 return; 4902 } 4903 4904 if (!Context.FILEDecl) { 4905 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4906 Context.setFILEDecl(Typedef->getDecl()); 4907 else { 4908 const TagType *Tag = FileType->getAs<TagType>(); 4909 if (!Tag) { 4910 Error("Invalid FILE type in AST file"); 4911 return; 4912 } 4913 Context.setFILEDecl(Tag->getDecl()); 4914 } 4915 } 4916 } 4917 4918 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4919 QualType Jmp_bufType = GetType(Jmp_buf); 4920 if (Jmp_bufType.isNull()) { 4921 Error("jmp_buf type is NULL"); 4922 return; 4923 } 4924 4925 if (!Context.jmp_bufDecl) { 4926 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4927 Context.setjmp_bufDecl(Typedef->getDecl()); 4928 else { 4929 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4930 if (!Tag) { 4931 Error("Invalid jmp_buf type in AST file"); 4932 return; 4933 } 4934 Context.setjmp_bufDecl(Tag->getDecl()); 4935 } 4936 } 4937 } 4938 4939 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4940 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4941 if (Sigjmp_bufType.isNull()) { 4942 Error("sigjmp_buf type is NULL"); 4943 return; 4944 } 4945 4946 if (!Context.sigjmp_bufDecl) { 4947 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4948 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4949 else { 4950 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4951 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4952 Context.setsigjmp_bufDecl(Tag->getDecl()); 4953 } 4954 } 4955 } 4956 4957 if (unsigned ObjCIdRedef 4958 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4959 if (Context.ObjCIdRedefinitionType.isNull()) 4960 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4961 } 4962 4963 if (unsigned ObjCClassRedef 4964 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4965 if (Context.ObjCClassRedefinitionType.isNull()) 4966 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4967 } 4968 4969 if (unsigned ObjCSelRedef 4970 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4971 if (Context.ObjCSelRedefinitionType.isNull()) 4972 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4973 } 4974 4975 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4976 QualType Ucontext_tType = GetType(Ucontext_t); 4977 if (Ucontext_tType.isNull()) { 4978 Error("ucontext_t type is NULL"); 4979 return; 4980 } 4981 4982 if (!Context.ucontext_tDecl) { 4983 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4984 Context.setucontext_tDecl(Typedef->getDecl()); 4985 else { 4986 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4987 assert(Tag && "Invalid ucontext_t type in AST file"); 4988 Context.setucontext_tDecl(Tag->getDecl()); 4989 } 4990 } 4991 } 4992 } 4993 4994 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4995 4996 // If there were any CUDA special declarations, deserialize them. 4997 if (!CUDASpecialDeclRefs.empty()) { 4998 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4999 Context.setcudaConfigureCallDecl( 5000 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 5001 } 5002 5003 // Re-export any modules that were imported by a non-module AST file. 5004 // FIXME: This does not make macro-only imports visible again. 5005 for (auto &Import : ImportedModules) { 5006 if (Module *Imported = getSubmodule(Import.ID)) { 5007 makeModuleVisible(Imported, Module::AllVisible, 5008 /*ImportLoc=*/Import.ImportLoc); 5009 if (Import.ImportLoc.isValid()) 5010 PP.makeModuleVisible(Imported, Import.ImportLoc); 5011 // This updates visibility for Preprocessor only. For Sema, which can be 5012 // nullptr here, we do the same later, in UpdateSema(). 5013 } 5014 } 5015 } 5016 5017 void ASTReader::finalizeForWriting() { 5018 // Nothing to do for now. 5019 } 5020 5021 /// Reads and return the signature record from \p PCH's control block, or 5022 /// else returns 0. 5023 static ASTFileSignature readASTFileSignature(StringRef PCH) { 5024 BitstreamCursor Stream(PCH); 5025 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5026 // FIXME this drops the error on the floor. 5027 consumeError(std::move(Err)); 5028 return ASTFileSignature(); 5029 } 5030 5031 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5032 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 5033 return ASTFileSignature(); 5034 5035 // Scan for SIGNATURE inside the diagnostic options block. 5036 ASTReader::RecordData Record; 5037 while (true) { 5038 Expected<llvm::BitstreamEntry> MaybeEntry = 5039 Stream.advanceSkippingSubblocks(); 5040 if (!MaybeEntry) { 5041 // FIXME this drops the error on the floor. 5042 consumeError(MaybeEntry.takeError()); 5043 return ASTFileSignature(); 5044 } 5045 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5046 5047 if (Entry.Kind != llvm::BitstreamEntry::Record) 5048 return ASTFileSignature(); 5049 5050 Record.clear(); 5051 StringRef Blob; 5052 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5053 if (!MaybeRecord) { 5054 // FIXME this drops the error on the floor. 5055 consumeError(MaybeRecord.takeError()); 5056 return ASTFileSignature(); 5057 } 5058 if (SIGNATURE == MaybeRecord.get()) 5059 return ASTFileSignature::create(Record.begin(), 5060 Record.begin() + ASTFileSignature::size); 5061 } 5062 } 5063 5064 /// Retrieve the name of the original source file name 5065 /// directly from the AST file, without actually loading the AST 5066 /// file. 5067 std::string ASTReader::getOriginalSourceFile( 5068 const std::string &ASTFileName, FileManager &FileMgr, 5069 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5070 // Open the AST file. 5071 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5072 if (!Buffer) { 5073 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5074 << ASTFileName << Buffer.getError().message(); 5075 return std::string(); 5076 } 5077 5078 // Initialize the stream 5079 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5080 5081 // Sniff for the signature. 5082 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5083 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5084 return std::string(); 5085 } 5086 5087 // Scan for the CONTROL_BLOCK_ID block. 5088 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5089 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5090 return std::string(); 5091 } 5092 5093 // Scan for ORIGINAL_FILE inside the control block. 5094 RecordData Record; 5095 while (true) { 5096 Expected<llvm::BitstreamEntry> MaybeEntry = 5097 Stream.advanceSkippingSubblocks(); 5098 if (!MaybeEntry) { 5099 // FIXME this drops errors on the floor. 5100 consumeError(MaybeEntry.takeError()); 5101 return std::string(); 5102 } 5103 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5104 5105 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5106 return std::string(); 5107 5108 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5109 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5110 return std::string(); 5111 } 5112 5113 Record.clear(); 5114 StringRef Blob; 5115 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5116 if (!MaybeRecord) { 5117 // FIXME this drops the errors on the floor. 5118 consumeError(MaybeRecord.takeError()); 5119 return std::string(); 5120 } 5121 if (ORIGINAL_FILE == MaybeRecord.get()) 5122 return Blob.str(); 5123 } 5124 } 5125 5126 namespace { 5127 5128 class SimplePCHValidator : public ASTReaderListener { 5129 const LangOptions &ExistingLangOpts; 5130 const TargetOptions &ExistingTargetOpts; 5131 const PreprocessorOptions &ExistingPPOpts; 5132 std::string ExistingModuleCachePath; 5133 FileManager &FileMgr; 5134 5135 public: 5136 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5137 const TargetOptions &ExistingTargetOpts, 5138 const PreprocessorOptions &ExistingPPOpts, 5139 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5140 : ExistingLangOpts(ExistingLangOpts), 5141 ExistingTargetOpts(ExistingTargetOpts), 5142 ExistingPPOpts(ExistingPPOpts), 5143 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5144 5145 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5146 bool AllowCompatibleDifferences) override { 5147 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5148 AllowCompatibleDifferences); 5149 } 5150 5151 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5152 bool AllowCompatibleDifferences) override { 5153 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5154 AllowCompatibleDifferences); 5155 } 5156 5157 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5158 StringRef SpecificModuleCachePath, 5159 bool Complain) override { 5160 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5161 ExistingModuleCachePath, nullptr, 5162 ExistingLangOpts, ExistingPPOpts); 5163 } 5164 5165 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5166 bool Complain, 5167 std::string &SuggestedPredefines) override { 5168 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5169 SuggestedPredefines, ExistingLangOpts); 5170 } 5171 }; 5172 5173 } // namespace 5174 5175 bool ASTReader::readASTFileControlBlock( 5176 StringRef Filename, FileManager &FileMgr, 5177 const PCHContainerReader &PCHContainerRdr, 5178 bool FindModuleFileExtensions, 5179 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5180 // Open the AST file. 5181 // FIXME: This allows use of the VFS; we do not allow use of the 5182 // VFS when actually loading a module. 5183 auto Buffer = FileMgr.getBufferForFile(Filename); 5184 if (!Buffer) { 5185 return true; 5186 } 5187 5188 // Initialize the stream 5189 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5190 BitstreamCursor Stream(Bytes); 5191 5192 // Sniff for the signature. 5193 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5194 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5195 return true; 5196 } 5197 5198 // Scan for the CONTROL_BLOCK_ID block. 5199 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5200 return true; 5201 5202 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5203 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5204 bool NeedsImports = Listener.needsImportVisitation(); 5205 BitstreamCursor InputFilesCursor; 5206 5207 RecordData Record; 5208 std::string ModuleDir; 5209 bool DoneWithControlBlock = false; 5210 while (!DoneWithControlBlock) { 5211 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5212 if (!MaybeEntry) { 5213 // FIXME this drops the error on the floor. 5214 consumeError(MaybeEntry.takeError()); 5215 return true; 5216 } 5217 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5218 5219 switch (Entry.Kind) { 5220 case llvm::BitstreamEntry::SubBlock: { 5221 switch (Entry.ID) { 5222 case OPTIONS_BLOCK_ID: { 5223 std::string IgnoredSuggestedPredefines; 5224 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5225 /*AllowCompatibleConfigurationMismatch*/ false, 5226 Listener, IgnoredSuggestedPredefines) != Success) 5227 return true; 5228 break; 5229 } 5230 5231 case INPUT_FILES_BLOCK_ID: 5232 InputFilesCursor = Stream; 5233 if (llvm::Error Err = Stream.SkipBlock()) { 5234 // FIXME this drops the error on the floor. 5235 consumeError(std::move(Err)); 5236 return true; 5237 } 5238 if (NeedsInputFiles && 5239 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5240 return true; 5241 break; 5242 5243 default: 5244 if (llvm::Error Err = Stream.SkipBlock()) { 5245 // FIXME this drops the error on the floor. 5246 consumeError(std::move(Err)); 5247 return true; 5248 } 5249 break; 5250 } 5251 5252 continue; 5253 } 5254 5255 case llvm::BitstreamEntry::EndBlock: 5256 DoneWithControlBlock = true; 5257 break; 5258 5259 case llvm::BitstreamEntry::Error: 5260 return true; 5261 5262 case llvm::BitstreamEntry::Record: 5263 break; 5264 } 5265 5266 if (DoneWithControlBlock) break; 5267 5268 Record.clear(); 5269 StringRef Blob; 5270 Expected<unsigned> MaybeRecCode = 5271 Stream.readRecord(Entry.ID, Record, &Blob); 5272 if (!MaybeRecCode) { 5273 // FIXME this drops the error. 5274 return Failure; 5275 } 5276 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5277 case METADATA: 5278 if (Record[0] != VERSION_MAJOR) 5279 return true; 5280 if (Listener.ReadFullVersionInformation(Blob)) 5281 return true; 5282 break; 5283 case MODULE_NAME: 5284 Listener.ReadModuleName(Blob); 5285 break; 5286 case MODULE_DIRECTORY: 5287 ModuleDir = std::string(Blob); 5288 break; 5289 case MODULE_MAP_FILE: { 5290 unsigned Idx = 0; 5291 auto Path = ReadString(Record, Idx); 5292 ResolveImportedPath(Path, ModuleDir); 5293 Listener.ReadModuleMapFile(Path); 5294 break; 5295 } 5296 case INPUT_FILE_OFFSETS: { 5297 if (!NeedsInputFiles) 5298 break; 5299 5300 unsigned NumInputFiles = Record[0]; 5301 unsigned NumUserFiles = Record[1]; 5302 const llvm::support::unaligned_uint64_t *InputFileOffs = 5303 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5304 for (unsigned I = 0; I != NumInputFiles; ++I) { 5305 // Go find this input file. 5306 bool isSystemFile = I >= NumUserFiles; 5307 5308 if (isSystemFile && !NeedsSystemInputFiles) 5309 break; // the rest are system input files 5310 5311 BitstreamCursor &Cursor = InputFilesCursor; 5312 SavedStreamPosition SavedPosition(Cursor); 5313 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5314 // FIXME this drops errors on the floor. 5315 consumeError(std::move(Err)); 5316 } 5317 5318 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5319 if (!MaybeCode) { 5320 // FIXME this drops errors on the floor. 5321 consumeError(MaybeCode.takeError()); 5322 } 5323 unsigned Code = MaybeCode.get(); 5324 5325 RecordData Record; 5326 StringRef Blob; 5327 bool shouldContinue = false; 5328 Expected<unsigned> MaybeRecordType = 5329 Cursor.readRecord(Code, Record, &Blob); 5330 if (!MaybeRecordType) { 5331 // FIXME this drops errors on the floor. 5332 consumeError(MaybeRecordType.takeError()); 5333 } 5334 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5335 case INPUT_FILE_HASH: 5336 break; 5337 case INPUT_FILE: 5338 bool Overridden = static_cast<bool>(Record[3]); 5339 std::string Filename = std::string(Blob); 5340 ResolveImportedPath(Filename, ModuleDir); 5341 shouldContinue = Listener.visitInputFile( 5342 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5343 break; 5344 } 5345 if (!shouldContinue) 5346 break; 5347 } 5348 break; 5349 } 5350 5351 case IMPORTS: { 5352 if (!NeedsImports) 5353 break; 5354 5355 unsigned Idx = 0, N = Record.size(); 5356 while (Idx < N) { 5357 // Read information about the AST file. 5358 Idx += 5359 1 + 1 + 1 + 1 + 5360 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature 5361 std::string ModuleName = ReadString(Record, Idx); 5362 std::string Filename = ReadString(Record, Idx); 5363 ResolveImportedPath(Filename, ModuleDir); 5364 Listener.visitImport(ModuleName, Filename); 5365 } 5366 break; 5367 } 5368 5369 default: 5370 // No other validation to perform. 5371 break; 5372 } 5373 } 5374 5375 // Look for module file extension blocks, if requested. 5376 if (FindModuleFileExtensions) { 5377 BitstreamCursor SavedStream = Stream; 5378 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5379 bool DoneWithExtensionBlock = false; 5380 while (!DoneWithExtensionBlock) { 5381 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5382 if (!MaybeEntry) { 5383 // FIXME this drops the error. 5384 return true; 5385 } 5386 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5387 5388 switch (Entry.Kind) { 5389 case llvm::BitstreamEntry::SubBlock: 5390 if (llvm::Error Err = Stream.SkipBlock()) { 5391 // FIXME this drops the error on the floor. 5392 consumeError(std::move(Err)); 5393 return true; 5394 } 5395 continue; 5396 5397 case llvm::BitstreamEntry::EndBlock: 5398 DoneWithExtensionBlock = true; 5399 continue; 5400 5401 case llvm::BitstreamEntry::Error: 5402 return true; 5403 5404 case llvm::BitstreamEntry::Record: 5405 break; 5406 } 5407 5408 Record.clear(); 5409 StringRef Blob; 5410 Expected<unsigned> MaybeRecCode = 5411 Stream.readRecord(Entry.ID, Record, &Blob); 5412 if (!MaybeRecCode) { 5413 // FIXME this drops the error. 5414 return true; 5415 } 5416 switch (MaybeRecCode.get()) { 5417 case EXTENSION_METADATA: { 5418 ModuleFileExtensionMetadata Metadata; 5419 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5420 return true; 5421 5422 Listener.readModuleFileExtension(Metadata); 5423 break; 5424 } 5425 } 5426 } 5427 } 5428 Stream = SavedStream; 5429 } 5430 5431 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5432 if (readUnhashedControlBlockImpl( 5433 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5434 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5435 ValidateDiagnosticOptions) != Success) 5436 return true; 5437 5438 return false; 5439 } 5440 5441 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5442 const PCHContainerReader &PCHContainerRdr, 5443 const LangOptions &LangOpts, 5444 const TargetOptions &TargetOpts, 5445 const PreprocessorOptions &PPOpts, 5446 StringRef ExistingModuleCachePath) { 5447 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5448 ExistingModuleCachePath, FileMgr); 5449 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5450 /*FindModuleFileExtensions=*/false, 5451 validator, 5452 /*ValidateDiagnosticOptions=*/true); 5453 } 5454 5455 ASTReader::ASTReadResult 5456 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 5457 // Enter the submodule block. 5458 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 5459 Error(std::move(Err)); 5460 return Failure; 5461 } 5462 5463 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5464 bool First = true; 5465 Module *CurrentModule = nullptr; 5466 RecordData Record; 5467 while (true) { 5468 Expected<llvm::BitstreamEntry> MaybeEntry = 5469 F.Stream.advanceSkippingSubblocks(); 5470 if (!MaybeEntry) { 5471 Error(MaybeEntry.takeError()); 5472 return Failure; 5473 } 5474 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5475 5476 switch (Entry.Kind) { 5477 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5478 case llvm::BitstreamEntry::Error: 5479 Error("malformed block record in AST file"); 5480 return Failure; 5481 case llvm::BitstreamEntry::EndBlock: 5482 return Success; 5483 case llvm::BitstreamEntry::Record: 5484 // The interesting case. 5485 break; 5486 } 5487 5488 // Read a record. 5489 StringRef Blob; 5490 Record.clear(); 5491 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5492 if (!MaybeKind) { 5493 Error(MaybeKind.takeError()); 5494 return Failure; 5495 } 5496 unsigned Kind = MaybeKind.get(); 5497 5498 if ((Kind == SUBMODULE_METADATA) != First) { 5499 Error("submodule metadata record should be at beginning of block"); 5500 return Failure; 5501 } 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 Error("malformed module definition"); 5517 return Failure; 5518 } 5519 5520 StringRef Name = Blob; 5521 unsigned Idx = 0; 5522 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5523 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5524 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5525 bool IsFramework = Record[Idx++]; 5526 bool IsExplicit = Record[Idx++]; 5527 bool IsSystem = Record[Idx++]; 5528 bool IsExternC = Record[Idx++]; 5529 bool InferSubmodules = Record[Idx++]; 5530 bool InferExplicitSubmodules = Record[Idx++]; 5531 bool InferExportWildcard = Record[Idx++]; 5532 bool ConfigMacrosExhaustive = Record[Idx++]; 5533 bool ModuleMapIsPrivate = Record[Idx++]; 5534 5535 Module *ParentModule = nullptr; 5536 if (Parent) 5537 ParentModule = getSubmodule(Parent); 5538 5539 // Retrieve this (sub)module from the module map, creating it if 5540 // necessary. 5541 CurrentModule = 5542 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5543 .first; 5544 5545 // FIXME: set the definition loc for CurrentModule, or call 5546 // ModMap.setInferredModuleAllowedBy() 5547 5548 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5549 if (GlobalIndex >= SubmodulesLoaded.size() || 5550 SubmodulesLoaded[GlobalIndex]) { 5551 Error("too many submodules"); 5552 return Failure; 5553 } 5554 5555 if (!ParentModule) { 5556 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5557 // Don't emit module relocation error if we have -fno-validate-pch 5558 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 5559 DisableValidationForModuleKind::Module) && 5560 CurFile != F.File) { 5561 Error(diag::err_module_file_conflict, 5562 CurrentModule->getTopLevelModuleName(), CurFile->getName(), 5563 F.File->getName()); 5564 return Failure; 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 std::string Filename = std::string(Blob); 5609 ResolveImportedPath(F, Filename); 5610 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5611 if (!CurrentModule->getUmbrellaHeader()) 5612 // FIXME: NameAsWritten 5613 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob, ""); 5614 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) { 5615 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5616 Error("mismatched umbrella headers in submodule"); 5617 return OutOfDate; 5618 } 5619 } 5620 break; 5621 } 5622 5623 case SUBMODULE_HEADER: 5624 case SUBMODULE_EXCLUDED_HEADER: 5625 case SUBMODULE_PRIVATE_HEADER: 5626 // We lazily associate headers with their modules via the HeaderInfo table. 5627 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5628 // of complete filenames or remove it entirely. 5629 break; 5630 5631 case SUBMODULE_TEXTUAL_HEADER: 5632 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5633 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5634 // them here. 5635 break; 5636 5637 case SUBMODULE_TOPHEADER: 5638 CurrentModule->addTopHeaderFilename(Blob); 5639 break; 5640 5641 case SUBMODULE_UMBRELLA_DIR: { 5642 std::string Dirname = std::string(Blob); 5643 ResolveImportedPath(F, Dirname); 5644 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5645 if (!CurrentModule->getUmbrellaDir()) 5646 // FIXME: NameAsWritten 5647 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob, ""); 5648 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) { 5649 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5650 Error("mismatched umbrella directories in submodule"); 5651 return OutOfDate; 5652 } 5653 } 5654 break; 5655 } 5656 5657 case SUBMODULE_METADATA: { 5658 F.BaseSubmoduleID = getTotalNumSubmodules(); 5659 F.LocalNumSubmodules = Record[0]; 5660 unsigned LocalBaseSubmoduleID = Record[1]; 5661 if (F.LocalNumSubmodules > 0) { 5662 // Introduce the global -> local mapping for submodules within this 5663 // module. 5664 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5665 5666 // Introduce the local -> global mapping for submodules within this 5667 // module. 5668 F.SubmoduleRemap.insertOrReplace( 5669 std::make_pair(LocalBaseSubmoduleID, 5670 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5671 5672 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5673 } 5674 break; 5675 } 5676 5677 case SUBMODULE_IMPORTS: 5678 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5679 UnresolvedModuleRef Unresolved; 5680 Unresolved.File = &F; 5681 Unresolved.Mod = CurrentModule; 5682 Unresolved.ID = Record[Idx]; 5683 Unresolved.Kind = UnresolvedModuleRef::Import; 5684 Unresolved.IsWildcard = false; 5685 UnresolvedModuleRefs.push_back(Unresolved); 5686 } 5687 break; 5688 5689 case SUBMODULE_EXPORTS: 5690 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5691 UnresolvedModuleRef Unresolved; 5692 Unresolved.File = &F; 5693 Unresolved.Mod = CurrentModule; 5694 Unresolved.ID = Record[Idx]; 5695 Unresolved.Kind = UnresolvedModuleRef::Export; 5696 Unresolved.IsWildcard = Record[Idx + 1]; 5697 UnresolvedModuleRefs.push_back(Unresolved); 5698 } 5699 5700 // Once we've loaded the set of exports, there's no reason to keep 5701 // the parsed, unresolved exports around. 5702 CurrentModule->UnresolvedExports.clear(); 5703 break; 5704 5705 case SUBMODULE_REQUIRES: 5706 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5707 PP.getTargetInfo()); 5708 break; 5709 5710 case SUBMODULE_LINK_LIBRARY: 5711 ModMap.resolveLinkAsDependencies(CurrentModule); 5712 CurrentModule->LinkLibraries.push_back( 5713 Module::LinkLibrary(std::string(Blob), Record[0])); 5714 break; 5715 5716 case SUBMODULE_CONFIG_MACRO: 5717 CurrentModule->ConfigMacros.push_back(Blob.str()); 5718 break; 5719 5720 case SUBMODULE_CONFLICT: { 5721 UnresolvedModuleRef Unresolved; 5722 Unresolved.File = &F; 5723 Unresolved.Mod = CurrentModule; 5724 Unresolved.ID = Record[0]; 5725 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5726 Unresolved.IsWildcard = false; 5727 Unresolved.String = Blob; 5728 UnresolvedModuleRefs.push_back(Unresolved); 5729 break; 5730 } 5731 5732 case SUBMODULE_INITIALIZERS: { 5733 if (!ContextObj) 5734 break; 5735 SmallVector<uint32_t, 16> Inits; 5736 for (auto &ID : Record) 5737 Inits.push_back(getGlobalDeclID(F, ID)); 5738 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5739 break; 5740 } 5741 5742 case SUBMODULE_EXPORT_AS: 5743 CurrentModule->ExportAsModule = Blob.str(); 5744 ModMap.addLinkAsDependency(CurrentModule); 5745 break; 5746 } 5747 } 5748 } 5749 5750 /// Parse the record that corresponds to a LangOptions data 5751 /// structure. 5752 /// 5753 /// This routine parses the language options from the AST file and then gives 5754 /// them to the AST listener if one is set. 5755 /// 5756 /// \returns true if the listener deems the file unacceptable, false otherwise. 5757 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5758 bool Complain, 5759 ASTReaderListener &Listener, 5760 bool AllowCompatibleDifferences) { 5761 LangOptions LangOpts; 5762 unsigned Idx = 0; 5763 #define LANGOPT(Name, Bits, Default, Description) \ 5764 LangOpts.Name = Record[Idx++]; 5765 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5766 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5767 #include "clang/Basic/LangOptions.def" 5768 #define SANITIZER(NAME, ID) \ 5769 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5770 #include "clang/Basic/Sanitizers.def" 5771 5772 for (unsigned N = Record[Idx++]; N; --N) 5773 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5774 5775 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5776 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5777 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5778 5779 LangOpts.CurrentModule = ReadString(Record, Idx); 5780 5781 // Comment options. 5782 for (unsigned N = Record[Idx++]; N; --N) { 5783 LangOpts.CommentOpts.BlockCommandNames.push_back( 5784 ReadString(Record, Idx)); 5785 } 5786 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5787 5788 // OpenMP offloading options. 5789 for (unsigned N = Record[Idx++]; N; --N) { 5790 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5791 } 5792 5793 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5794 5795 return Listener.ReadLanguageOptions(LangOpts, Complain, 5796 AllowCompatibleDifferences); 5797 } 5798 5799 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5800 ASTReaderListener &Listener, 5801 bool AllowCompatibleDifferences) { 5802 unsigned Idx = 0; 5803 TargetOptions TargetOpts; 5804 TargetOpts.Triple = ReadString(Record, Idx); 5805 TargetOpts.CPU = ReadString(Record, Idx); 5806 TargetOpts.TuneCPU = ReadString(Record, Idx); 5807 TargetOpts.ABI = ReadString(Record, Idx); 5808 for (unsigned N = Record[Idx++]; N; --N) { 5809 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5810 } 5811 for (unsigned N = Record[Idx++]; N; --N) { 5812 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5813 } 5814 5815 return Listener.ReadTargetOptions(TargetOpts, Complain, 5816 AllowCompatibleDifferences); 5817 } 5818 5819 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5820 ASTReaderListener &Listener) { 5821 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5822 unsigned Idx = 0; 5823 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5824 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5825 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5826 #include "clang/Basic/DiagnosticOptions.def" 5827 5828 for (unsigned N = Record[Idx++]; N; --N) 5829 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5830 for (unsigned N = Record[Idx++]; N; --N) 5831 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5832 5833 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5834 } 5835 5836 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5837 ASTReaderListener &Listener) { 5838 FileSystemOptions FSOpts; 5839 unsigned Idx = 0; 5840 FSOpts.WorkingDir = ReadString(Record, Idx); 5841 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5842 } 5843 5844 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5845 bool Complain, 5846 ASTReaderListener &Listener) { 5847 HeaderSearchOptions HSOpts; 5848 unsigned Idx = 0; 5849 HSOpts.Sysroot = ReadString(Record, Idx); 5850 5851 // Include entries. 5852 for (unsigned N = Record[Idx++]; N; --N) { 5853 std::string Path = ReadString(Record, Idx); 5854 frontend::IncludeDirGroup Group 5855 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5856 bool IsFramework = Record[Idx++]; 5857 bool IgnoreSysRoot = Record[Idx++]; 5858 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5859 IgnoreSysRoot); 5860 } 5861 5862 // System header prefixes. 5863 for (unsigned N = Record[Idx++]; N; --N) { 5864 std::string Prefix = ReadString(Record, Idx); 5865 bool IsSystemHeader = Record[Idx++]; 5866 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5867 } 5868 5869 HSOpts.ResourceDir = ReadString(Record, Idx); 5870 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5871 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5872 HSOpts.DisableModuleHash = Record[Idx++]; 5873 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5874 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5875 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++]; 5876 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5877 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5878 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5879 HSOpts.UseLibcxx = Record[Idx++]; 5880 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5881 5882 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5883 Complain); 5884 } 5885 5886 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5887 bool Complain, 5888 ASTReaderListener &Listener, 5889 std::string &SuggestedPredefines) { 5890 PreprocessorOptions PPOpts; 5891 unsigned Idx = 0; 5892 5893 // Macro definitions/undefs 5894 for (unsigned N = Record[Idx++]; N; --N) { 5895 std::string Macro = ReadString(Record, Idx); 5896 bool IsUndef = Record[Idx++]; 5897 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5898 } 5899 5900 // Includes 5901 for (unsigned N = Record[Idx++]; N; --N) { 5902 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5903 } 5904 5905 // Macro Includes 5906 for (unsigned N = Record[Idx++]; N; --N) { 5907 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5908 } 5909 5910 PPOpts.UsePredefines = Record[Idx++]; 5911 PPOpts.DetailedRecord = Record[Idx++]; 5912 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5913 PPOpts.ObjCXXARCStandardLibrary = 5914 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5915 SuggestedPredefines.clear(); 5916 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5917 SuggestedPredefines); 5918 } 5919 5920 std::pair<ModuleFile *, unsigned> 5921 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5922 GlobalPreprocessedEntityMapType::iterator 5923 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5924 assert(I != GlobalPreprocessedEntityMap.end() && 5925 "Corrupted global preprocessed entity map"); 5926 ModuleFile *M = I->second; 5927 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5928 return std::make_pair(M, LocalIndex); 5929 } 5930 5931 llvm::iterator_range<PreprocessingRecord::iterator> 5932 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5933 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5934 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5935 Mod.NumPreprocessedEntities); 5936 5937 return llvm::make_range(PreprocessingRecord::iterator(), 5938 PreprocessingRecord::iterator()); 5939 } 5940 5941 bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName, 5942 unsigned int ClientLoadCapabilities) { 5943 return ClientLoadCapabilities & ARR_OutOfDate && 5944 !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName); 5945 } 5946 5947 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5948 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5949 return llvm::make_range( 5950 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5951 ModuleDeclIterator(this, &Mod, 5952 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5953 } 5954 5955 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5956 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5957 assert(I != GlobalSkippedRangeMap.end() && 5958 "Corrupted global skipped range map"); 5959 ModuleFile *M = I->second; 5960 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5961 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5962 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5963 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5964 TranslateSourceLocation(*M, RawRange.getEnd())); 5965 assert(Range.isValid()); 5966 return Range; 5967 } 5968 5969 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5970 PreprocessedEntityID PPID = Index+1; 5971 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5972 ModuleFile &M = *PPInfo.first; 5973 unsigned LocalIndex = PPInfo.second; 5974 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5975 5976 if (!PP.getPreprocessingRecord()) { 5977 Error("no preprocessing record"); 5978 return nullptr; 5979 } 5980 5981 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5982 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5983 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5984 Error(std::move(Err)); 5985 return nullptr; 5986 } 5987 5988 Expected<llvm::BitstreamEntry> MaybeEntry = 5989 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5990 if (!MaybeEntry) { 5991 Error(MaybeEntry.takeError()); 5992 return nullptr; 5993 } 5994 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5995 5996 if (Entry.Kind != llvm::BitstreamEntry::Record) 5997 return nullptr; 5998 5999 // Read the record. 6000 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 6001 TranslateSourceLocation(M, PPOffs.getEnd())); 6002 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 6003 StringRef Blob; 6004 RecordData Record; 6005 Expected<unsigned> MaybeRecType = 6006 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 6007 if (!MaybeRecType) { 6008 Error(MaybeRecType.takeError()); 6009 return nullptr; 6010 } 6011 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 6012 case PPD_MACRO_EXPANSION: { 6013 bool isBuiltin = Record[0]; 6014 IdentifierInfo *Name = nullptr; 6015 MacroDefinitionRecord *Def = nullptr; 6016 if (isBuiltin) 6017 Name = getLocalIdentifier(M, Record[1]); 6018 else { 6019 PreprocessedEntityID GlobalID = 6020 getGlobalPreprocessedEntityID(M, Record[1]); 6021 Def = cast<MacroDefinitionRecord>( 6022 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 6023 } 6024 6025 MacroExpansion *ME; 6026 if (isBuiltin) 6027 ME = new (PPRec) MacroExpansion(Name, Range); 6028 else 6029 ME = new (PPRec) MacroExpansion(Def, Range); 6030 6031 return ME; 6032 } 6033 6034 case PPD_MACRO_DEFINITION: { 6035 // Decode the identifier info and then check again; if the macro is 6036 // still defined and associated with the identifier, 6037 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 6038 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 6039 6040 if (DeserializationListener) 6041 DeserializationListener->MacroDefinitionRead(PPID, MD); 6042 6043 return MD; 6044 } 6045 6046 case PPD_INCLUSION_DIRECTIVE: { 6047 const char *FullFileNameStart = Blob.data() + Record[0]; 6048 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 6049 const FileEntry *File = nullptr; 6050 if (!FullFileName.empty()) 6051 if (auto FE = PP.getFileManager().getFile(FullFileName)) 6052 File = *FE; 6053 6054 // FIXME: Stable encoding 6055 InclusionDirective::InclusionKind Kind 6056 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 6057 InclusionDirective *ID 6058 = new (PPRec) InclusionDirective(PPRec, Kind, 6059 StringRef(Blob.data(), Record[0]), 6060 Record[1], Record[3], 6061 File, 6062 Range); 6063 return ID; 6064 } 6065 } 6066 6067 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 6068 } 6069 6070 /// Find the next module that contains entities and return the ID 6071 /// of the first entry. 6072 /// 6073 /// \param SLocMapI points at a chunk of a module that contains no 6074 /// preprocessed entities or the entities it contains are not the ones we are 6075 /// looking for. 6076 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6077 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6078 ++SLocMapI; 6079 for (GlobalSLocOffsetMapType::const_iterator 6080 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6081 ModuleFile &M = *SLocMapI->second; 6082 if (M.NumPreprocessedEntities) 6083 return M.BasePreprocessedEntityID; 6084 } 6085 6086 return getTotalNumPreprocessedEntities(); 6087 } 6088 6089 namespace { 6090 6091 struct PPEntityComp { 6092 const ASTReader &Reader; 6093 ModuleFile &M; 6094 6095 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6096 6097 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6098 SourceLocation LHS = getLoc(L); 6099 SourceLocation RHS = getLoc(R); 6100 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6101 } 6102 6103 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6104 SourceLocation LHS = getLoc(L); 6105 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6106 } 6107 6108 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6109 SourceLocation RHS = getLoc(R); 6110 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6111 } 6112 6113 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6114 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6115 } 6116 }; 6117 6118 } // namespace 6119 6120 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6121 bool EndsAfter) const { 6122 if (SourceMgr.isLocalSourceLocation(Loc)) 6123 return getTotalNumPreprocessedEntities(); 6124 6125 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6126 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6127 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6128 "Corrupted global sloc offset map"); 6129 6130 if (SLocMapI->second->NumPreprocessedEntities == 0) 6131 return findNextPreprocessedEntity(SLocMapI); 6132 6133 ModuleFile &M = *SLocMapI->second; 6134 6135 using pp_iterator = const PPEntityOffset *; 6136 6137 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6138 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6139 6140 size_t Count = M.NumPreprocessedEntities; 6141 size_t Half; 6142 pp_iterator First = pp_begin; 6143 pp_iterator PPI; 6144 6145 if (EndsAfter) { 6146 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6147 PPEntityComp(*this, M)); 6148 } else { 6149 // Do a binary search manually instead of using std::lower_bound because 6150 // The end locations of entities may be unordered (when a macro expansion 6151 // is inside another macro argument), but for this case it is not important 6152 // whether we get the first macro expansion or its containing macro. 6153 while (Count > 0) { 6154 Half = Count / 2; 6155 PPI = First; 6156 std::advance(PPI, Half); 6157 if (SourceMgr.isBeforeInTranslationUnit( 6158 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6159 First = PPI; 6160 ++First; 6161 Count = Count - Half - 1; 6162 } else 6163 Count = Half; 6164 } 6165 } 6166 6167 if (PPI == pp_end) 6168 return findNextPreprocessedEntity(SLocMapI); 6169 6170 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6171 } 6172 6173 /// Returns a pair of [Begin, End) indices of preallocated 6174 /// preprocessed entities that \arg Range encompasses. 6175 std::pair<unsigned, unsigned> 6176 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6177 if (Range.isInvalid()) 6178 return std::make_pair(0,0); 6179 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6180 6181 PreprocessedEntityID BeginID = 6182 findPreprocessedEntity(Range.getBegin(), false); 6183 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6184 return std::make_pair(BeginID, EndID); 6185 } 6186 6187 /// Optionally returns true or false if the preallocated preprocessed 6188 /// entity with index \arg Index came from file \arg FID. 6189 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6190 FileID FID) { 6191 if (FID.isInvalid()) 6192 return false; 6193 6194 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6195 ModuleFile &M = *PPInfo.first; 6196 unsigned LocalIndex = PPInfo.second; 6197 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6198 6199 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6200 if (Loc.isInvalid()) 6201 return false; 6202 6203 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6204 return true; 6205 else 6206 return false; 6207 } 6208 6209 namespace { 6210 6211 /// Visitor used to search for information about a header file. 6212 class HeaderFileInfoVisitor { 6213 const FileEntry *FE; 6214 Optional<HeaderFileInfo> HFI; 6215 6216 public: 6217 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6218 6219 bool operator()(ModuleFile &M) { 6220 HeaderFileInfoLookupTable *Table 6221 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6222 if (!Table) 6223 return false; 6224 6225 // Look in the on-disk hash table for an entry for this file name. 6226 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6227 if (Pos == Table->end()) 6228 return false; 6229 6230 HFI = *Pos; 6231 return true; 6232 } 6233 6234 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6235 }; 6236 6237 } // namespace 6238 6239 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6240 HeaderFileInfoVisitor Visitor(FE); 6241 ModuleMgr.visit(Visitor); 6242 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6243 return *HFI; 6244 6245 return HeaderFileInfo(); 6246 } 6247 6248 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6249 using DiagState = DiagnosticsEngine::DiagState; 6250 SmallVector<DiagState *, 32> DiagStates; 6251 6252 for (ModuleFile &F : ModuleMgr) { 6253 unsigned Idx = 0; 6254 auto &Record = F.PragmaDiagMappings; 6255 if (Record.empty()) 6256 continue; 6257 6258 DiagStates.clear(); 6259 6260 auto ReadDiagState = 6261 [&](const DiagState &BasedOn, SourceLocation Loc, 6262 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6263 unsigned BackrefID = Record[Idx++]; 6264 if (BackrefID != 0) 6265 return DiagStates[BackrefID - 1]; 6266 6267 // A new DiagState was created here. 6268 Diag.DiagStates.push_back(BasedOn); 6269 DiagState *NewState = &Diag.DiagStates.back(); 6270 DiagStates.push_back(NewState); 6271 unsigned Size = Record[Idx++]; 6272 assert(Idx + Size * 2 <= Record.size() && 6273 "Invalid data, not enough diag/map pairs"); 6274 while (Size--) { 6275 unsigned DiagID = Record[Idx++]; 6276 DiagnosticMapping NewMapping = 6277 DiagnosticMapping::deserialize(Record[Idx++]); 6278 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6279 continue; 6280 6281 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6282 6283 // If this mapping was specified as a warning but the severity was 6284 // upgraded due to diagnostic settings, simulate the current diagnostic 6285 // settings (and use a warning). 6286 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6287 NewMapping.setSeverity(diag::Severity::Warning); 6288 NewMapping.setUpgradedFromWarning(false); 6289 } 6290 6291 Mapping = NewMapping; 6292 } 6293 return NewState; 6294 }; 6295 6296 // Read the first state. 6297 DiagState *FirstState; 6298 if (F.Kind == MK_ImplicitModule) { 6299 // Implicitly-built modules are reused with different diagnostic 6300 // settings. Use the initial diagnostic state from Diag to simulate this 6301 // compilation's diagnostic settings. 6302 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6303 DiagStates.push_back(FirstState); 6304 6305 // Skip the initial diagnostic state from the serialized module. 6306 assert(Record[1] == 0 && 6307 "Invalid data, unexpected backref in initial state"); 6308 Idx = 3 + Record[2] * 2; 6309 assert(Idx < Record.size() && 6310 "Invalid data, not enough state change pairs in initial state"); 6311 } else if (F.isModule()) { 6312 // For an explicit module, preserve the flags from the module build 6313 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6314 // -Wblah flags. 6315 unsigned Flags = Record[Idx++]; 6316 DiagState Initial; 6317 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6318 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6319 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6320 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6321 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6322 Initial.ExtBehavior = (diag::Severity)Flags; 6323 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6324 6325 assert(F.OriginalSourceFileID.isValid()); 6326 6327 // Set up the root buffer of the module to start with the initial 6328 // diagnostic state of the module itself, to cover files that contain no 6329 // explicit transitions (for which we did not serialize anything). 6330 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6331 .StateTransitions.push_back({FirstState, 0}); 6332 } else { 6333 // For prefix ASTs, start with whatever the user configured on the 6334 // command line. 6335 Idx++; // Skip flags. 6336 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6337 SourceLocation(), false); 6338 } 6339 6340 // Read the state transitions. 6341 unsigned NumLocations = Record[Idx++]; 6342 while (NumLocations--) { 6343 assert(Idx < Record.size() && 6344 "Invalid data, missing pragma diagnostic states"); 6345 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6346 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6347 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6348 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6349 unsigned Transitions = Record[Idx++]; 6350 6351 // Note that we don't need to set up Parent/ParentOffset here, because 6352 // we won't be changing the diagnostic state within imported FileIDs 6353 // (other than perhaps appending to the main source file, which has no 6354 // parent). 6355 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6356 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6357 for (unsigned I = 0; I != Transitions; ++I) { 6358 unsigned Offset = Record[Idx++]; 6359 auto *State = 6360 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6361 F.StateTransitions.push_back({State, Offset}); 6362 } 6363 } 6364 6365 // Read the final state. 6366 assert(Idx < Record.size() && 6367 "Invalid data, missing final pragma diagnostic state"); 6368 SourceLocation CurStateLoc = 6369 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6370 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6371 6372 if (!F.isModule()) { 6373 Diag.DiagStatesByLoc.CurDiagState = CurState; 6374 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6375 6376 // Preserve the property that the imaginary root file describes the 6377 // current state. 6378 FileID NullFile; 6379 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6380 if (T.empty()) 6381 T.push_back({CurState, 0}); 6382 else 6383 T[0].State = CurState; 6384 } 6385 6386 // Don't try to read these mappings again. 6387 Record.clear(); 6388 } 6389 } 6390 6391 /// Get the correct cursor and offset for loading a type. 6392 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6393 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6394 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6395 ModuleFile *M = I->second; 6396 return RecordLocation( 6397 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() + 6398 M->DeclsBlockStartOffset); 6399 } 6400 6401 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6402 switch (code) { 6403 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6404 case TYPE_##CODE_ID: return Type::CLASS_ID; 6405 #include "clang/Serialization/TypeBitCodes.def" 6406 default: return llvm::None; 6407 } 6408 } 6409 6410 /// Read and return the type with the given index.. 6411 /// 6412 /// The index is the type ID, shifted and minus the number of predefs. This 6413 /// routine actually reads the record corresponding to the type at the given 6414 /// location. It is a helper routine for GetType, which deals with reading type 6415 /// IDs. 6416 QualType ASTReader::readTypeRecord(unsigned Index) { 6417 assert(ContextObj && "reading type with no AST context"); 6418 ASTContext &Context = *ContextObj; 6419 RecordLocation Loc = TypeCursorForIndex(Index); 6420 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6421 6422 // Keep track of where we are in the stream, then jump back there 6423 // after reading this type. 6424 SavedStreamPosition SavedPosition(DeclsCursor); 6425 6426 ReadingKindTracker ReadingKind(Read_Type, *this); 6427 6428 // Note that we are loading a type record. 6429 Deserializing AType(this); 6430 6431 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6432 Error(std::move(Err)); 6433 return QualType(); 6434 } 6435 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6436 if (!RawCode) { 6437 Error(RawCode.takeError()); 6438 return QualType(); 6439 } 6440 6441 ASTRecordReader Record(*this, *Loc.F); 6442 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6443 if (!Code) { 6444 Error(Code.takeError()); 6445 return QualType(); 6446 } 6447 if (Code.get() == TYPE_EXT_QUAL) { 6448 QualType baseType = Record.readQualType(); 6449 Qualifiers quals = Record.readQualifiers(); 6450 return Context.getQualifiedType(baseType, quals); 6451 } 6452 6453 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6454 if (!maybeClass) { 6455 Error("Unexpected code for type"); 6456 return QualType(); 6457 } 6458 6459 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6460 return TypeReader.read(*maybeClass); 6461 } 6462 6463 namespace clang { 6464 6465 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6466 ASTRecordReader &Reader; 6467 6468 SourceLocation readSourceLocation() { 6469 return Reader.readSourceLocation(); 6470 } 6471 6472 TypeSourceInfo *GetTypeSourceInfo() { 6473 return Reader.readTypeSourceInfo(); 6474 } 6475 6476 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6477 return Reader.readNestedNameSpecifierLoc(); 6478 } 6479 6480 Attr *ReadAttr() { 6481 return Reader.readAttr(); 6482 } 6483 6484 public: 6485 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6486 6487 // We want compile-time assurance that we've enumerated all of 6488 // these, so unfortunately we have to declare them first, then 6489 // define them out-of-line. 6490 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6491 #define TYPELOC(CLASS, PARENT) \ 6492 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6493 #include "clang/AST/TypeLocNodes.def" 6494 6495 void VisitFunctionTypeLoc(FunctionTypeLoc); 6496 void VisitArrayTypeLoc(ArrayTypeLoc); 6497 }; 6498 6499 } // namespace clang 6500 6501 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6502 // nothing to do 6503 } 6504 6505 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6506 TL.setBuiltinLoc(readSourceLocation()); 6507 if (TL.needsExtraLocalData()) { 6508 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6509 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt())); 6510 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt())); 6511 TL.setModeAttr(Reader.readInt()); 6512 } 6513 } 6514 6515 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6516 TL.setNameLoc(readSourceLocation()); 6517 } 6518 6519 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6520 TL.setStarLoc(readSourceLocation()); 6521 } 6522 6523 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6524 // nothing to do 6525 } 6526 6527 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6528 // nothing to do 6529 } 6530 6531 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6532 TL.setExpansionLoc(readSourceLocation()); 6533 } 6534 6535 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6536 TL.setCaretLoc(readSourceLocation()); 6537 } 6538 6539 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6540 TL.setAmpLoc(readSourceLocation()); 6541 } 6542 6543 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6544 TL.setAmpAmpLoc(readSourceLocation()); 6545 } 6546 6547 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6548 TL.setStarLoc(readSourceLocation()); 6549 TL.setClassTInfo(GetTypeSourceInfo()); 6550 } 6551 6552 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6553 TL.setLBracketLoc(readSourceLocation()); 6554 TL.setRBracketLoc(readSourceLocation()); 6555 if (Reader.readBool()) 6556 TL.setSizeExpr(Reader.readExpr()); 6557 else 6558 TL.setSizeExpr(nullptr); 6559 } 6560 6561 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6562 VisitArrayTypeLoc(TL); 6563 } 6564 6565 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6566 VisitArrayTypeLoc(TL); 6567 } 6568 6569 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6570 VisitArrayTypeLoc(TL); 6571 } 6572 6573 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6574 DependentSizedArrayTypeLoc TL) { 6575 VisitArrayTypeLoc(TL); 6576 } 6577 6578 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6579 DependentAddressSpaceTypeLoc TL) { 6580 6581 TL.setAttrNameLoc(readSourceLocation()); 6582 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6583 TL.setAttrExprOperand(Reader.readExpr()); 6584 } 6585 6586 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6587 DependentSizedExtVectorTypeLoc TL) { 6588 TL.setNameLoc(readSourceLocation()); 6589 } 6590 6591 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6592 TL.setNameLoc(readSourceLocation()); 6593 } 6594 6595 void TypeLocReader::VisitDependentVectorTypeLoc( 6596 DependentVectorTypeLoc TL) { 6597 TL.setNameLoc(readSourceLocation()); 6598 } 6599 6600 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6601 TL.setNameLoc(readSourceLocation()); 6602 } 6603 6604 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) { 6605 TL.setAttrNameLoc(readSourceLocation()); 6606 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6607 TL.setAttrRowOperand(Reader.readExpr()); 6608 TL.setAttrColumnOperand(Reader.readExpr()); 6609 } 6610 6611 void TypeLocReader::VisitDependentSizedMatrixTypeLoc( 6612 DependentSizedMatrixTypeLoc TL) { 6613 TL.setAttrNameLoc(readSourceLocation()); 6614 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6615 TL.setAttrRowOperand(Reader.readExpr()); 6616 TL.setAttrColumnOperand(Reader.readExpr()); 6617 } 6618 6619 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6620 TL.setLocalRangeBegin(readSourceLocation()); 6621 TL.setLParenLoc(readSourceLocation()); 6622 TL.setRParenLoc(readSourceLocation()); 6623 TL.setExceptionSpecRange(Reader.readSourceRange()); 6624 TL.setLocalRangeEnd(readSourceLocation()); 6625 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6626 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6627 } 6628 } 6629 6630 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6631 VisitFunctionTypeLoc(TL); 6632 } 6633 6634 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6635 VisitFunctionTypeLoc(TL); 6636 } 6637 6638 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6639 TL.setNameLoc(readSourceLocation()); 6640 } 6641 6642 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6643 TL.setNameLoc(readSourceLocation()); 6644 } 6645 6646 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6647 TL.setTypeofLoc(readSourceLocation()); 6648 TL.setLParenLoc(readSourceLocation()); 6649 TL.setRParenLoc(readSourceLocation()); 6650 } 6651 6652 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6653 TL.setTypeofLoc(readSourceLocation()); 6654 TL.setLParenLoc(readSourceLocation()); 6655 TL.setRParenLoc(readSourceLocation()); 6656 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6657 } 6658 6659 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6660 TL.setNameLoc(readSourceLocation()); 6661 } 6662 6663 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6664 TL.setKWLoc(readSourceLocation()); 6665 TL.setLParenLoc(readSourceLocation()); 6666 TL.setRParenLoc(readSourceLocation()); 6667 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6668 } 6669 6670 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6671 TL.setNameLoc(readSourceLocation()); 6672 if (Reader.readBool()) { 6673 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6674 TL.setTemplateKWLoc(readSourceLocation()); 6675 TL.setConceptNameLoc(readSourceLocation()); 6676 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6677 TL.setLAngleLoc(readSourceLocation()); 6678 TL.setRAngleLoc(readSourceLocation()); 6679 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6680 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6681 TL.getTypePtr()->getArg(i).getKind())); 6682 } 6683 } 6684 6685 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6686 DeducedTemplateSpecializationTypeLoc TL) { 6687 TL.setTemplateNameLoc(readSourceLocation()); 6688 } 6689 6690 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6691 TL.setNameLoc(readSourceLocation()); 6692 } 6693 6694 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6695 TL.setNameLoc(readSourceLocation()); 6696 } 6697 6698 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6699 TL.setAttr(ReadAttr()); 6700 } 6701 6702 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6703 TL.setNameLoc(readSourceLocation()); 6704 } 6705 6706 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6707 SubstTemplateTypeParmTypeLoc TL) { 6708 TL.setNameLoc(readSourceLocation()); 6709 } 6710 6711 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6712 SubstTemplateTypeParmPackTypeLoc TL) { 6713 TL.setNameLoc(readSourceLocation()); 6714 } 6715 6716 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6717 TemplateSpecializationTypeLoc TL) { 6718 TL.setTemplateKeywordLoc(readSourceLocation()); 6719 TL.setTemplateNameLoc(readSourceLocation()); 6720 TL.setLAngleLoc(readSourceLocation()); 6721 TL.setRAngleLoc(readSourceLocation()); 6722 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6723 TL.setArgLocInfo( 6724 i, 6725 Reader.readTemplateArgumentLocInfo( 6726 TL.getTypePtr()->getArg(i).getKind())); 6727 } 6728 6729 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6730 TL.setLParenLoc(readSourceLocation()); 6731 TL.setRParenLoc(readSourceLocation()); 6732 } 6733 6734 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6735 TL.setElaboratedKeywordLoc(readSourceLocation()); 6736 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6737 } 6738 6739 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6740 TL.setNameLoc(readSourceLocation()); 6741 } 6742 6743 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6744 TL.setElaboratedKeywordLoc(readSourceLocation()); 6745 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6746 TL.setNameLoc(readSourceLocation()); 6747 } 6748 6749 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6750 DependentTemplateSpecializationTypeLoc TL) { 6751 TL.setElaboratedKeywordLoc(readSourceLocation()); 6752 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6753 TL.setTemplateKeywordLoc(readSourceLocation()); 6754 TL.setTemplateNameLoc(readSourceLocation()); 6755 TL.setLAngleLoc(readSourceLocation()); 6756 TL.setRAngleLoc(readSourceLocation()); 6757 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6758 TL.setArgLocInfo( 6759 I, 6760 Reader.readTemplateArgumentLocInfo( 6761 TL.getTypePtr()->getArg(I).getKind())); 6762 } 6763 6764 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6765 TL.setEllipsisLoc(readSourceLocation()); 6766 } 6767 6768 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6769 TL.setNameLoc(readSourceLocation()); 6770 } 6771 6772 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6773 if (TL.getNumProtocols()) { 6774 TL.setProtocolLAngleLoc(readSourceLocation()); 6775 TL.setProtocolRAngleLoc(readSourceLocation()); 6776 } 6777 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6778 TL.setProtocolLoc(i, readSourceLocation()); 6779 } 6780 6781 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6782 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6783 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6784 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6785 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6786 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6787 TL.setProtocolLAngleLoc(readSourceLocation()); 6788 TL.setProtocolRAngleLoc(readSourceLocation()); 6789 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6790 TL.setProtocolLoc(i, readSourceLocation()); 6791 } 6792 6793 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6794 TL.setStarLoc(readSourceLocation()); 6795 } 6796 6797 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6798 TL.setKWLoc(readSourceLocation()); 6799 TL.setLParenLoc(readSourceLocation()); 6800 TL.setRParenLoc(readSourceLocation()); 6801 } 6802 6803 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6804 TL.setKWLoc(readSourceLocation()); 6805 } 6806 6807 void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) { 6808 TL.setNameLoc(readSourceLocation()); 6809 } 6810 void TypeLocReader::VisitDependentExtIntTypeLoc( 6811 clang::DependentExtIntTypeLoc TL) { 6812 TL.setNameLoc(readSourceLocation()); 6813 } 6814 6815 6816 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6817 TypeLocReader TLR(*this); 6818 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6819 TLR.Visit(TL); 6820 } 6821 6822 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6823 QualType InfoTy = readType(); 6824 if (InfoTy.isNull()) 6825 return nullptr; 6826 6827 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6828 readTypeLoc(TInfo->getTypeLoc()); 6829 return TInfo; 6830 } 6831 6832 QualType ASTReader::GetType(TypeID ID) { 6833 assert(ContextObj && "reading type with no AST context"); 6834 ASTContext &Context = *ContextObj; 6835 6836 unsigned FastQuals = ID & Qualifiers::FastMask; 6837 unsigned Index = ID >> Qualifiers::FastWidth; 6838 6839 if (Index < NUM_PREDEF_TYPE_IDS) { 6840 QualType T; 6841 switch ((PredefinedTypeIDs)Index) { 6842 case PREDEF_TYPE_NULL_ID: 6843 return QualType(); 6844 case PREDEF_TYPE_VOID_ID: 6845 T = Context.VoidTy; 6846 break; 6847 case PREDEF_TYPE_BOOL_ID: 6848 T = Context.BoolTy; 6849 break; 6850 case PREDEF_TYPE_CHAR_U_ID: 6851 case PREDEF_TYPE_CHAR_S_ID: 6852 // FIXME: Check that the signedness of CharTy is correct! 6853 T = Context.CharTy; 6854 break; 6855 case PREDEF_TYPE_UCHAR_ID: 6856 T = Context.UnsignedCharTy; 6857 break; 6858 case PREDEF_TYPE_USHORT_ID: 6859 T = Context.UnsignedShortTy; 6860 break; 6861 case PREDEF_TYPE_UINT_ID: 6862 T = Context.UnsignedIntTy; 6863 break; 6864 case PREDEF_TYPE_ULONG_ID: 6865 T = Context.UnsignedLongTy; 6866 break; 6867 case PREDEF_TYPE_ULONGLONG_ID: 6868 T = Context.UnsignedLongLongTy; 6869 break; 6870 case PREDEF_TYPE_UINT128_ID: 6871 T = Context.UnsignedInt128Ty; 6872 break; 6873 case PREDEF_TYPE_SCHAR_ID: 6874 T = Context.SignedCharTy; 6875 break; 6876 case PREDEF_TYPE_WCHAR_ID: 6877 T = Context.WCharTy; 6878 break; 6879 case PREDEF_TYPE_SHORT_ID: 6880 T = Context.ShortTy; 6881 break; 6882 case PREDEF_TYPE_INT_ID: 6883 T = Context.IntTy; 6884 break; 6885 case PREDEF_TYPE_LONG_ID: 6886 T = Context.LongTy; 6887 break; 6888 case PREDEF_TYPE_LONGLONG_ID: 6889 T = Context.LongLongTy; 6890 break; 6891 case PREDEF_TYPE_INT128_ID: 6892 T = Context.Int128Ty; 6893 break; 6894 case PREDEF_TYPE_BFLOAT16_ID: 6895 T = Context.BFloat16Ty; 6896 break; 6897 case PREDEF_TYPE_HALF_ID: 6898 T = Context.HalfTy; 6899 break; 6900 case PREDEF_TYPE_FLOAT_ID: 6901 T = Context.FloatTy; 6902 break; 6903 case PREDEF_TYPE_DOUBLE_ID: 6904 T = Context.DoubleTy; 6905 break; 6906 case PREDEF_TYPE_LONGDOUBLE_ID: 6907 T = Context.LongDoubleTy; 6908 break; 6909 case PREDEF_TYPE_SHORT_ACCUM_ID: 6910 T = Context.ShortAccumTy; 6911 break; 6912 case PREDEF_TYPE_ACCUM_ID: 6913 T = Context.AccumTy; 6914 break; 6915 case PREDEF_TYPE_LONG_ACCUM_ID: 6916 T = Context.LongAccumTy; 6917 break; 6918 case PREDEF_TYPE_USHORT_ACCUM_ID: 6919 T = Context.UnsignedShortAccumTy; 6920 break; 6921 case PREDEF_TYPE_UACCUM_ID: 6922 T = Context.UnsignedAccumTy; 6923 break; 6924 case PREDEF_TYPE_ULONG_ACCUM_ID: 6925 T = Context.UnsignedLongAccumTy; 6926 break; 6927 case PREDEF_TYPE_SHORT_FRACT_ID: 6928 T = Context.ShortFractTy; 6929 break; 6930 case PREDEF_TYPE_FRACT_ID: 6931 T = Context.FractTy; 6932 break; 6933 case PREDEF_TYPE_LONG_FRACT_ID: 6934 T = Context.LongFractTy; 6935 break; 6936 case PREDEF_TYPE_USHORT_FRACT_ID: 6937 T = Context.UnsignedShortFractTy; 6938 break; 6939 case PREDEF_TYPE_UFRACT_ID: 6940 T = Context.UnsignedFractTy; 6941 break; 6942 case PREDEF_TYPE_ULONG_FRACT_ID: 6943 T = Context.UnsignedLongFractTy; 6944 break; 6945 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6946 T = Context.SatShortAccumTy; 6947 break; 6948 case PREDEF_TYPE_SAT_ACCUM_ID: 6949 T = Context.SatAccumTy; 6950 break; 6951 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6952 T = Context.SatLongAccumTy; 6953 break; 6954 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6955 T = Context.SatUnsignedShortAccumTy; 6956 break; 6957 case PREDEF_TYPE_SAT_UACCUM_ID: 6958 T = Context.SatUnsignedAccumTy; 6959 break; 6960 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6961 T = Context.SatUnsignedLongAccumTy; 6962 break; 6963 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6964 T = Context.SatShortFractTy; 6965 break; 6966 case PREDEF_TYPE_SAT_FRACT_ID: 6967 T = Context.SatFractTy; 6968 break; 6969 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6970 T = Context.SatLongFractTy; 6971 break; 6972 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6973 T = Context.SatUnsignedShortFractTy; 6974 break; 6975 case PREDEF_TYPE_SAT_UFRACT_ID: 6976 T = Context.SatUnsignedFractTy; 6977 break; 6978 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6979 T = Context.SatUnsignedLongFractTy; 6980 break; 6981 case PREDEF_TYPE_FLOAT16_ID: 6982 T = Context.Float16Ty; 6983 break; 6984 case PREDEF_TYPE_FLOAT128_ID: 6985 T = Context.Float128Ty; 6986 break; 6987 case PREDEF_TYPE_OVERLOAD_ID: 6988 T = Context.OverloadTy; 6989 break; 6990 case PREDEF_TYPE_BOUND_MEMBER: 6991 T = Context.BoundMemberTy; 6992 break; 6993 case PREDEF_TYPE_PSEUDO_OBJECT: 6994 T = Context.PseudoObjectTy; 6995 break; 6996 case PREDEF_TYPE_DEPENDENT_ID: 6997 T = Context.DependentTy; 6998 break; 6999 case PREDEF_TYPE_UNKNOWN_ANY: 7000 T = Context.UnknownAnyTy; 7001 break; 7002 case PREDEF_TYPE_NULLPTR_ID: 7003 T = Context.NullPtrTy; 7004 break; 7005 case PREDEF_TYPE_CHAR8_ID: 7006 T = Context.Char8Ty; 7007 break; 7008 case PREDEF_TYPE_CHAR16_ID: 7009 T = Context.Char16Ty; 7010 break; 7011 case PREDEF_TYPE_CHAR32_ID: 7012 T = Context.Char32Ty; 7013 break; 7014 case PREDEF_TYPE_OBJC_ID: 7015 T = Context.ObjCBuiltinIdTy; 7016 break; 7017 case PREDEF_TYPE_OBJC_CLASS: 7018 T = Context.ObjCBuiltinClassTy; 7019 break; 7020 case PREDEF_TYPE_OBJC_SEL: 7021 T = Context.ObjCBuiltinSelTy; 7022 break; 7023 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 7024 case PREDEF_TYPE_##Id##_ID: \ 7025 T = Context.SingletonId; \ 7026 break; 7027 #include "clang/Basic/OpenCLImageTypes.def" 7028 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 7029 case PREDEF_TYPE_##Id##_ID: \ 7030 T = Context.Id##Ty; \ 7031 break; 7032 #include "clang/Basic/OpenCLExtensionTypes.def" 7033 case PREDEF_TYPE_SAMPLER_ID: 7034 T = Context.OCLSamplerTy; 7035 break; 7036 case PREDEF_TYPE_EVENT_ID: 7037 T = Context.OCLEventTy; 7038 break; 7039 case PREDEF_TYPE_CLK_EVENT_ID: 7040 T = Context.OCLClkEventTy; 7041 break; 7042 case PREDEF_TYPE_QUEUE_ID: 7043 T = Context.OCLQueueTy; 7044 break; 7045 case PREDEF_TYPE_RESERVE_ID_ID: 7046 T = Context.OCLReserveIDTy; 7047 break; 7048 case PREDEF_TYPE_AUTO_DEDUCT: 7049 T = Context.getAutoDeductType(); 7050 break; 7051 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 7052 T = Context.getAutoRRefDeductType(); 7053 break; 7054 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 7055 T = Context.ARCUnbridgedCastTy; 7056 break; 7057 case PREDEF_TYPE_BUILTIN_FN: 7058 T = Context.BuiltinFnTy; 7059 break; 7060 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX: 7061 T = Context.IncompleteMatrixIdxTy; 7062 break; 7063 case PREDEF_TYPE_OMP_ARRAY_SECTION: 7064 T = Context.OMPArraySectionTy; 7065 break; 7066 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 7067 T = Context.OMPArraySectionTy; 7068 break; 7069 case PREDEF_TYPE_OMP_ITERATOR: 7070 T = Context.OMPIteratorTy; 7071 break; 7072 #define SVE_TYPE(Name, Id, SingletonId) \ 7073 case PREDEF_TYPE_##Id##_ID: \ 7074 T = Context.SingletonId; \ 7075 break; 7076 #include "clang/Basic/AArch64SVEACLETypes.def" 7077 #define PPC_VECTOR_TYPE(Name, Id, Size) \ 7078 case PREDEF_TYPE_##Id##_ID: \ 7079 T = Context.Id##Ty; \ 7080 break; 7081 #include "clang/Basic/PPCTypes.def" 7082 #define RVV_TYPE(Name, Id, SingletonId) \ 7083 case PREDEF_TYPE_##Id##_ID: \ 7084 T = Context.SingletonId; \ 7085 break; 7086 #include "clang/Basic/RISCVVTypes.def" 7087 } 7088 7089 assert(!T.isNull() && "Unknown predefined type"); 7090 return T.withFastQualifiers(FastQuals); 7091 } 7092 7093 Index -= NUM_PREDEF_TYPE_IDS; 7094 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 7095 if (TypesLoaded[Index].isNull()) { 7096 TypesLoaded[Index] = readTypeRecord(Index); 7097 if (TypesLoaded[Index].isNull()) 7098 return QualType(); 7099 7100 TypesLoaded[Index]->setFromAST(); 7101 if (DeserializationListener) 7102 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 7103 TypesLoaded[Index]); 7104 } 7105 7106 return TypesLoaded[Index].withFastQualifiers(FastQuals); 7107 } 7108 7109 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 7110 return GetType(getGlobalTypeID(F, LocalID)); 7111 } 7112 7113 serialization::TypeID 7114 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7115 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7116 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7117 7118 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7119 return LocalID; 7120 7121 if (!F.ModuleOffsetMap.empty()) 7122 ReadModuleOffsetMap(F); 7123 7124 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7125 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7126 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7127 7128 unsigned GlobalIndex = LocalIndex + I->second; 7129 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7130 } 7131 7132 TemplateArgumentLocInfo 7133 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7134 switch (Kind) { 7135 case TemplateArgument::Expression: 7136 return readExpr(); 7137 case TemplateArgument::Type: 7138 return readTypeSourceInfo(); 7139 case TemplateArgument::Template: { 7140 NestedNameSpecifierLoc QualifierLoc = 7141 readNestedNameSpecifierLoc(); 7142 SourceLocation TemplateNameLoc = readSourceLocation(); 7143 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7144 TemplateNameLoc, SourceLocation()); 7145 } 7146 case TemplateArgument::TemplateExpansion: { 7147 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7148 SourceLocation TemplateNameLoc = readSourceLocation(); 7149 SourceLocation EllipsisLoc = readSourceLocation(); 7150 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7151 TemplateNameLoc, EllipsisLoc); 7152 } 7153 case TemplateArgument::Null: 7154 case TemplateArgument::Integral: 7155 case TemplateArgument::Declaration: 7156 case TemplateArgument::NullPtr: 7157 case TemplateArgument::Pack: 7158 // FIXME: Is this right? 7159 return TemplateArgumentLocInfo(); 7160 } 7161 llvm_unreachable("unexpected template argument loc"); 7162 } 7163 7164 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7165 TemplateArgument Arg = readTemplateArgument(); 7166 7167 if (Arg.getKind() == TemplateArgument::Expression) { 7168 if (readBool()) // bool InfoHasSameExpr. 7169 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7170 } 7171 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7172 } 7173 7174 const ASTTemplateArgumentListInfo * 7175 ASTRecordReader::readASTTemplateArgumentListInfo() { 7176 SourceLocation LAngleLoc = readSourceLocation(); 7177 SourceLocation RAngleLoc = readSourceLocation(); 7178 unsigned NumArgsAsWritten = readInt(); 7179 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7180 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7181 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7182 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7183 } 7184 7185 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7186 return GetDecl(ID); 7187 } 7188 7189 void ASTReader::CompleteRedeclChain(const Decl *D) { 7190 if (NumCurrentElementsDeserializing) { 7191 // We arrange to not care about the complete redeclaration chain while we're 7192 // deserializing. Just remember that the AST has marked this one as complete 7193 // but that it's not actually complete yet, so we know we still need to 7194 // complete it later. 7195 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7196 return; 7197 } 7198 7199 if (!D->getDeclContext()) { 7200 assert(isa<TranslationUnitDecl>(D) && "Not a TU?"); 7201 return; 7202 } 7203 7204 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7205 7206 // If this is a named declaration, complete it by looking it up 7207 // within its context. 7208 // 7209 // FIXME: Merging a function definition should merge 7210 // all mergeable entities within it. 7211 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7212 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7213 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7214 if (!getContext().getLangOpts().CPlusPlus && 7215 isa<TranslationUnitDecl>(DC)) { 7216 // Outside of C++, we don't have a lookup table for the TU, so update 7217 // the identifier instead. (For C++ modules, we don't store decls 7218 // in the serialized identifier table, so we do the lookup in the TU.) 7219 auto *II = Name.getAsIdentifierInfo(); 7220 assert(II && "non-identifier name in C?"); 7221 if (II->isOutOfDate()) 7222 updateOutOfDateIdentifier(*II); 7223 } else 7224 DC->lookup(Name); 7225 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7226 // Find all declarations of this kind from the relevant context. 7227 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7228 auto *DC = cast<DeclContext>(DCDecl); 7229 SmallVector<Decl*, 8> Decls; 7230 FindExternalLexicalDecls( 7231 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7232 } 7233 } 7234 } 7235 7236 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7237 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7238 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7239 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7240 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7241 if (auto *Template = FD->getPrimaryTemplate()) 7242 Template->LoadLazySpecializations(); 7243 } 7244 } 7245 7246 CXXCtorInitializer ** 7247 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7248 RecordLocation Loc = getLocalBitOffset(Offset); 7249 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7250 SavedStreamPosition SavedPosition(Cursor); 7251 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7252 Error(std::move(Err)); 7253 return nullptr; 7254 } 7255 ReadingKindTracker ReadingKind(Read_Decl, *this); 7256 7257 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7258 if (!MaybeCode) { 7259 Error(MaybeCode.takeError()); 7260 return nullptr; 7261 } 7262 unsigned Code = MaybeCode.get(); 7263 7264 ASTRecordReader Record(*this, *Loc.F); 7265 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7266 if (!MaybeRecCode) { 7267 Error(MaybeRecCode.takeError()); 7268 return nullptr; 7269 } 7270 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7271 Error("malformed AST file: missing C++ ctor initializers"); 7272 return nullptr; 7273 } 7274 7275 return Record.readCXXCtorInitializers(); 7276 } 7277 7278 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7279 assert(ContextObj && "reading base specifiers with no AST context"); 7280 ASTContext &Context = *ContextObj; 7281 7282 RecordLocation Loc = getLocalBitOffset(Offset); 7283 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7284 SavedStreamPosition SavedPosition(Cursor); 7285 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7286 Error(std::move(Err)); 7287 return nullptr; 7288 } 7289 ReadingKindTracker ReadingKind(Read_Decl, *this); 7290 7291 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7292 if (!MaybeCode) { 7293 Error(MaybeCode.takeError()); 7294 return nullptr; 7295 } 7296 unsigned Code = MaybeCode.get(); 7297 7298 ASTRecordReader Record(*this, *Loc.F); 7299 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7300 if (!MaybeRecCode) { 7301 Error(MaybeCode.takeError()); 7302 return nullptr; 7303 } 7304 unsigned RecCode = MaybeRecCode.get(); 7305 7306 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7307 Error("malformed AST file: missing C++ base specifiers"); 7308 return nullptr; 7309 } 7310 7311 unsigned NumBases = Record.readInt(); 7312 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7313 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7314 for (unsigned I = 0; I != NumBases; ++I) 7315 Bases[I] = Record.readCXXBaseSpecifier(); 7316 return Bases; 7317 } 7318 7319 serialization::DeclID 7320 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7321 if (LocalID < NUM_PREDEF_DECL_IDS) 7322 return LocalID; 7323 7324 if (!F.ModuleOffsetMap.empty()) 7325 ReadModuleOffsetMap(F); 7326 7327 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7328 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7329 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7330 7331 return LocalID + I->second; 7332 } 7333 7334 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7335 ModuleFile &M) const { 7336 // Predefined decls aren't from any module. 7337 if (ID < NUM_PREDEF_DECL_IDS) 7338 return false; 7339 7340 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7341 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7342 } 7343 7344 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7345 if (!D->isFromASTFile()) 7346 return nullptr; 7347 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7348 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7349 return I->second; 7350 } 7351 7352 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7353 if (ID < NUM_PREDEF_DECL_IDS) 7354 return SourceLocation(); 7355 7356 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7357 7358 if (Index > DeclsLoaded.size()) { 7359 Error("declaration ID out-of-range for AST file"); 7360 return SourceLocation(); 7361 } 7362 7363 if (Decl *D = DeclsLoaded[Index]) 7364 return D->getLocation(); 7365 7366 SourceLocation Loc; 7367 DeclCursorForID(ID, Loc); 7368 return Loc; 7369 } 7370 7371 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7372 switch (ID) { 7373 case PREDEF_DECL_NULL_ID: 7374 return nullptr; 7375 7376 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7377 return Context.getTranslationUnitDecl(); 7378 7379 case PREDEF_DECL_OBJC_ID_ID: 7380 return Context.getObjCIdDecl(); 7381 7382 case PREDEF_DECL_OBJC_SEL_ID: 7383 return Context.getObjCSelDecl(); 7384 7385 case PREDEF_DECL_OBJC_CLASS_ID: 7386 return Context.getObjCClassDecl(); 7387 7388 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7389 return Context.getObjCProtocolDecl(); 7390 7391 case PREDEF_DECL_INT_128_ID: 7392 return Context.getInt128Decl(); 7393 7394 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7395 return Context.getUInt128Decl(); 7396 7397 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7398 return Context.getObjCInstanceTypeDecl(); 7399 7400 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7401 return Context.getBuiltinVaListDecl(); 7402 7403 case PREDEF_DECL_VA_LIST_TAG: 7404 return Context.getVaListTagDecl(); 7405 7406 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7407 return Context.getBuiltinMSVaListDecl(); 7408 7409 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7410 return Context.getMSGuidTagDecl(); 7411 7412 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7413 return Context.getExternCContextDecl(); 7414 7415 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7416 return Context.getMakeIntegerSeqDecl(); 7417 7418 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7419 return Context.getCFConstantStringDecl(); 7420 7421 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7422 return Context.getCFConstantStringTagDecl(); 7423 7424 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7425 return Context.getTypePackElementDecl(); 7426 } 7427 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7428 } 7429 7430 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7431 assert(ContextObj && "reading decl with no AST context"); 7432 if (ID < NUM_PREDEF_DECL_IDS) { 7433 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7434 if (D) { 7435 // Track that we have merged the declaration with ID \p ID into the 7436 // pre-existing predefined declaration \p D. 7437 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7438 if (Merged.empty()) 7439 Merged.push_back(ID); 7440 } 7441 return D; 7442 } 7443 7444 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7445 7446 if (Index >= DeclsLoaded.size()) { 7447 assert(0 && "declaration ID out-of-range for AST file"); 7448 Error("declaration ID out-of-range for AST file"); 7449 return nullptr; 7450 } 7451 7452 return DeclsLoaded[Index]; 7453 } 7454 7455 Decl *ASTReader::GetDecl(DeclID ID) { 7456 if (ID < NUM_PREDEF_DECL_IDS) 7457 return GetExistingDecl(ID); 7458 7459 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7460 7461 if (Index >= DeclsLoaded.size()) { 7462 assert(0 && "declaration ID out-of-range for AST file"); 7463 Error("declaration ID out-of-range for AST file"); 7464 return nullptr; 7465 } 7466 7467 if (!DeclsLoaded[Index]) { 7468 ReadDeclRecord(ID); 7469 if (DeserializationListener) 7470 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7471 } 7472 7473 return DeclsLoaded[Index]; 7474 } 7475 7476 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7477 DeclID GlobalID) { 7478 if (GlobalID < NUM_PREDEF_DECL_IDS) 7479 return GlobalID; 7480 7481 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7482 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7483 ModuleFile *Owner = I->second; 7484 7485 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7486 = M.GlobalToLocalDeclIDs.find(Owner); 7487 if (Pos == M.GlobalToLocalDeclIDs.end()) 7488 return 0; 7489 7490 return GlobalID - Owner->BaseDeclID + Pos->second; 7491 } 7492 7493 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7494 const RecordData &Record, 7495 unsigned &Idx) { 7496 if (Idx >= Record.size()) { 7497 Error("Corrupted AST file"); 7498 return 0; 7499 } 7500 7501 return getGlobalDeclID(F, Record[Idx++]); 7502 } 7503 7504 /// Resolve the offset of a statement into a statement. 7505 /// 7506 /// This operation will read a new statement from the external 7507 /// source each time it is called, and is meant to be used via a 7508 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7509 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7510 // Switch case IDs are per Decl. 7511 ClearSwitchCaseIDs(); 7512 7513 // Offset here is a global offset across the entire chain. 7514 RecordLocation Loc = getLocalBitOffset(Offset); 7515 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7516 Error(std::move(Err)); 7517 return nullptr; 7518 } 7519 assert(NumCurrentElementsDeserializing == 0 && 7520 "should not be called while already deserializing"); 7521 Deserializing D(this); 7522 return ReadStmtFromStream(*Loc.F); 7523 } 7524 7525 void ASTReader::FindExternalLexicalDecls( 7526 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7527 SmallVectorImpl<Decl *> &Decls) { 7528 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7529 7530 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7531 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7532 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7533 auto K = (Decl::Kind)+LexicalDecls[I]; 7534 if (!IsKindWeWant(K)) 7535 continue; 7536 7537 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7538 7539 // Don't add predefined declarations to the lexical context more 7540 // than once. 7541 if (ID < NUM_PREDEF_DECL_IDS) { 7542 if (PredefsVisited[ID]) 7543 continue; 7544 7545 PredefsVisited[ID] = true; 7546 } 7547 7548 if (Decl *D = GetLocalDecl(*M, ID)) { 7549 assert(D->getKind() == K && "wrong kind for lexical decl"); 7550 if (!DC->isDeclInLexicalTraversal(D)) 7551 Decls.push_back(D); 7552 } 7553 } 7554 }; 7555 7556 if (isa<TranslationUnitDecl>(DC)) { 7557 for (auto Lexical : TULexicalDecls) 7558 Visit(Lexical.first, Lexical.second); 7559 } else { 7560 auto I = LexicalDecls.find(DC); 7561 if (I != LexicalDecls.end()) 7562 Visit(I->second.first, I->second.second); 7563 } 7564 7565 ++NumLexicalDeclContextsRead; 7566 } 7567 7568 namespace { 7569 7570 class DeclIDComp { 7571 ASTReader &Reader; 7572 ModuleFile &Mod; 7573 7574 public: 7575 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7576 7577 bool operator()(LocalDeclID L, LocalDeclID R) const { 7578 SourceLocation LHS = getLocation(L); 7579 SourceLocation RHS = getLocation(R); 7580 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7581 } 7582 7583 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7584 SourceLocation RHS = getLocation(R); 7585 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7586 } 7587 7588 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7589 SourceLocation LHS = getLocation(L); 7590 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7591 } 7592 7593 SourceLocation getLocation(LocalDeclID ID) const { 7594 return Reader.getSourceManager().getFileLoc( 7595 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7596 } 7597 }; 7598 7599 } // namespace 7600 7601 void ASTReader::FindFileRegionDecls(FileID File, 7602 unsigned Offset, unsigned Length, 7603 SmallVectorImpl<Decl *> &Decls) { 7604 SourceManager &SM = getSourceManager(); 7605 7606 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7607 if (I == FileDeclIDs.end()) 7608 return; 7609 7610 FileDeclsInfo &DInfo = I->second; 7611 if (DInfo.Decls.empty()) 7612 return; 7613 7614 SourceLocation 7615 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7616 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7617 7618 DeclIDComp DIDComp(*this, *DInfo.Mod); 7619 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7620 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7621 if (BeginIt != DInfo.Decls.begin()) 7622 --BeginIt; 7623 7624 // If we are pointing at a top-level decl inside an objc container, we need 7625 // to backtrack until we find it otherwise we will fail to report that the 7626 // region overlaps with an objc container. 7627 while (BeginIt != DInfo.Decls.begin() && 7628 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7629 ->isTopLevelDeclInObjCContainer()) 7630 --BeginIt; 7631 7632 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7633 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7634 if (EndIt != DInfo.Decls.end()) 7635 ++EndIt; 7636 7637 for (ArrayRef<serialization::LocalDeclID>::iterator 7638 DIt = BeginIt; DIt != EndIt; ++DIt) 7639 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7640 } 7641 7642 bool 7643 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7644 DeclarationName Name) { 7645 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7646 "DeclContext has no visible decls in storage"); 7647 if (!Name) 7648 return false; 7649 7650 auto It = Lookups.find(DC); 7651 if (It == Lookups.end()) 7652 return false; 7653 7654 Deserializing LookupResults(this); 7655 7656 // Load the list of declarations. 7657 SmallVector<NamedDecl *, 64> Decls; 7658 llvm::SmallPtrSet<NamedDecl *, 8> Found; 7659 for (DeclID ID : It->second.Table.find(Name)) { 7660 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7661 if (ND->getDeclName() == Name && Found.insert(ND).second) 7662 Decls.push_back(ND); 7663 } 7664 7665 ++NumVisibleDeclContextsRead; 7666 SetExternalVisibleDeclsForName(DC, Name, Decls); 7667 return !Decls.empty(); 7668 } 7669 7670 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7671 if (!DC->hasExternalVisibleStorage()) 7672 return; 7673 7674 auto It = Lookups.find(DC); 7675 assert(It != Lookups.end() && 7676 "have external visible storage but no lookup tables"); 7677 7678 DeclsMap Decls; 7679 7680 for (DeclID ID : It->second.Table.findAll()) { 7681 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7682 Decls[ND->getDeclName()].push_back(ND); 7683 } 7684 7685 ++NumVisibleDeclContextsRead; 7686 7687 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7688 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7689 } 7690 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7691 } 7692 7693 const serialization::reader::DeclContextLookupTable * 7694 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7695 auto I = Lookups.find(Primary); 7696 return I == Lookups.end() ? nullptr : &I->second; 7697 } 7698 7699 /// Under non-PCH compilation the consumer receives the objc methods 7700 /// before receiving the implementation, and codegen depends on this. 7701 /// We simulate this by deserializing and passing to consumer the methods of the 7702 /// implementation before passing the deserialized implementation decl. 7703 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7704 ASTConsumer *Consumer) { 7705 assert(ImplD && Consumer); 7706 7707 for (auto *I : ImplD->methods()) 7708 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7709 7710 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7711 } 7712 7713 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7714 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7715 PassObjCImplDeclToConsumer(ImplD, Consumer); 7716 else 7717 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7718 } 7719 7720 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7721 this->Consumer = Consumer; 7722 7723 if (Consumer) 7724 PassInterestingDeclsToConsumer(); 7725 7726 if (DeserializationListener) 7727 DeserializationListener->ReaderInitialized(this); 7728 } 7729 7730 void ASTReader::PrintStats() { 7731 std::fprintf(stderr, "*** AST File Statistics:\n"); 7732 7733 unsigned NumTypesLoaded 7734 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7735 QualType()); 7736 unsigned NumDeclsLoaded 7737 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7738 (Decl *)nullptr); 7739 unsigned NumIdentifiersLoaded 7740 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7741 IdentifiersLoaded.end(), 7742 (IdentifierInfo *)nullptr); 7743 unsigned NumMacrosLoaded 7744 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7745 MacrosLoaded.end(), 7746 (MacroInfo *)nullptr); 7747 unsigned NumSelectorsLoaded 7748 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7749 SelectorsLoaded.end(), 7750 Selector()); 7751 7752 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7753 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7754 NumSLocEntriesRead, TotalNumSLocEntries, 7755 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7756 if (!TypesLoaded.empty()) 7757 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7758 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7759 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7760 if (!DeclsLoaded.empty()) 7761 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7762 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7763 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7764 if (!IdentifiersLoaded.empty()) 7765 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7766 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7767 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7768 if (!MacrosLoaded.empty()) 7769 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7770 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7771 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7772 if (!SelectorsLoaded.empty()) 7773 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7774 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7775 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7776 if (TotalNumStatements) 7777 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7778 NumStatementsRead, TotalNumStatements, 7779 ((float)NumStatementsRead/TotalNumStatements * 100)); 7780 if (TotalNumMacros) 7781 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7782 NumMacrosRead, TotalNumMacros, 7783 ((float)NumMacrosRead/TotalNumMacros * 100)); 7784 if (TotalLexicalDeclContexts) 7785 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7786 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7787 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7788 * 100)); 7789 if (TotalVisibleDeclContexts) 7790 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7791 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7792 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7793 * 100)); 7794 if (TotalNumMethodPoolEntries) 7795 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7796 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7797 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7798 * 100)); 7799 if (NumMethodPoolLookups) 7800 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7801 NumMethodPoolHits, NumMethodPoolLookups, 7802 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7803 if (NumMethodPoolTableLookups) 7804 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7805 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7806 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7807 * 100.0)); 7808 if (NumIdentifierLookupHits) 7809 std::fprintf(stderr, 7810 " %u / %u identifier table lookups succeeded (%f%%)\n", 7811 NumIdentifierLookupHits, NumIdentifierLookups, 7812 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7813 7814 if (GlobalIndex) { 7815 std::fprintf(stderr, "\n"); 7816 GlobalIndex->printStats(); 7817 } 7818 7819 std::fprintf(stderr, "\n"); 7820 dump(); 7821 std::fprintf(stderr, "\n"); 7822 } 7823 7824 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7825 LLVM_DUMP_METHOD static void 7826 dumpModuleIDMap(StringRef Name, 7827 const ContinuousRangeMap<Key, ModuleFile *, 7828 InitialCapacity> &Map) { 7829 if (Map.begin() == Map.end()) 7830 return; 7831 7832 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7833 7834 llvm::errs() << Name << ":\n"; 7835 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7836 I != IEnd; ++I) { 7837 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7838 << "\n"; 7839 } 7840 } 7841 7842 LLVM_DUMP_METHOD void ASTReader::dump() { 7843 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7844 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7845 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7846 dumpModuleIDMap("Global type map", GlobalTypeMap); 7847 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7848 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7849 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7850 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7851 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7852 dumpModuleIDMap("Global preprocessed entity map", 7853 GlobalPreprocessedEntityMap); 7854 7855 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7856 for (ModuleFile &M : ModuleMgr) 7857 M.dump(); 7858 } 7859 7860 /// Return the amount of memory used by memory buffers, breaking down 7861 /// by heap-backed versus mmap'ed memory. 7862 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7863 for (ModuleFile &I : ModuleMgr) { 7864 if (llvm::MemoryBuffer *buf = I.Buffer) { 7865 size_t bytes = buf->getBufferSize(); 7866 switch (buf->getBufferKind()) { 7867 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7868 sizes.malloc_bytes += bytes; 7869 break; 7870 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7871 sizes.mmap_bytes += bytes; 7872 break; 7873 } 7874 } 7875 } 7876 } 7877 7878 void ASTReader::InitializeSema(Sema &S) { 7879 SemaObj = &S; 7880 S.addExternalSource(this); 7881 7882 // Makes sure any declarations that were deserialized "too early" 7883 // still get added to the identifier's declaration chains. 7884 for (uint64_t ID : PreloadedDeclIDs) { 7885 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7886 pushExternalDeclIntoScope(D, D->getDeclName()); 7887 } 7888 PreloadedDeclIDs.clear(); 7889 7890 // FIXME: What happens if these are changed by a module import? 7891 if (!FPPragmaOptions.empty()) { 7892 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7893 FPOptionsOverride NewOverrides = 7894 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]); 7895 SemaObj->CurFPFeatures = 7896 NewOverrides.applyOverrides(SemaObj->getLangOpts()); 7897 } 7898 7899 SemaObj->OpenCLFeatures = OpenCLExtensions; 7900 7901 UpdateSema(); 7902 } 7903 7904 void ASTReader::UpdateSema() { 7905 assert(SemaObj && "no Sema to update"); 7906 7907 // Load the offsets of the declarations that Sema references. 7908 // They will be lazily deserialized when needed. 7909 if (!SemaDeclRefs.empty()) { 7910 assert(SemaDeclRefs.size() % 3 == 0); 7911 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7912 if (!SemaObj->StdNamespace) 7913 SemaObj->StdNamespace = SemaDeclRefs[I]; 7914 if (!SemaObj->StdBadAlloc) 7915 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7916 if (!SemaObj->StdAlignValT) 7917 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7918 } 7919 SemaDeclRefs.clear(); 7920 } 7921 7922 // Update the state of pragmas. Use the same API as if we had encountered the 7923 // pragma in the source. 7924 if(OptimizeOffPragmaLocation.isValid()) 7925 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7926 if (PragmaMSStructState != -1) 7927 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7928 if (PointersToMembersPragmaLocation.isValid()) { 7929 SemaObj->ActOnPragmaMSPointersToMembers( 7930 (LangOptions::PragmaMSPointersToMembersKind) 7931 PragmaMSPointersToMembersState, 7932 PointersToMembersPragmaLocation); 7933 } 7934 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7935 7936 if (PragmaAlignPackCurrentValue) { 7937 // The bottom of the stack might have a default value. It must be adjusted 7938 // to the current value to ensure that the packing state is preserved after 7939 // popping entries that were included/imported from a PCH/module. 7940 bool DropFirst = false; 7941 if (!PragmaAlignPackStack.empty() && 7942 PragmaAlignPackStack.front().Location.isInvalid()) { 7943 assert(PragmaAlignPackStack.front().Value == 7944 SemaObj->AlignPackStack.DefaultValue && 7945 "Expected a default alignment value"); 7946 SemaObj->AlignPackStack.Stack.emplace_back( 7947 PragmaAlignPackStack.front().SlotLabel, 7948 SemaObj->AlignPackStack.CurrentValue, 7949 SemaObj->AlignPackStack.CurrentPragmaLocation, 7950 PragmaAlignPackStack.front().PushLocation); 7951 DropFirst = true; 7952 } 7953 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack) 7954 .drop_front(DropFirst ? 1 : 0)) { 7955 SemaObj->AlignPackStack.Stack.emplace_back( 7956 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7957 } 7958 if (PragmaAlignPackCurrentLocation.isInvalid()) { 7959 assert(*PragmaAlignPackCurrentValue == 7960 SemaObj->AlignPackStack.DefaultValue && 7961 "Expected a default align and pack value"); 7962 // Keep the current values. 7963 } else { 7964 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue; 7965 SemaObj->AlignPackStack.CurrentPragmaLocation = 7966 PragmaAlignPackCurrentLocation; 7967 } 7968 } 7969 if (FpPragmaCurrentValue) { 7970 // The bottom of the stack might have a default value. It must be adjusted 7971 // to the current value to ensure that fp-pragma state is preserved after 7972 // popping entries that were included/imported from a PCH/module. 7973 bool DropFirst = false; 7974 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7975 assert(FpPragmaStack.front().Value == 7976 SemaObj->FpPragmaStack.DefaultValue && 7977 "Expected a default pragma float_control value"); 7978 SemaObj->FpPragmaStack.Stack.emplace_back( 7979 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7980 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7981 FpPragmaStack.front().PushLocation); 7982 DropFirst = true; 7983 } 7984 for (const auto &Entry : 7985 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7986 SemaObj->FpPragmaStack.Stack.emplace_back( 7987 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7988 if (FpPragmaCurrentLocation.isInvalid()) { 7989 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 7990 "Expected a default pragma float_control value"); 7991 // Keep the current values. 7992 } else { 7993 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 7994 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 7995 } 7996 } 7997 7998 // For non-modular AST files, restore visiblity of modules. 7999 for (auto &Import : ImportedModules) { 8000 if (Import.ImportLoc.isInvalid()) 8001 continue; 8002 if (Module *Imported = getSubmodule(Import.ID)) { 8003 SemaObj->makeModuleVisible(Imported, Import.ImportLoc); 8004 } 8005 } 8006 } 8007 8008 IdentifierInfo *ASTReader::get(StringRef Name) { 8009 // Note that we are loading an identifier. 8010 Deserializing AnIdentifier(this); 8011 8012 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 8013 NumIdentifierLookups, 8014 NumIdentifierLookupHits); 8015 8016 // We don't need to do identifier table lookups in C++ modules (we preload 8017 // all interesting declarations, and don't need to use the scope for name 8018 // lookups). Perform the lookup in PCH files, though, since we don't build 8019 // a complete initial identifier table if we're carrying on from a PCH. 8020 if (PP.getLangOpts().CPlusPlus) { 8021 for (auto F : ModuleMgr.pch_modules()) 8022 if (Visitor(*F)) 8023 break; 8024 } else { 8025 // If there is a global index, look there first to determine which modules 8026 // provably do not have any results for this identifier. 8027 GlobalModuleIndex::HitSet Hits; 8028 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 8029 if (!loadGlobalIndex()) { 8030 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 8031 HitsPtr = &Hits; 8032 } 8033 } 8034 8035 ModuleMgr.visit(Visitor, HitsPtr); 8036 } 8037 8038 IdentifierInfo *II = Visitor.getIdentifierInfo(); 8039 markIdentifierUpToDate(II); 8040 return II; 8041 } 8042 8043 namespace clang { 8044 8045 /// An identifier-lookup iterator that enumerates all of the 8046 /// identifiers stored within a set of AST files. 8047 class ASTIdentifierIterator : public IdentifierIterator { 8048 /// The AST reader whose identifiers are being enumerated. 8049 const ASTReader &Reader; 8050 8051 /// The current index into the chain of AST files stored in 8052 /// the AST reader. 8053 unsigned Index; 8054 8055 /// The current position within the identifier lookup table 8056 /// of the current AST file. 8057 ASTIdentifierLookupTable::key_iterator Current; 8058 8059 /// The end position within the identifier lookup table of 8060 /// the current AST file. 8061 ASTIdentifierLookupTable::key_iterator End; 8062 8063 /// Whether to skip any modules in the ASTReader. 8064 bool SkipModules; 8065 8066 public: 8067 explicit ASTIdentifierIterator(const ASTReader &Reader, 8068 bool SkipModules = false); 8069 8070 StringRef Next() override; 8071 }; 8072 8073 } // namespace clang 8074 8075 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 8076 bool SkipModules) 8077 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8078 } 8079 8080 StringRef ASTIdentifierIterator::Next() { 8081 while (Current == End) { 8082 // If we have exhausted all of our AST files, we're done. 8083 if (Index == 0) 8084 return StringRef(); 8085 8086 --Index; 8087 ModuleFile &F = Reader.ModuleMgr[Index]; 8088 if (SkipModules && F.isModule()) 8089 continue; 8090 8091 ASTIdentifierLookupTable *IdTable = 8092 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8093 Current = IdTable->key_begin(); 8094 End = IdTable->key_end(); 8095 } 8096 8097 // We have any identifiers remaining in the current AST file; return 8098 // the next one. 8099 StringRef Result = *Current; 8100 ++Current; 8101 return Result; 8102 } 8103 8104 namespace { 8105 8106 /// A utility for appending two IdentifierIterators. 8107 class ChainedIdentifierIterator : public IdentifierIterator { 8108 std::unique_ptr<IdentifierIterator> Current; 8109 std::unique_ptr<IdentifierIterator> Queued; 8110 8111 public: 8112 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8113 std::unique_ptr<IdentifierIterator> Second) 8114 : Current(std::move(First)), Queued(std::move(Second)) {} 8115 8116 StringRef Next() override { 8117 if (!Current) 8118 return StringRef(); 8119 8120 StringRef result = Current->Next(); 8121 if (!result.empty()) 8122 return result; 8123 8124 // Try the queued iterator, which may itself be empty. 8125 Current.reset(); 8126 std::swap(Current, Queued); 8127 return Next(); 8128 } 8129 }; 8130 8131 } // namespace 8132 8133 IdentifierIterator *ASTReader::getIdentifiers() { 8134 if (!loadGlobalIndex()) { 8135 std::unique_ptr<IdentifierIterator> ReaderIter( 8136 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8137 std::unique_ptr<IdentifierIterator> ModulesIter( 8138 GlobalIndex->createIdentifierIterator()); 8139 return new ChainedIdentifierIterator(std::move(ReaderIter), 8140 std::move(ModulesIter)); 8141 } 8142 8143 return new ASTIdentifierIterator(*this); 8144 } 8145 8146 namespace clang { 8147 namespace serialization { 8148 8149 class ReadMethodPoolVisitor { 8150 ASTReader &Reader; 8151 Selector Sel; 8152 unsigned PriorGeneration; 8153 unsigned InstanceBits = 0; 8154 unsigned FactoryBits = 0; 8155 bool InstanceHasMoreThanOneDecl = false; 8156 bool FactoryHasMoreThanOneDecl = false; 8157 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8158 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8159 8160 public: 8161 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8162 unsigned PriorGeneration) 8163 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8164 8165 bool operator()(ModuleFile &M) { 8166 if (!M.SelectorLookupTable) 8167 return false; 8168 8169 // If we've already searched this module file, skip it now. 8170 if (M.Generation <= PriorGeneration) 8171 return true; 8172 8173 ++Reader.NumMethodPoolTableLookups; 8174 ASTSelectorLookupTable *PoolTable 8175 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8176 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8177 if (Pos == PoolTable->end()) 8178 return false; 8179 8180 ++Reader.NumMethodPoolTableHits; 8181 ++Reader.NumSelectorsRead; 8182 // FIXME: Not quite happy with the statistics here. We probably should 8183 // disable this tracking when called via LoadSelector. 8184 // Also, should entries without methods count as misses? 8185 ++Reader.NumMethodPoolEntriesRead; 8186 ASTSelectorLookupTrait::data_type Data = *Pos; 8187 if (Reader.DeserializationListener) 8188 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8189 8190 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8191 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8192 InstanceBits = Data.InstanceBits; 8193 FactoryBits = Data.FactoryBits; 8194 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8195 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8196 return true; 8197 } 8198 8199 /// Retrieve the instance methods found by this visitor. 8200 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8201 return InstanceMethods; 8202 } 8203 8204 /// Retrieve the instance methods found by this visitor. 8205 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8206 return FactoryMethods; 8207 } 8208 8209 unsigned getInstanceBits() const { return InstanceBits; } 8210 unsigned getFactoryBits() const { return FactoryBits; } 8211 8212 bool instanceHasMoreThanOneDecl() const { 8213 return InstanceHasMoreThanOneDecl; 8214 } 8215 8216 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8217 }; 8218 8219 } // namespace serialization 8220 } // namespace clang 8221 8222 /// Add the given set of methods to the method list. 8223 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8224 ObjCMethodList &List) { 8225 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8226 S.addMethodToGlobalList(&List, Methods[I]); 8227 } 8228 } 8229 8230 void ASTReader::ReadMethodPool(Selector Sel) { 8231 // Get the selector generation and update it to the current generation. 8232 unsigned &Generation = SelectorGeneration[Sel]; 8233 unsigned PriorGeneration = Generation; 8234 Generation = getGeneration(); 8235 SelectorOutOfDate[Sel] = false; 8236 8237 // Search for methods defined with this selector. 8238 ++NumMethodPoolLookups; 8239 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8240 ModuleMgr.visit(Visitor); 8241 8242 if (Visitor.getInstanceMethods().empty() && 8243 Visitor.getFactoryMethods().empty()) 8244 return; 8245 8246 ++NumMethodPoolHits; 8247 8248 if (!getSema()) 8249 return; 8250 8251 Sema &S = *getSema(); 8252 Sema::GlobalMethodPool::iterator Pos 8253 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 8254 8255 Pos->second.first.setBits(Visitor.getInstanceBits()); 8256 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8257 Pos->second.second.setBits(Visitor.getFactoryBits()); 8258 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8259 8260 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8261 // when building a module we keep every method individually and may need to 8262 // update hasMoreThanOneDecl as we add the methods. 8263 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8264 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8265 } 8266 8267 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8268 if (SelectorOutOfDate[Sel]) 8269 ReadMethodPool(Sel); 8270 } 8271 8272 void ASTReader::ReadKnownNamespaces( 8273 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8274 Namespaces.clear(); 8275 8276 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8277 if (NamespaceDecl *Namespace 8278 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8279 Namespaces.push_back(Namespace); 8280 } 8281 } 8282 8283 void ASTReader::ReadUndefinedButUsed( 8284 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8285 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8286 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8287 SourceLocation Loc = 8288 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8289 Undefined.insert(std::make_pair(D, Loc)); 8290 } 8291 } 8292 8293 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8294 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8295 Exprs) { 8296 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8297 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8298 uint64_t Count = DelayedDeleteExprs[Idx++]; 8299 for (uint64_t C = 0; C < Count; ++C) { 8300 SourceLocation DeleteLoc = 8301 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8302 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8303 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8304 } 8305 } 8306 } 8307 8308 void ASTReader::ReadTentativeDefinitions( 8309 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8310 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8311 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8312 if (Var) 8313 TentativeDefs.push_back(Var); 8314 } 8315 TentativeDefinitions.clear(); 8316 } 8317 8318 void ASTReader::ReadUnusedFileScopedDecls( 8319 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8320 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8321 DeclaratorDecl *D 8322 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8323 if (D) 8324 Decls.push_back(D); 8325 } 8326 UnusedFileScopedDecls.clear(); 8327 } 8328 8329 void ASTReader::ReadDelegatingConstructors( 8330 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8331 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8332 CXXConstructorDecl *D 8333 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8334 if (D) 8335 Decls.push_back(D); 8336 } 8337 DelegatingCtorDecls.clear(); 8338 } 8339 8340 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8341 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8342 TypedefNameDecl *D 8343 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8344 if (D) 8345 Decls.push_back(D); 8346 } 8347 ExtVectorDecls.clear(); 8348 } 8349 8350 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8351 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8352 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8353 ++I) { 8354 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8355 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8356 if (D) 8357 Decls.insert(D); 8358 } 8359 UnusedLocalTypedefNameCandidates.clear(); 8360 } 8361 8362 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8363 llvm::SmallSetVector<Decl *, 4> &Decls) { 8364 for (auto I : DeclsToCheckForDeferredDiags) { 8365 auto *D = dyn_cast_or_null<Decl>(GetDecl(I)); 8366 if (D) 8367 Decls.insert(D); 8368 } 8369 DeclsToCheckForDeferredDiags.clear(); 8370 } 8371 8372 void ASTReader::ReadReferencedSelectors( 8373 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8374 if (ReferencedSelectorsData.empty()) 8375 return; 8376 8377 // If there are @selector references added them to its pool. This is for 8378 // implementation of -Wselector. 8379 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8380 unsigned I = 0; 8381 while (I < DataSize) { 8382 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8383 SourceLocation SelLoc 8384 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8385 Sels.push_back(std::make_pair(Sel, SelLoc)); 8386 } 8387 ReferencedSelectorsData.clear(); 8388 } 8389 8390 void ASTReader::ReadWeakUndeclaredIdentifiers( 8391 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8392 if (WeakUndeclaredIdentifiers.empty()) 8393 return; 8394 8395 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8396 IdentifierInfo *WeakId 8397 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8398 IdentifierInfo *AliasId 8399 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8400 SourceLocation Loc 8401 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8402 bool Used = WeakUndeclaredIdentifiers[I++]; 8403 WeakInfo WI(AliasId, Loc); 8404 WI.setUsed(Used); 8405 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8406 } 8407 WeakUndeclaredIdentifiers.clear(); 8408 } 8409 8410 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8411 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8412 ExternalVTableUse VT; 8413 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8414 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8415 VT.DefinitionRequired = VTableUses[Idx++]; 8416 VTables.push_back(VT); 8417 } 8418 8419 VTableUses.clear(); 8420 } 8421 8422 void ASTReader::ReadPendingInstantiations( 8423 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8424 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8425 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8426 SourceLocation Loc 8427 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8428 8429 Pending.push_back(std::make_pair(D, Loc)); 8430 } 8431 PendingInstantiations.clear(); 8432 } 8433 8434 void ASTReader::ReadLateParsedTemplates( 8435 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8436 &LPTMap) { 8437 for (auto &LPT : LateParsedTemplates) { 8438 ModuleFile *FMod = LPT.first; 8439 RecordDataImpl &LateParsed = LPT.second; 8440 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; 8441 /* In loop */) { 8442 FunctionDecl *FD = 8443 cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++])); 8444 8445 auto LT = std::make_unique<LateParsedTemplate>(); 8446 LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]); 8447 8448 ModuleFile *F = getOwningModuleFile(LT->D); 8449 assert(F && "No module"); 8450 8451 unsigned TokN = LateParsed[Idx++]; 8452 LT->Toks.reserve(TokN); 8453 for (unsigned T = 0; T < TokN; ++T) 8454 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx)); 8455 8456 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8457 } 8458 } 8459 } 8460 8461 void ASTReader::LoadSelector(Selector Sel) { 8462 // It would be complicated to avoid reading the methods anyway. So don't. 8463 ReadMethodPool(Sel); 8464 } 8465 8466 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8467 assert(ID && "Non-zero identifier ID required"); 8468 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8469 IdentifiersLoaded[ID - 1] = II; 8470 if (DeserializationListener) 8471 DeserializationListener->IdentifierRead(ID, II); 8472 } 8473 8474 /// Set the globally-visible declarations associated with the given 8475 /// identifier. 8476 /// 8477 /// If the AST reader is currently in a state where the given declaration IDs 8478 /// cannot safely be resolved, they are queued until it is safe to resolve 8479 /// them. 8480 /// 8481 /// \param II an IdentifierInfo that refers to one or more globally-visible 8482 /// declarations. 8483 /// 8484 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8485 /// visible at global scope. 8486 /// 8487 /// \param Decls if non-null, this vector will be populated with the set of 8488 /// deserialized declarations. These declarations will not be pushed into 8489 /// scope. 8490 void 8491 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8492 const SmallVectorImpl<uint32_t> &DeclIDs, 8493 SmallVectorImpl<Decl *> *Decls) { 8494 if (NumCurrentElementsDeserializing && !Decls) { 8495 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8496 return; 8497 } 8498 8499 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8500 if (!SemaObj) { 8501 // Queue this declaration so that it will be added to the 8502 // translation unit scope and identifier's declaration chain 8503 // once a Sema object is known. 8504 PreloadedDeclIDs.push_back(DeclIDs[I]); 8505 continue; 8506 } 8507 8508 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8509 8510 // If we're simply supposed to record the declarations, do so now. 8511 if (Decls) { 8512 Decls->push_back(D); 8513 continue; 8514 } 8515 8516 // Introduce this declaration into the translation-unit scope 8517 // and add it to the declaration chain for this identifier, so 8518 // that (unqualified) name lookup will find it. 8519 pushExternalDeclIntoScope(D, II); 8520 } 8521 } 8522 8523 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8524 if (ID == 0) 8525 return nullptr; 8526 8527 if (IdentifiersLoaded.empty()) { 8528 Error("no identifier table in AST file"); 8529 return nullptr; 8530 } 8531 8532 ID -= 1; 8533 if (!IdentifiersLoaded[ID]) { 8534 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8535 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8536 ModuleFile *M = I->second; 8537 unsigned Index = ID - M->BaseIdentifierID; 8538 const unsigned char *Data = 8539 M->IdentifierTableData + M->IdentifierOffsets[Index]; 8540 8541 ASTIdentifierLookupTrait Trait(*this, *M); 8542 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 8543 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 8544 auto &II = PP.getIdentifierTable().get(Key); 8545 IdentifiersLoaded[ID] = &II; 8546 markIdentifierFromAST(*this, II); 8547 if (DeserializationListener) 8548 DeserializationListener->IdentifierRead(ID + 1, &II); 8549 } 8550 8551 return IdentifiersLoaded[ID]; 8552 } 8553 8554 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8555 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8556 } 8557 8558 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8559 if (LocalID < NUM_PREDEF_IDENT_IDS) 8560 return LocalID; 8561 8562 if (!M.ModuleOffsetMap.empty()) 8563 ReadModuleOffsetMap(M); 8564 8565 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8566 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8567 assert(I != M.IdentifierRemap.end() 8568 && "Invalid index into identifier index remap"); 8569 8570 return LocalID + I->second; 8571 } 8572 8573 MacroInfo *ASTReader::getMacro(MacroID ID) { 8574 if (ID == 0) 8575 return nullptr; 8576 8577 if (MacrosLoaded.empty()) { 8578 Error("no macro table in AST file"); 8579 return nullptr; 8580 } 8581 8582 ID -= NUM_PREDEF_MACRO_IDS; 8583 if (!MacrosLoaded[ID]) { 8584 GlobalMacroMapType::iterator I 8585 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8586 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8587 ModuleFile *M = I->second; 8588 unsigned Index = ID - M->BaseMacroID; 8589 MacrosLoaded[ID] = 8590 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8591 8592 if (DeserializationListener) 8593 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8594 MacrosLoaded[ID]); 8595 } 8596 8597 return MacrosLoaded[ID]; 8598 } 8599 8600 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8601 if (LocalID < NUM_PREDEF_MACRO_IDS) 8602 return LocalID; 8603 8604 if (!M.ModuleOffsetMap.empty()) 8605 ReadModuleOffsetMap(M); 8606 8607 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8608 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8609 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8610 8611 return LocalID + I->second; 8612 } 8613 8614 serialization::SubmoduleID 8615 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8616 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8617 return LocalID; 8618 8619 if (!M.ModuleOffsetMap.empty()) 8620 ReadModuleOffsetMap(M); 8621 8622 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8623 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8624 assert(I != M.SubmoduleRemap.end() 8625 && "Invalid index into submodule index remap"); 8626 8627 return LocalID + I->second; 8628 } 8629 8630 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8631 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8632 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8633 return nullptr; 8634 } 8635 8636 if (GlobalID > SubmodulesLoaded.size()) { 8637 Error("submodule ID out of range in AST file"); 8638 return nullptr; 8639 } 8640 8641 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8642 } 8643 8644 Module *ASTReader::getModule(unsigned ID) { 8645 return getSubmodule(ID); 8646 } 8647 8648 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8649 if (ID & 1) { 8650 // It's a module, look it up by submodule ID. 8651 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8652 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8653 } else { 8654 // It's a prefix (preamble, PCH, ...). Look it up by index. 8655 unsigned IndexFromEnd = ID >> 1; 8656 assert(IndexFromEnd && "got reference to unknown module file"); 8657 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8658 } 8659 } 8660 8661 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8662 if (!F) 8663 return 1; 8664 8665 // For a file representing a module, use the submodule ID of the top-level 8666 // module as the file ID. For any other kind of file, the number of such 8667 // files loaded beforehand will be the same on reload. 8668 // FIXME: Is this true even if we have an explicit module file and a PCH? 8669 if (F->isModule()) 8670 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8671 8672 auto PCHModules = getModuleManager().pch_modules(); 8673 auto I = llvm::find(PCHModules, F); 8674 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8675 return (I - PCHModules.end()) << 1; 8676 } 8677 8678 llvm::Optional<ASTSourceDescriptor> 8679 ASTReader::getSourceDescriptor(unsigned ID) { 8680 if (Module *M = getSubmodule(ID)) 8681 return ASTSourceDescriptor(*M); 8682 8683 // If there is only a single PCH, return it instead. 8684 // Chained PCH are not supported. 8685 const auto &PCHChain = ModuleMgr.pch_modules(); 8686 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8687 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8688 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8689 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8690 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8691 MF.Signature); 8692 } 8693 return None; 8694 } 8695 8696 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8697 auto I = DefinitionSource.find(FD); 8698 if (I == DefinitionSource.end()) 8699 return EK_ReplyHazy; 8700 return I->second ? EK_Never : EK_Always; 8701 } 8702 8703 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8704 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8705 } 8706 8707 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8708 if (ID == 0) 8709 return Selector(); 8710 8711 if (ID > SelectorsLoaded.size()) { 8712 Error("selector ID out of range in AST file"); 8713 return Selector(); 8714 } 8715 8716 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8717 // Load this selector from the selector table. 8718 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8719 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8720 ModuleFile &M = *I->second; 8721 ASTSelectorLookupTrait Trait(*this, M); 8722 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8723 SelectorsLoaded[ID - 1] = 8724 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8725 if (DeserializationListener) 8726 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8727 } 8728 8729 return SelectorsLoaded[ID - 1]; 8730 } 8731 8732 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8733 return DecodeSelector(ID); 8734 } 8735 8736 uint32_t ASTReader::GetNumExternalSelectors() { 8737 // ID 0 (the null selector) is considered an external selector. 8738 return getTotalNumSelectors() + 1; 8739 } 8740 8741 serialization::SelectorID 8742 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8743 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8744 return LocalID; 8745 8746 if (!M.ModuleOffsetMap.empty()) 8747 ReadModuleOffsetMap(M); 8748 8749 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8750 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8751 assert(I != M.SelectorRemap.end() 8752 && "Invalid index into selector index remap"); 8753 8754 return LocalID + I->second; 8755 } 8756 8757 DeclarationNameLoc 8758 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8759 switch (Name.getNameKind()) { 8760 case DeclarationName::CXXConstructorName: 8761 case DeclarationName::CXXDestructorName: 8762 case DeclarationName::CXXConversionFunctionName: 8763 return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo()); 8764 8765 case DeclarationName::CXXOperatorName: 8766 return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange()); 8767 8768 case DeclarationName::CXXLiteralOperatorName: 8769 return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc( 8770 readSourceLocation()); 8771 8772 case DeclarationName::Identifier: 8773 case DeclarationName::ObjCZeroArgSelector: 8774 case DeclarationName::ObjCOneArgSelector: 8775 case DeclarationName::ObjCMultiArgSelector: 8776 case DeclarationName::CXXUsingDirective: 8777 case DeclarationName::CXXDeductionGuideName: 8778 break; 8779 } 8780 return DeclarationNameLoc(); 8781 } 8782 8783 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8784 DeclarationNameInfo NameInfo; 8785 NameInfo.setName(readDeclarationName()); 8786 NameInfo.setLoc(readSourceLocation()); 8787 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8788 return NameInfo; 8789 } 8790 8791 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8792 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8793 unsigned NumTPLists = readInt(); 8794 Info.NumTemplParamLists = NumTPLists; 8795 if (NumTPLists) { 8796 Info.TemplParamLists = 8797 new (getContext()) TemplateParameterList *[NumTPLists]; 8798 for (unsigned i = 0; i != NumTPLists; ++i) 8799 Info.TemplParamLists[i] = readTemplateParameterList(); 8800 } 8801 } 8802 8803 TemplateParameterList * 8804 ASTRecordReader::readTemplateParameterList() { 8805 SourceLocation TemplateLoc = readSourceLocation(); 8806 SourceLocation LAngleLoc = readSourceLocation(); 8807 SourceLocation RAngleLoc = readSourceLocation(); 8808 8809 unsigned NumParams = readInt(); 8810 SmallVector<NamedDecl *, 16> Params; 8811 Params.reserve(NumParams); 8812 while (NumParams--) 8813 Params.push_back(readDeclAs<NamedDecl>()); 8814 8815 bool HasRequiresClause = readBool(); 8816 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8817 8818 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8819 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8820 return TemplateParams; 8821 } 8822 8823 void ASTRecordReader::readTemplateArgumentList( 8824 SmallVectorImpl<TemplateArgument> &TemplArgs, 8825 bool Canonicalize) { 8826 unsigned NumTemplateArgs = readInt(); 8827 TemplArgs.reserve(NumTemplateArgs); 8828 while (NumTemplateArgs--) 8829 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8830 } 8831 8832 /// Read a UnresolvedSet structure. 8833 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8834 unsigned NumDecls = readInt(); 8835 Set.reserve(getContext(), NumDecls); 8836 while (NumDecls--) { 8837 DeclID ID = readDeclID(); 8838 AccessSpecifier AS = (AccessSpecifier) readInt(); 8839 Set.addLazyDecl(getContext(), ID, AS); 8840 } 8841 } 8842 8843 CXXBaseSpecifier 8844 ASTRecordReader::readCXXBaseSpecifier() { 8845 bool isVirtual = readBool(); 8846 bool isBaseOfClass = readBool(); 8847 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8848 bool inheritConstructors = readBool(); 8849 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8850 SourceRange Range = readSourceRange(); 8851 SourceLocation EllipsisLoc = readSourceLocation(); 8852 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8853 EllipsisLoc); 8854 Result.setInheritConstructors(inheritConstructors); 8855 return Result; 8856 } 8857 8858 CXXCtorInitializer ** 8859 ASTRecordReader::readCXXCtorInitializers() { 8860 ASTContext &Context = getContext(); 8861 unsigned NumInitializers = readInt(); 8862 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8863 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8864 for (unsigned i = 0; i != NumInitializers; ++i) { 8865 TypeSourceInfo *TInfo = nullptr; 8866 bool IsBaseVirtual = false; 8867 FieldDecl *Member = nullptr; 8868 IndirectFieldDecl *IndirectMember = nullptr; 8869 8870 CtorInitializerType Type = (CtorInitializerType) readInt(); 8871 switch (Type) { 8872 case CTOR_INITIALIZER_BASE: 8873 TInfo = readTypeSourceInfo(); 8874 IsBaseVirtual = readBool(); 8875 break; 8876 8877 case CTOR_INITIALIZER_DELEGATING: 8878 TInfo = readTypeSourceInfo(); 8879 break; 8880 8881 case CTOR_INITIALIZER_MEMBER: 8882 Member = readDeclAs<FieldDecl>(); 8883 break; 8884 8885 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8886 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8887 break; 8888 } 8889 8890 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8891 Expr *Init = readExpr(); 8892 SourceLocation LParenLoc = readSourceLocation(); 8893 SourceLocation RParenLoc = readSourceLocation(); 8894 8895 CXXCtorInitializer *BOMInit; 8896 if (Type == CTOR_INITIALIZER_BASE) 8897 BOMInit = new (Context) 8898 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8899 RParenLoc, MemberOrEllipsisLoc); 8900 else if (Type == CTOR_INITIALIZER_DELEGATING) 8901 BOMInit = new (Context) 8902 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8903 else if (Member) 8904 BOMInit = new (Context) 8905 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8906 Init, RParenLoc); 8907 else 8908 BOMInit = new (Context) 8909 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8910 LParenLoc, Init, RParenLoc); 8911 8912 if (/*IsWritten*/readBool()) { 8913 unsigned SourceOrder = readInt(); 8914 BOMInit->setSourceOrder(SourceOrder); 8915 } 8916 8917 CtorInitializers[i] = BOMInit; 8918 } 8919 8920 return CtorInitializers; 8921 } 8922 8923 NestedNameSpecifierLoc 8924 ASTRecordReader::readNestedNameSpecifierLoc() { 8925 ASTContext &Context = getContext(); 8926 unsigned N = readInt(); 8927 NestedNameSpecifierLocBuilder Builder; 8928 for (unsigned I = 0; I != N; ++I) { 8929 auto Kind = readNestedNameSpecifierKind(); 8930 switch (Kind) { 8931 case NestedNameSpecifier::Identifier: { 8932 IdentifierInfo *II = readIdentifier(); 8933 SourceRange Range = readSourceRange(); 8934 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8935 break; 8936 } 8937 8938 case NestedNameSpecifier::Namespace: { 8939 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8940 SourceRange Range = readSourceRange(); 8941 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8942 break; 8943 } 8944 8945 case NestedNameSpecifier::NamespaceAlias: { 8946 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8947 SourceRange Range = readSourceRange(); 8948 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8949 break; 8950 } 8951 8952 case NestedNameSpecifier::TypeSpec: 8953 case NestedNameSpecifier::TypeSpecWithTemplate: { 8954 bool Template = readBool(); 8955 TypeSourceInfo *T = readTypeSourceInfo(); 8956 if (!T) 8957 return NestedNameSpecifierLoc(); 8958 SourceLocation ColonColonLoc = readSourceLocation(); 8959 8960 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8961 Builder.Extend(Context, 8962 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8963 T->getTypeLoc(), ColonColonLoc); 8964 break; 8965 } 8966 8967 case NestedNameSpecifier::Global: { 8968 SourceLocation ColonColonLoc = readSourceLocation(); 8969 Builder.MakeGlobal(Context, ColonColonLoc); 8970 break; 8971 } 8972 8973 case NestedNameSpecifier::Super: { 8974 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8975 SourceRange Range = readSourceRange(); 8976 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8977 break; 8978 } 8979 } 8980 } 8981 8982 return Builder.getWithLocInContext(Context); 8983 } 8984 8985 SourceRange 8986 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8987 unsigned &Idx) { 8988 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8989 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8990 return SourceRange(beg, end); 8991 } 8992 8993 /// Read a floating-point value 8994 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 8995 return llvm::APFloat(Sem, readAPInt()); 8996 } 8997 8998 // Read a string 8999 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 9000 unsigned Len = Record[Idx++]; 9001 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 9002 Idx += Len; 9003 return Result; 9004 } 9005 9006 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 9007 unsigned &Idx) { 9008 std::string Filename = ReadString(Record, Idx); 9009 ResolveImportedPath(F, Filename); 9010 return Filename; 9011 } 9012 9013 std::string ASTReader::ReadPath(StringRef BaseDirectory, 9014 const RecordData &Record, unsigned &Idx) { 9015 std::string Filename = ReadString(Record, Idx); 9016 if (!BaseDirectory.empty()) 9017 ResolveImportedPath(Filename, BaseDirectory); 9018 return Filename; 9019 } 9020 9021 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 9022 unsigned &Idx) { 9023 unsigned Major = Record[Idx++]; 9024 unsigned Minor = Record[Idx++]; 9025 unsigned Subminor = Record[Idx++]; 9026 if (Minor == 0) 9027 return VersionTuple(Major); 9028 if (Subminor == 0) 9029 return VersionTuple(Major, Minor - 1); 9030 return VersionTuple(Major, Minor - 1, Subminor - 1); 9031 } 9032 9033 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 9034 const RecordData &Record, 9035 unsigned &Idx) { 9036 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 9037 return CXXTemporary::Create(getContext(), Decl); 9038 } 9039 9040 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9041 return Diag(CurrentImportLoc, DiagID); 9042 } 9043 9044 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9045 return Diags.Report(Loc, DiagID); 9046 } 9047 9048 /// Retrieve the identifier table associated with the 9049 /// preprocessor. 9050 IdentifierTable &ASTReader::getIdentifierTable() { 9051 return PP.getIdentifierTable(); 9052 } 9053 9054 /// Record that the given ID maps to the given switch-case 9055 /// statement. 9056 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9057 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9058 "Already have a SwitchCase with this ID"); 9059 (*CurrSwitchCaseStmts)[ID] = SC; 9060 } 9061 9062 /// Retrieve the switch-case statement with the given ID. 9063 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9064 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9065 return (*CurrSwitchCaseStmts)[ID]; 9066 } 9067 9068 void ASTReader::ClearSwitchCaseIDs() { 9069 CurrSwitchCaseStmts->clear(); 9070 } 9071 9072 void ASTReader::ReadComments() { 9073 ASTContext &Context = getContext(); 9074 std::vector<RawComment *> Comments; 9075 for (SmallVectorImpl<std::pair<BitstreamCursor, 9076 serialization::ModuleFile *>>::iterator 9077 I = CommentsCursors.begin(), 9078 E = CommentsCursors.end(); 9079 I != E; ++I) { 9080 Comments.clear(); 9081 BitstreamCursor &Cursor = I->first; 9082 serialization::ModuleFile &F = *I->second; 9083 SavedStreamPosition SavedPosition(Cursor); 9084 9085 RecordData Record; 9086 while (true) { 9087 Expected<llvm::BitstreamEntry> MaybeEntry = 9088 Cursor.advanceSkippingSubblocks( 9089 BitstreamCursor::AF_DontPopBlockAtEnd); 9090 if (!MaybeEntry) { 9091 Error(MaybeEntry.takeError()); 9092 return; 9093 } 9094 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9095 9096 switch (Entry.Kind) { 9097 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9098 case llvm::BitstreamEntry::Error: 9099 Error("malformed block record in AST file"); 9100 return; 9101 case llvm::BitstreamEntry::EndBlock: 9102 goto NextCursor; 9103 case llvm::BitstreamEntry::Record: 9104 // The interesting case. 9105 break; 9106 } 9107 9108 // Read a record. 9109 Record.clear(); 9110 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9111 if (!MaybeComment) { 9112 Error(MaybeComment.takeError()); 9113 return; 9114 } 9115 switch ((CommentRecordTypes)MaybeComment.get()) { 9116 case COMMENTS_RAW_COMMENT: { 9117 unsigned Idx = 0; 9118 SourceRange SR = ReadSourceRange(F, Record, Idx); 9119 RawComment::CommentKind Kind = 9120 (RawComment::CommentKind) Record[Idx++]; 9121 bool IsTrailingComment = Record[Idx++]; 9122 bool IsAlmostTrailingComment = Record[Idx++]; 9123 Comments.push_back(new (Context) RawComment( 9124 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9125 break; 9126 } 9127 } 9128 } 9129 NextCursor: 9130 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9131 FileToOffsetToComment; 9132 for (RawComment *C : Comments) { 9133 SourceLocation CommentLoc = C->getBeginLoc(); 9134 if (CommentLoc.isValid()) { 9135 std::pair<FileID, unsigned> Loc = 9136 SourceMgr.getDecomposedLoc(CommentLoc); 9137 if (Loc.first.isValid()) 9138 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9139 } 9140 } 9141 } 9142 } 9143 9144 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9145 bool IncludeSystem, bool Complain, 9146 llvm::function_ref<void(const serialization::InputFile &IF, 9147 bool isSystem)> Visitor) { 9148 unsigned NumUserInputs = MF.NumUserInputFiles; 9149 unsigned NumInputs = MF.InputFilesLoaded.size(); 9150 assert(NumUserInputs <= NumInputs); 9151 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9152 for (unsigned I = 0; I < N; ++I) { 9153 bool IsSystem = I >= NumUserInputs; 9154 InputFile IF = getInputFile(MF, I+1, Complain); 9155 Visitor(IF, IsSystem); 9156 } 9157 } 9158 9159 void ASTReader::visitTopLevelModuleMaps( 9160 serialization::ModuleFile &MF, 9161 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9162 unsigned NumInputs = MF.InputFilesLoaded.size(); 9163 for (unsigned I = 0; I < NumInputs; ++I) { 9164 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9165 if (IFI.TopLevelModuleMap) 9166 // FIXME: This unnecessarily re-reads the InputFileInfo. 9167 if (auto FE = getInputFile(MF, I + 1).getFile()) 9168 Visitor(FE); 9169 } 9170 } 9171 9172 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9173 // If we know the owning module, use it. 9174 if (Module *M = D->getImportedOwningModule()) 9175 return M->getFullModuleName(); 9176 9177 // Otherwise, use the name of the top-level module the decl is within. 9178 if (ModuleFile *M = getOwningModuleFile(D)) 9179 return M->ModuleName; 9180 9181 // Not from a module. 9182 return {}; 9183 } 9184 9185 void ASTReader::finishPendingActions() { 9186 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9187 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9188 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9189 !PendingUpdateRecords.empty()) { 9190 // If any identifiers with corresponding top-level declarations have 9191 // been loaded, load those declarations now. 9192 using TopLevelDeclsMap = 9193 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9194 TopLevelDeclsMap TopLevelDecls; 9195 9196 while (!PendingIdentifierInfos.empty()) { 9197 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9198 SmallVector<uint32_t, 4> DeclIDs = 9199 std::move(PendingIdentifierInfos.back().second); 9200 PendingIdentifierInfos.pop_back(); 9201 9202 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9203 } 9204 9205 // Load each function type that we deferred loading because it was a 9206 // deduced type that might refer to a local type declared within itself. 9207 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9208 auto *FD = PendingFunctionTypes[I].first; 9209 FD->setType(GetType(PendingFunctionTypes[I].second)); 9210 9211 // If we gave a function a deduced return type, remember that we need to 9212 // propagate that along the redeclaration chain. 9213 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9214 if (DT && DT->isDeduced()) 9215 PendingDeducedTypeUpdates.insert( 9216 {FD->getCanonicalDecl(), FD->getReturnType()}); 9217 } 9218 PendingFunctionTypes.clear(); 9219 9220 // For each decl chain that we wanted to complete while deserializing, mark 9221 // it as "still needs to be completed". 9222 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9223 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9224 } 9225 PendingIncompleteDeclChains.clear(); 9226 9227 // Load pending declaration chains. 9228 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9229 loadPendingDeclChain(PendingDeclChains[I].first, 9230 PendingDeclChains[I].second); 9231 PendingDeclChains.clear(); 9232 9233 // Make the most recent of the top-level declarations visible. 9234 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9235 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9236 IdentifierInfo *II = TLD->first; 9237 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9238 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9239 } 9240 } 9241 9242 // Load any pending macro definitions. 9243 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9244 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9245 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9246 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9247 // Initialize the macro history from chained-PCHs ahead of module imports. 9248 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9249 ++IDIdx) { 9250 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9251 if (!Info.M->isModule()) 9252 resolvePendingMacro(II, Info); 9253 } 9254 // Handle module imports. 9255 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9256 ++IDIdx) { 9257 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9258 if (Info.M->isModule()) 9259 resolvePendingMacro(II, Info); 9260 } 9261 } 9262 PendingMacroIDs.clear(); 9263 9264 // Wire up the DeclContexts for Decls that we delayed setting until 9265 // recursive loading is completed. 9266 while (!PendingDeclContextInfos.empty()) { 9267 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9268 PendingDeclContextInfos.pop_front(); 9269 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9270 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9271 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9272 } 9273 9274 // Perform any pending declaration updates. 9275 while (!PendingUpdateRecords.empty()) { 9276 auto Update = PendingUpdateRecords.pop_back_val(); 9277 ReadingKindTracker ReadingKind(Read_Decl, *this); 9278 loadDeclUpdateRecords(Update); 9279 } 9280 } 9281 9282 // At this point, all update records for loaded decls are in place, so any 9283 // fake class definitions should have become real. 9284 assert(PendingFakeDefinitionData.empty() && 9285 "faked up a class definition but never saw the real one"); 9286 9287 // If we deserialized any C++ or Objective-C class definitions, any 9288 // Objective-C protocol definitions, or any redeclarable templates, make sure 9289 // that all redeclarations point to the definitions. Note that this can only 9290 // happen now, after the redeclaration chains have been fully wired. 9291 for (Decl *D : PendingDefinitions) { 9292 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9293 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9294 // Make sure that the TagType points at the definition. 9295 const_cast<TagType*>(TagT)->decl = TD; 9296 } 9297 9298 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9299 for (auto *R = getMostRecentExistingDecl(RD); R; 9300 R = R->getPreviousDecl()) { 9301 assert((R == D) == 9302 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9303 "declaration thinks it's the definition but it isn't"); 9304 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9305 } 9306 } 9307 9308 continue; 9309 } 9310 9311 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9312 // Make sure that the ObjCInterfaceType points at the definition. 9313 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9314 ->Decl = ID; 9315 9316 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9317 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9318 9319 continue; 9320 } 9321 9322 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9323 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9324 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9325 9326 continue; 9327 } 9328 9329 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9330 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9331 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9332 } 9333 PendingDefinitions.clear(); 9334 9335 // Load the bodies of any functions or methods we've encountered. We do 9336 // this now (delayed) so that we can be sure that the declaration chains 9337 // have been fully wired up (hasBody relies on this). 9338 // FIXME: We shouldn't require complete redeclaration chains here. 9339 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9340 PBEnd = PendingBodies.end(); 9341 PB != PBEnd; ++PB) { 9342 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9343 // For a function defined inline within a class template, force the 9344 // canonical definition to be the one inside the canonical definition of 9345 // the template. This ensures that we instantiate from a correct view 9346 // of the template. 9347 // 9348 // Sadly we can't do this more generally: we can't be sure that all 9349 // copies of an arbitrary class definition will have the same members 9350 // defined (eg, some member functions may not be instantiated, and some 9351 // special members may or may not have been implicitly defined). 9352 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9353 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9354 continue; 9355 9356 // FIXME: Check for =delete/=default? 9357 // FIXME: Complain about ODR violations here? 9358 const FunctionDecl *Defn = nullptr; 9359 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9360 FD->setLazyBody(PB->second); 9361 } else { 9362 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9363 mergeDefinitionVisibility(NonConstDefn, FD); 9364 9365 if (!FD->isLateTemplateParsed() && 9366 !NonConstDefn->isLateTemplateParsed() && 9367 FD->getODRHash() != NonConstDefn->getODRHash()) { 9368 if (!isa<CXXMethodDecl>(FD)) { 9369 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9370 } else if (FD->getLexicalParent()->isFileContext() && 9371 NonConstDefn->getLexicalParent()->isFileContext()) { 9372 // Only diagnose out-of-line method definitions. If they are 9373 // in class definitions, then an error will be generated when 9374 // processing the class bodies. 9375 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9376 } 9377 } 9378 } 9379 continue; 9380 } 9381 9382 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9383 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9384 MD->setLazyBody(PB->second); 9385 } 9386 PendingBodies.clear(); 9387 9388 // Do some cleanup. 9389 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9390 getContext().deduplicateMergedDefinitonsFor(ND); 9391 PendingMergedDefinitionsToDeduplicate.clear(); 9392 } 9393 9394 void ASTReader::diagnoseOdrViolations() { 9395 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9396 PendingFunctionOdrMergeFailures.empty() && 9397 PendingEnumOdrMergeFailures.empty()) 9398 return; 9399 9400 // Trigger the import of the full definition of each class that had any 9401 // odr-merging problems, so we can produce better diagnostics for them. 9402 // These updates may in turn find and diagnose some ODR failures, so take 9403 // ownership of the set first. 9404 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9405 PendingOdrMergeFailures.clear(); 9406 for (auto &Merge : OdrMergeFailures) { 9407 Merge.first->buildLookup(); 9408 Merge.first->decls_begin(); 9409 Merge.first->bases_begin(); 9410 Merge.first->vbases_begin(); 9411 for (auto &RecordPair : Merge.second) { 9412 auto *RD = RecordPair.first; 9413 RD->decls_begin(); 9414 RD->bases_begin(); 9415 RD->vbases_begin(); 9416 } 9417 } 9418 9419 // Trigger the import of functions. 9420 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9421 PendingFunctionOdrMergeFailures.clear(); 9422 for (auto &Merge : FunctionOdrMergeFailures) { 9423 Merge.first->buildLookup(); 9424 Merge.first->decls_begin(); 9425 Merge.first->getBody(); 9426 for (auto &FD : Merge.second) { 9427 FD->buildLookup(); 9428 FD->decls_begin(); 9429 FD->getBody(); 9430 } 9431 } 9432 9433 // Trigger the import of enums. 9434 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9435 PendingEnumOdrMergeFailures.clear(); 9436 for (auto &Merge : EnumOdrMergeFailures) { 9437 Merge.first->decls_begin(); 9438 for (auto &Enum : Merge.second) { 9439 Enum->decls_begin(); 9440 } 9441 } 9442 9443 // For each declaration from a merged context, check that the canonical 9444 // definition of that context also contains a declaration of the same 9445 // entity. 9446 // 9447 // Caution: this loop does things that might invalidate iterators into 9448 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9449 while (!PendingOdrMergeChecks.empty()) { 9450 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9451 9452 // FIXME: Skip over implicit declarations for now. This matters for things 9453 // like implicitly-declared special member functions. This isn't entirely 9454 // correct; we can end up with multiple unmerged declarations of the same 9455 // implicit entity. 9456 if (D->isImplicit()) 9457 continue; 9458 9459 DeclContext *CanonDef = D->getDeclContext(); 9460 9461 bool Found = false; 9462 const Decl *DCanon = D->getCanonicalDecl(); 9463 9464 for (auto RI : D->redecls()) { 9465 if (RI->getLexicalDeclContext() == CanonDef) { 9466 Found = true; 9467 break; 9468 } 9469 } 9470 if (Found) 9471 continue; 9472 9473 // Quick check failed, time to do the slow thing. Note, we can't just 9474 // look up the name of D in CanonDef here, because the member that is 9475 // in CanonDef might not be found by name lookup (it might have been 9476 // replaced by a more recent declaration in the lookup table), and we 9477 // can't necessarily find it in the redeclaration chain because it might 9478 // be merely mergeable, not redeclarable. 9479 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9480 for (auto *CanonMember : CanonDef->decls()) { 9481 if (CanonMember->getCanonicalDecl() == DCanon) { 9482 // This can happen if the declaration is merely mergeable and not 9483 // actually redeclarable (we looked for redeclarations earlier). 9484 // 9485 // FIXME: We should be able to detect this more efficiently, without 9486 // pulling in all of the members of CanonDef. 9487 Found = true; 9488 break; 9489 } 9490 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9491 if (ND->getDeclName() == D->getDeclName()) 9492 Candidates.push_back(ND); 9493 } 9494 9495 if (!Found) { 9496 // The AST doesn't like TagDecls becoming invalid after they've been 9497 // completed. We only really need to mark FieldDecls as invalid here. 9498 if (!isa<TagDecl>(D)) 9499 D->setInvalidDecl(); 9500 9501 // Ensure we don't accidentally recursively enter deserialization while 9502 // we're producing our diagnostic. 9503 Deserializing RecursionGuard(this); 9504 9505 std::string CanonDefModule = 9506 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9507 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9508 << D << getOwningModuleNameForDiagnostic(D) 9509 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9510 9511 if (Candidates.empty()) 9512 Diag(cast<Decl>(CanonDef)->getLocation(), 9513 diag::note_module_odr_violation_no_possible_decls) << D; 9514 else { 9515 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9516 Diag(Candidates[I]->getLocation(), 9517 diag::note_module_odr_violation_possible_decl) 9518 << Candidates[I]; 9519 } 9520 9521 DiagnosedOdrMergeFailures.insert(CanonDef); 9522 } 9523 } 9524 9525 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9526 EnumOdrMergeFailures.empty()) 9527 return; 9528 9529 // Ensure we don't accidentally recursively enter deserialization while 9530 // we're producing our diagnostics. 9531 Deserializing RecursionGuard(this); 9532 9533 // Common code for hashing helpers. 9534 ODRHash Hash; 9535 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9536 Hash.clear(); 9537 Hash.AddQualType(Ty); 9538 return Hash.CalculateHash(); 9539 }; 9540 9541 auto ComputeODRHash = [&Hash](const Stmt *S) { 9542 assert(S); 9543 Hash.clear(); 9544 Hash.AddStmt(S); 9545 return Hash.CalculateHash(); 9546 }; 9547 9548 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9549 assert(D); 9550 Hash.clear(); 9551 Hash.AddSubDecl(D); 9552 return Hash.CalculateHash(); 9553 }; 9554 9555 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9556 Hash.clear(); 9557 Hash.AddTemplateArgument(TA); 9558 return Hash.CalculateHash(); 9559 }; 9560 9561 auto ComputeTemplateParameterListODRHash = 9562 [&Hash](const TemplateParameterList *TPL) { 9563 assert(TPL); 9564 Hash.clear(); 9565 Hash.AddTemplateParameterList(TPL); 9566 return Hash.CalculateHash(); 9567 }; 9568 9569 // Used with err_module_odr_violation_mismatch_decl and 9570 // note_module_odr_violation_mismatch_decl 9571 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed 9572 enum ODRMismatchDecl { 9573 EndOfClass, 9574 PublicSpecifer, 9575 PrivateSpecifer, 9576 ProtectedSpecifer, 9577 StaticAssert, 9578 Field, 9579 CXXMethod, 9580 TypeAlias, 9581 TypeDef, 9582 Var, 9583 Friend, 9584 FunctionTemplate, 9585 Other 9586 }; 9587 9588 // Used with err_module_odr_violation_mismatch_decl_diff and 9589 // note_module_odr_violation_mismatch_decl_diff 9590 enum ODRMismatchDeclDifference { 9591 StaticAssertCondition, 9592 StaticAssertMessage, 9593 StaticAssertOnlyMessage, 9594 FieldName, 9595 FieldTypeName, 9596 FieldSingleBitField, 9597 FieldDifferentWidthBitField, 9598 FieldSingleMutable, 9599 FieldSingleInitializer, 9600 FieldDifferentInitializers, 9601 MethodName, 9602 MethodDeleted, 9603 MethodDefaulted, 9604 MethodVirtual, 9605 MethodStatic, 9606 MethodVolatile, 9607 MethodConst, 9608 MethodInline, 9609 MethodNumberParameters, 9610 MethodParameterType, 9611 MethodParameterName, 9612 MethodParameterSingleDefaultArgument, 9613 MethodParameterDifferentDefaultArgument, 9614 MethodNoTemplateArguments, 9615 MethodDifferentNumberTemplateArguments, 9616 MethodDifferentTemplateArgument, 9617 MethodSingleBody, 9618 MethodDifferentBody, 9619 TypedefName, 9620 TypedefType, 9621 VarName, 9622 VarType, 9623 VarSingleInitializer, 9624 VarDifferentInitializer, 9625 VarConstexpr, 9626 FriendTypeFunction, 9627 FriendType, 9628 FriendFunction, 9629 FunctionTemplateDifferentNumberParameters, 9630 FunctionTemplateParameterDifferentKind, 9631 FunctionTemplateParameterName, 9632 FunctionTemplateParameterSingleDefaultArgument, 9633 FunctionTemplateParameterDifferentDefaultArgument, 9634 FunctionTemplateParameterDifferentType, 9635 FunctionTemplatePackParameter, 9636 }; 9637 9638 // These lambdas have the common portions of the ODR diagnostics. This 9639 // has the same return as Diag(), so addition parameters can be passed 9640 // in with operator<< 9641 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9642 SourceLocation Loc, SourceRange Range, 9643 ODRMismatchDeclDifference DiffType) { 9644 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9645 << FirstRecord << FirstModule.empty() << FirstModule << Range 9646 << DiffType; 9647 }; 9648 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9649 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9650 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9651 << SecondModule << Range << DiffType; 9652 }; 9653 9654 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9655 &ComputeQualTypeODRHash, &ComputeODRHash]( 9656 NamedDecl *FirstRecord, StringRef FirstModule, 9657 StringRef SecondModule, FieldDecl *FirstField, 9658 FieldDecl *SecondField) { 9659 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9660 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9661 if (FirstII->getName() != SecondII->getName()) { 9662 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9663 FirstField->getSourceRange(), FieldName) 9664 << FirstII; 9665 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9666 SecondField->getSourceRange(), FieldName) 9667 << SecondII; 9668 9669 return true; 9670 } 9671 9672 assert(getContext().hasSameType(FirstField->getType(), 9673 SecondField->getType())); 9674 9675 QualType FirstType = FirstField->getType(); 9676 QualType SecondType = SecondField->getType(); 9677 if (ComputeQualTypeODRHash(FirstType) != 9678 ComputeQualTypeODRHash(SecondType)) { 9679 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9680 FirstField->getSourceRange(), FieldTypeName) 9681 << FirstII << FirstType; 9682 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9683 SecondField->getSourceRange(), FieldTypeName) 9684 << SecondII << SecondType; 9685 9686 return true; 9687 } 9688 9689 const bool IsFirstBitField = FirstField->isBitField(); 9690 const bool IsSecondBitField = SecondField->isBitField(); 9691 if (IsFirstBitField != IsSecondBitField) { 9692 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9693 FirstField->getSourceRange(), FieldSingleBitField) 9694 << FirstII << IsFirstBitField; 9695 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9696 SecondField->getSourceRange(), FieldSingleBitField) 9697 << SecondII << IsSecondBitField; 9698 return true; 9699 } 9700 9701 if (IsFirstBitField && IsSecondBitField) { 9702 unsigned FirstBitWidthHash = 9703 ComputeODRHash(FirstField->getBitWidth()); 9704 unsigned SecondBitWidthHash = 9705 ComputeODRHash(SecondField->getBitWidth()); 9706 if (FirstBitWidthHash != SecondBitWidthHash) { 9707 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9708 FirstField->getSourceRange(), 9709 FieldDifferentWidthBitField) 9710 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9711 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9712 SecondField->getSourceRange(), 9713 FieldDifferentWidthBitField) 9714 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9715 return true; 9716 } 9717 } 9718 9719 if (!PP.getLangOpts().CPlusPlus) 9720 return false; 9721 9722 const bool IsFirstMutable = FirstField->isMutable(); 9723 const bool IsSecondMutable = SecondField->isMutable(); 9724 if (IsFirstMutable != IsSecondMutable) { 9725 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9726 FirstField->getSourceRange(), FieldSingleMutable) 9727 << FirstII << IsFirstMutable; 9728 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9729 SecondField->getSourceRange(), FieldSingleMutable) 9730 << SecondII << IsSecondMutable; 9731 return true; 9732 } 9733 9734 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9735 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9736 if ((!FirstInitializer && SecondInitializer) || 9737 (FirstInitializer && !SecondInitializer)) { 9738 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9739 FirstField->getSourceRange(), FieldSingleInitializer) 9740 << FirstII << (FirstInitializer != nullptr); 9741 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9742 SecondField->getSourceRange(), FieldSingleInitializer) 9743 << SecondII << (SecondInitializer != nullptr); 9744 return true; 9745 } 9746 9747 if (FirstInitializer && SecondInitializer) { 9748 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9749 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9750 if (FirstInitHash != SecondInitHash) { 9751 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9752 FirstField->getSourceRange(), 9753 FieldDifferentInitializers) 9754 << FirstII << FirstInitializer->getSourceRange(); 9755 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9756 SecondField->getSourceRange(), 9757 FieldDifferentInitializers) 9758 << SecondII << SecondInitializer->getSourceRange(); 9759 return true; 9760 } 9761 } 9762 9763 return false; 9764 }; 9765 9766 auto ODRDiagTypeDefOrAlias = 9767 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9768 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9769 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9770 bool IsTypeAlias) { 9771 auto FirstName = FirstTD->getDeclName(); 9772 auto SecondName = SecondTD->getDeclName(); 9773 if (FirstName != SecondName) { 9774 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9775 FirstTD->getSourceRange(), TypedefName) 9776 << IsTypeAlias << FirstName; 9777 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9778 SecondTD->getSourceRange(), TypedefName) 9779 << IsTypeAlias << SecondName; 9780 return true; 9781 } 9782 9783 QualType FirstType = FirstTD->getUnderlyingType(); 9784 QualType SecondType = SecondTD->getUnderlyingType(); 9785 if (ComputeQualTypeODRHash(FirstType) != 9786 ComputeQualTypeODRHash(SecondType)) { 9787 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9788 FirstTD->getSourceRange(), TypedefType) 9789 << IsTypeAlias << FirstName << FirstType; 9790 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9791 SecondTD->getSourceRange(), TypedefType) 9792 << IsTypeAlias << SecondName << SecondType; 9793 return true; 9794 } 9795 9796 return false; 9797 }; 9798 9799 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9800 &ComputeQualTypeODRHash, &ComputeODRHash, 9801 this](NamedDecl *FirstRecord, StringRef FirstModule, 9802 StringRef SecondModule, VarDecl *FirstVD, 9803 VarDecl *SecondVD) { 9804 auto FirstName = FirstVD->getDeclName(); 9805 auto SecondName = SecondVD->getDeclName(); 9806 if (FirstName != SecondName) { 9807 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9808 FirstVD->getSourceRange(), VarName) 9809 << FirstName; 9810 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9811 SecondVD->getSourceRange(), VarName) 9812 << SecondName; 9813 return true; 9814 } 9815 9816 QualType FirstType = FirstVD->getType(); 9817 QualType SecondType = SecondVD->getType(); 9818 if (ComputeQualTypeODRHash(FirstType) != 9819 ComputeQualTypeODRHash(SecondType)) { 9820 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9821 FirstVD->getSourceRange(), VarType) 9822 << FirstName << FirstType; 9823 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9824 SecondVD->getSourceRange(), VarType) 9825 << SecondName << SecondType; 9826 return true; 9827 } 9828 9829 if (!PP.getLangOpts().CPlusPlus) 9830 return false; 9831 9832 const Expr *FirstInit = FirstVD->getInit(); 9833 const Expr *SecondInit = SecondVD->getInit(); 9834 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9835 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9836 FirstVD->getSourceRange(), VarSingleInitializer) 9837 << FirstName << (FirstInit == nullptr) 9838 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9839 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9840 SecondVD->getSourceRange(), VarSingleInitializer) 9841 << SecondName << (SecondInit == nullptr) 9842 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9843 return true; 9844 } 9845 9846 if (FirstInit && SecondInit && 9847 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9848 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9849 FirstVD->getSourceRange(), VarDifferentInitializer) 9850 << FirstName << FirstInit->getSourceRange(); 9851 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9852 SecondVD->getSourceRange(), VarDifferentInitializer) 9853 << SecondName << SecondInit->getSourceRange(); 9854 return true; 9855 } 9856 9857 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9858 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9859 if (FirstIsConstexpr != SecondIsConstexpr) { 9860 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9861 FirstVD->getSourceRange(), VarConstexpr) 9862 << FirstName << FirstIsConstexpr; 9863 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9864 SecondVD->getSourceRange(), VarConstexpr) 9865 << SecondName << SecondIsConstexpr; 9866 return true; 9867 } 9868 return false; 9869 }; 9870 9871 auto DifferenceSelector = [](Decl *D) { 9872 assert(D && "valid Decl required"); 9873 switch (D->getKind()) { 9874 default: 9875 return Other; 9876 case Decl::AccessSpec: 9877 switch (D->getAccess()) { 9878 case AS_public: 9879 return PublicSpecifer; 9880 case AS_private: 9881 return PrivateSpecifer; 9882 case AS_protected: 9883 return ProtectedSpecifer; 9884 case AS_none: 9885 break; 9886 } 9887 llvm_unreachable("Invalid access specifier"); 9888 case Decl::StaticAssert: 9889 return StaticAssert; 9890 case Decl::Field: 9891 return Field; 9892 case Decl::CXXMethod: 9893 case Decl::CXXConstructor: 9894 case Decl::CXXDestructor: 9895 return CXXMethod; 9896 case Decl::TypeAlias: 9897 return TypeAlias; 9898 case Decl::Typedef: 9899 return TypeDef; 9900 case Decl::Var: 9901 return Var; 9902 case Decl::Friend: 9903 return Friend; 9904 case Decl::FunctionTemplate: 9905 return FunctionTemplate; 9906 } 9907 }; 9908 9909 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9910 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9911 RecordDecl *Record, 9912 const DeclContext *DC) { 9913 for (auto *D : Record->decls()) { 9914 if (!ODRHash::isDeclToBeProcessed(D, DC)) 9915 continue; 9916 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9917 } 9918 }; 9919 9920 struct DiffResult { 9921 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9922 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9923 }; 9924 9925 // If there is a diagnoseable difference, FirstDiffType and 9926 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9927 // filled in if not EndOfClass. 9928 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9929 DeclHashes &SecondHashes) { 9930 DiffResult DR; 9931 auto FirstIt = FirstHashes.begin(); 9932 auto SecondIt = SecondHashes.begin(); 9933 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9934 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9935 FirstIt->second == SecondIt->second) { 9936 ++FirstIt; 9937 ++SecondIt; 9938 continue; 9939 } 9940 9941 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9942 DR.SecondDecl = 9943 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9944 9945 DR.FirstDiffType = 9946 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9947 DR.SecondDiffType = 9948 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 9949 return DR; 9950 } 9951 return DR; 9952 }; 9953 9954 // Use this to diagnose that an unexpected Decl was encountered 9955 // or no difference was detected. This causes a generic error 9956 // message to be emitted. 9957 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 9958 StringRef FirstModule, 9959 NamedDecl *SecondRecord, 9960 StringRef SecondModule) { 9961 Diag(FirstRecord->getLocation(), 9962 diag::err_module_odr_violation_different_definitions) 9963 << FirstRecord << FirstModule.empty() << FirstModule; 9964 9965 if (DR.FirstDecl) { 9966 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 9967 << FirstRecord << DR.FirstDecl->getSourceRange(); 9968 } 9969 9970 Diag(SecondRecord->getLocation(), 9971 diag::note_module_odr_violation_different_definitions) 9972 << SecondModule; 9973 9974 if (DR.SecondDecl) { 9975 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 9976 << DR.SecondDecl->getSourceRange(); 9977 } 9978 }; 9979 9980 auto DiagnoseODRMismatch = 9981 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 9982 NamedDecl *SecondRecord, StringRef SecondModule) { 9983 SourceLocation FirstLoc; 9984 SourceRange FirstRange; 9985 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 9986 if (DR.FirstDiffType == EndOfClass && FirstTag) { 9987 FirstLoc = FirstTag->getBraceRange().getEnd(); 9988 } else { 9989 FirstLoc = DR.FirstDecl->getLocation(); 9990 FirstRange = DR.FirstDecl->getSourceRange(); 9991 } 9992 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9993 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9994 << DR.FirstDiffType; 9995 9996 SourceLocation SecondLoc; 9997 SourceRange SecondRange; 9998 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 9999 if (DR.SecondDiffType == EndOfClass && SecondTag) { 10000 SecondLoc = SecondTag->getBraceRange().getEnd(); 10001 } else { 10002 SecondLoc = DR.SecondDecl->getLocation(); 10003 SecondRange = DR.SecondDecl->getSourceRange(); 10004 } 10005 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 10006 << SecondModule << SecondRange << DR.SecondDiffType; 10007 }; 10008 10009 // Issue any pending ODR-failure diagnostics. 10010 for (auto &Merge : OdrMergeFailures) { 10011 // If we've already pointed out a specific problem with this class, don't 10012 // bother issuing a general "something's different" diagnostic. 10013 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 10014 continue; 10015 10016 bool Diagnosed = false; 10017 CXXRecordDecl *FirstRecord = Merge.first; 10018 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 10019 for (auto &RecordPair : Merge.second) { 10020 CXXRecordDecl *SecondRecord = RecordPair.first; 10021 // Multiple different declarations got merged together; tell the user 10022 // where they came from. 10023 if (FirstRecord == SecondRecord) 10024 continue; 10025 10026 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 10027 10028 auto *FirstDD = FirstRecord->DefinitionData; 10029 auto *SecondDD = RecordPair.second; 10030 10031 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 10032 10033 // Diagnostics from DefinitionData are emitted here. 10034 if (FirstDD != SecondDD) { 10035 enum ODRDefinitionDataDifference { 10036 NumBases, 10037 NumVBases, 10038 BaseType, 10039 BaseVirtual, 10040 BaseAccess, 10041 }; 10042 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 10043 this](SourceLocation Loc, SourceRange Range, 10044 ODRDefinitionDataDifference DiffType) { 10045 return Diag(Loc, diag::err_module_odr_violation_definition_data) 10046 << FirstRecord << FirstModule.empty() << FirstModule << Range 10047 << DiffType; 10048 }; 10049 auto ODRDiagBaseNote = [&SecondModule, 10050 this](SourceLocation Loc, SourceRange Range, 10051 ODRDefinitionDataDifference DiffType) { 10052 return Diag(Loc, diag::note_module_odr_violation_definition_data) 10053 << SecondModule << Range << DiffType; 10054 }; 10055 10056 unsigned FirstNumBases = FirstDD->NumBases; 10057 unsigned FirstNumVBases = FirstDD->NumVBases; 10058 unsigned SecondNumBases = SecondDD->NumBases; 10059 unsigned SecondNumVBases = SecondDD->NumVBases; 10060 10061 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 10062 unsigned NumBases = DD->NumBases; 10063 if (NumBases == 0) return SourceRange(); 10064 auto bases = DD->bases(); 10065 return SourceRange(bases[0].getBeginLoc(), 10066 bases[NumBases - 1].getEndLoc()); 10067 }; 10068 10069 if (FirstNumBases != SecondNumBases) { 10070 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10071 NumBases) 10072 << FirstNumBases; 10073 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10074 NumBases) 10075 << SecondNumBases; 10076 Diagnosed = true; 10077 break; 10078 } 10079 10080 if (FirstNumVBases != SecondNumVBases) { 10081 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10082 NumVBases) 10083 << FirstNumVBases; 10084 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10085 NumVBases) 10086 << SecondNumVBases; 10087 Diagnosed = true; 10088 break; 10089 } 10090 10091 auto FirstBases = FirstDD->bases(); 10092 auto SecondBases = SecondDD->bases(); 10093 unsigned i = 0; 10094 for (i = 0; i < FirstNumBases; ++i) { 10095 auto FirstBase = FirstBases[i]; 10096 auto SecondBase = SecondBases[i]; 10097 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10098 ComputeQualTypeODRHash(SecondBase.getType())) { 10099 ODRDiagBaseError(FirstRecord->getLocation(), 10100 FirstBase.getSourceRange(), BaseType) 10101 << (i + 1) << FirstBase.getType(); 10102 ODRDiagBaseNote(SecondRecord->getLocation(), 10103 SecondBase.getSourceRange(), BaseType) 10104 << (i + 1) << SecondBase.getType(); 10105 break; 10106 } 10107 10108 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10109 ODRDiagBaseError(FirstRecord->getLocation(), 10110 FirstBase.getSourceRange(), BaseVirtual) 10111 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10112 ODRDiagBaseNote(SecondRecord->getLocation(), 10113 SecondBase.getSourceRange(), BaseVirtual) 10114 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10115 break; 10116 } 10117 10118 if (FirstBase.getAccessSpecifierAsWritten() != 10119 SecondBase.getAccessSpecifierAsWritten()) { 10120 ODRDiagBaseError(FirstRecord->getLocation(), 10121 FirstBase.getSourceRange(), BaseAccess) 10122 << (i + 1) << FirstBase.getType() 10123 << (int)FirstBase.getAccessSpecifierAsWritten(); 10124 ODRDiagBaseNote(SecondRecord->getLocation(), 10125 SecondBase.getSourceRange(), BaseAccess) 10126 << (i + 1) << SecondBase.getType() 10127 << (int)SecondBase.getAccessSpecifierAsWritten(); 10128 break; 10129 } 10130 } 10131 10132 if (i != FirstNumBases) { 10133 Diagnosed = true; 10134 break; 10135 } 10136 } 10137 10138 const ClassTemplateDecl *FirstTemplate = 10139 FirstRecord->getDescribedClassTemplate(); 10140 const ClassTemplateDecl *SecondTemplate = 10141 SecondRecord->getDescribedClassTemplate(); 10142 10143 assert(!FirstTemplate == !SecondTemplate && 10144 "Both pointers should be null or non-null"); 10145 10146 enum ODRTemplateDifference { 10147 ParamEmptyName, 10148 ParamName, 10149 ParamSingleDefaultArgument, 10150 ParamDifferentDefaultArgument, 10151 }; 10152 10153 if (FirstTemplate && SecondTemplate) { 10154 DeclHashes FirstTemplateHashes; 10155 DeclHashes SecondTemplateHashes; 10156 10157 auto PopulateTemplateParameterHashs = 10158 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10159 const ClassTemplateDecl *TD) { 10160 for (auto *D : TD->getTemplateParameters()->asArray()) { 10161 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10162 } 10163 }; 10164 10165 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10166 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10167 10168 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10169 "Number of template parameters should be equal."); 10170 10171 auto FirstIt = FirstTemplateHashes.begin(); 10172 auto FirstEnd = FirstTemplateHashes.end(); 10173 auto SecondIt = SecondTemplateHashes.begin(); 10174 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10175 if (FirstIt->second == SecondIt->second) 10176 continue; 10177 10178 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( 10179 SourceLocation Loc, SourceRange Range, 10180 ODRTemplateDifference DiffType) { 10181 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 10182 << FirstRecord << FirstModule.empty() << FirstModule << Range 10183 << DiffType; 10184 }; 10185 auto ODRDiagTemplateNote = [&SecondModule, this]( 10186 SourceLocation Loc, SourceRange Range, 10187 ODRTemplateDifference DiffType) { 10188 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 10189 << SecondModule << Range << DiffType; 10190 }; 10191 10192 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10193 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10194 10195 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10196 "Parameter Decl's should be the same kind."); 10197 10198 DeclarationName FirstName = FirstDecl->getDeclName(); 10199 DeclarationName SecondName = SecondDecl->getDeclName(); 10200 10201 if (FirstName != SecondName) { 10202 const bool FirstNameEmpty = 10203 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10204 const bool SecondNameEmpty = 10205 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 10206 assert((!FirstNameEmpty || !SecondNameEmpty) && 10207 "Both template parameters cannot be unnamed."); 10208 ODRDiagTemplateError(FirstDecl->getLocation(), 10209 FirstDecl->getSourceRange(), 10210 FirstNameEmpty ? ParamEmptyName : ParamName) 10211 << FirstName; 10212 ODRDiagTemplateNote(SecondDecl->getLocation(), 10213 SecondDecl->getSourceRange(), 10214 SecondNameEmpty ? ParamEmptyName : ParamName) 10215 << SecondName; 10216 break; 10217 } 10218 10219 switch (FirstDecl->getKind()) { 10220 default: 10221 llvm_unreachable("Invalid template parameter type."); 10222 case Decl::TemplateTypeParm: { 10223 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 10224 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 10225 const bool HasFirstDefaultArgument = 10226 FirstParam->hasDefaultArgument() && 10227 !FirstParam->defaultArgumentWasInherited(); 10228 const bool HasSecondDefaultArgument = 10229 SecondParam->hasDefaultArgument() && 10230 !SecondParam->defaultArgumentWasInherited(); 10231 10232 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10233 ODRDiagTemplateError(FirstDecl->getLocation(), 10234 FirstDecl->getSourceRange(), 10235 ParamSingleDefaultArgument) 10236 << HasFirstDefaultArgument; 10237 ODRDiagTemplateNote(SecondDecl->getLocation(), 10238 SecondDecl->getSourceRange(), 10239 ParamSingleDefaultArgument) 10240 << HasSecondDefaultArgument; 10241 break; 10242 } 10243 10244 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10245 "Expecting default arguments."); 10246 10247 ODRDiagTemplateError(FirstDecl->getLocation(), 10248 FirstDecl->getSourceRange(), 10249 ParamDifferentDefaultArgument); 10250 ODRDiagTemplateNote(SecondDecl->getLocation(), 10251 SecondDecl->getSourceRange(), 10252 ParamDifferentDefaultArgument); 10253 10254 break; 10255 } 10256 case Decl::NonTypeTemplateParm: { 10257 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 10258 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 10259 const bool HasFirstDefaultArgument = 10260 FirstParam->hasDefaultArgument() && 10261 !FirstParam->defaultArgumentWasInherited(); 10262 const bool HasSecondDefaultArgument = 10263 SecondParam->hasDefaultArgument() && 10264 !SecondParam->defaultArgumentWasInherited(); 10265 10266 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10267 ODRDiagTemplateError(FirstDecl->getLocation(), 10268 FirstDecl->getSourceRange(), 10269 ParamSingleDefaultArgument) 10270 << HasFirstDefaultArgument; 10271 ODRDiagTemplateNote(SecondDecl->getLocation(), 10272 SecondDecl->getSourceRange(), 10273 ParamSingleDefaultArgument) 10274 << HasSecondDefaultArgument; 10275 break; 10276 } 10277 10278 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10279 "Expecting default arguments."); 10280 10281 ODRDiagTemplateError(FirstDecl->getLocation(), 10282 FirstDecl->getSourceRange(), 10283 ParamDifferentDefaultArgument); 10284 ODRDiagTemplateNote(SecondDecl->getLocation(), 10285 SecondDecl->getSourceRange(), 10286 ParamDifferentDefaultArgument); 10287 10288 break; 10289 } 10290 case Decl::TemplateTemplateParm: { 10291 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 10292 const auto *SecondParam = 10293 cast<TemplateTemplateParmDecl>(SecondDecl); 10294 const bool HasFirstDefaultArgument = 10295 FirstParam->hasDefaultArgument() && 10296 !FirstParam->defaultArgumentWasInherited(); 10297 const bool HasSecondDefaultArgument = 10298 SecondParam->hasDefaultArgument() && 10299 !SecondParam->defaultArgumentWasInherited(); 10300 10301 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10302 ODRDiagTemplateError(FirstDecl->getLocation(), 10303 FirstDecl->getSourceRange(), 10304 ParamSingleDefaultArgument) 10305 << HasFirstDefaultArgument; 10306 ODRDiagTemplateNote(SecondDecl->getLocation(), 10307 SecondDecl->getSourceRange(), 10308 ParamSingleDefaultArgument) 10309 << HasSecondDefaultArgument; 10310 break; 10311 } 10312 10313 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10314 "Expecting default arguments."); 10315 10316 ODRDiagTemplateError(FirstDecl->getLocation(), 10317 FirstDecl->getSourceRange(), 10318 ParamDifferentDefaultArgument); 10319 ODRDiagTemplateNote(SecondDecl->getLocation(), 10320 SecondDecl->getSourceRange(), 10321 ParamDifferentDefaultArgument); 10322 10323 break; 10324 } 10325 } 10326 10327 break; 10328 } 10329 10330 if (FirstIt != FirstEnd) { 10331 Diagnosed = true; 10332 break; 10333 } 10334 } 10335 10336 DeclHashes FirstHashes; 10337 DeclHashes SecondHashes; 10338 const DeclContext *DC = FirstRecord; 10339 PopulateHashes(FirstHashes, FirstRecord, DC); 10340 PopulateHashes(SecondHashes, SecondRecord, DC); 10341 10342 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10343 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10344 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10345 Decl *FirstDecl = DR.FirstDecl; 10346 Decl *SecondDecl = DR.SecondDecl; 10347 10348 if (FirstDiffType == Other || SecondDiffType == Other) { 10349 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10350 SecondModule); 10351 Diagnosed = true; 10352 break; 10353 } 10354 10355 if (FirstDiffType != SecondDiffType) { 10356 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10357 SecondModule); 10358 Diagnosed = true; 10359 break; 10360 } 10361 10362 assert(FirstDiffType == SecondDiffType); 10363 10364 switch (FirstDiffType) { 10365 case Other: 10366 case EndOfClass: 10367 case PublicSpecifer: 10368 case PrivateSpecifer: 10369 case ProtectedSpecifer: 10370 llvm_unreachable("Invalid diff type"); 10371 10372 case StaticAssert: { 10373 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10374 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10375 10376 Expr *FirstExpr = FirstSA->getAssertExpr(); 10377 Expr *SecondExpr = SecondSA->getAssertExpr(); 10378 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10379 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10380 if (FirstODRHash != SecondODRHash) { 10381 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10382 FirstExpr->getSourceRange(), StaticAssertCondition); 10383 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10384 SecondExpr->getSourceRange(), StaticAssertCondition); 10385 Diagnosed = true; 10386 break; 10387 } 10388 10389 StringLiteral *FirstStr = FirstSA->getMessage(); 10390 StringLiteral *SecondStr = SecondSA->getMessage(); 10391 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10392 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10393 SourceLocation FirstLoc, SecondLoc; 10394 SourceRange FirstRange, SecondRange; 10395 if (FirstStr) { 10396 FirstLoc = FirstStr->getBeginLoc(); 10397 FirstRange = FirstStr->getSourceRange(); 10398 } else { 10399 FirstLoc = FirstSA->getBeginLoc(); 10400 FirstRange = FirstSA->getSourceRange(); 10401 } 10402 if (SecondStr) { 10403 SecondLoc = SecondStr->getBeginLoc(); 10404 SecondRange = SecondStr->getSourceRange(); 10405 } else { 10406 SecondLoc = SecondSA->getBeginLoc(); 10407 SecondRange = SecondSA->getSourceRange(); 10408 } 10409 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10410 StaticAssertOnlyMessage) 10411 << (FirstStr == nullptr); 10412 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10413 StaticAssertOnlyMessage) 10414 << (SecondStr == nullptr); 10415 Diagnosed = true; 10416 break; 10417 } 10418 10419 if (FirstStr && SecondStr && 10420 FirstStr->getString() != SecondStr->getString()) { 10421 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10422 FirstStr->getSourceRange(), StaticAssertMessage); 10423 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10424 SecondStr->getSourceRange(), StaticAssertMessage); 10425 Diagnosed = true; 10426 break; 10427 } 10428 break; 10429 } 10430 case Field: { 10431 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10432 cast<FieldDecl>(FirstDecl), 10433 cast<FieldDecl>(SecondDecl)); 10434 break; 10435 } 10436 case CXXMethod: { 10437 enum { 10438 DiagMethod, 10439 DiagConstructor, 10440 DiagDestructor, 10441 } FirstMethodType, 10442 SecondMethodType; 10443 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10444 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10445 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10446 return DiagMethod; 10447 }; 10448 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10449 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10450 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10451 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10452 auto FirstName = FirstMethod->getDeclName(); 10453 auto SecondName = SecondMethod->getDeclName(); 10454 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10455 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10456 FirstMethod->getSourceRange(), MethodName) 10457 << FirstMethodType << FirstName; 10458 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10459 SecondMethod->getSourceRange(), MethodName) 10460 << SecondMethodType << SecondName; 10461 10462 Diagnosed = true; 10463 break; 10464 } 10465 10466 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10467 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10468 if (FirstDeleted != SecondDeleted) { 10469 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10470 FirstMethod->getSourceRange(), MethodDeleted) 10471 << FirstMethodType << FirstName << FirstDeleted; 10472 10473 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10474 SecondMethod->getSourceRange(), MethodDeleted) 10475 << SecondMethodType << SecondName << SecondDeleted; 10476 Diagnosed = true; 10477 break; 10478 } 10479 10480 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10481 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10482 if (FirstDefaulted != SecondDefaulted) { 10483 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10484 FirstMethod->getSourceRange(), MethodDefaulted) 10485 << FirstMethodType << FirstName << FirstDefaulted; 10486 10487 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10488 SecondMethod->getSourceRange(), MethodDefaulted) 10489 << SecondMethodType << SecondName << SecondDefaulted; 10490 Diagnosed = true; 10491 break; 10492 } 10493 10494 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10495 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10496 const bool FirstPure = FirstMethod->isPure(); 10497 const bool SecondPure = SecondMethod->isPure(); 10498 if ((FirstVirtual || SecondVirtual) && 10499 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10500 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10501 FirstMethod->getSourceRange(), MethodVirtual) 10502 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10503 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10504 SecondMethod->getSourceRange(), MethodVirtual) 10505 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10506 Diagnosed = true; 10507 break; 10508 } 10509 10510 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10511 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10512 // class needs to be checked instead. 10513 const auto FirstStorage = FirstMethod->getStorageClass(); 10514 const auto SecondStorage = SecondMethod->getStorageClass(); 10515 const bool FirstStatic = FirstStorage == SC_Static; 10516 const bool SecondStatic = SecondStorage == SC_Static; 10517 if (FirstStatic != SecondStatic) { 10518 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10519 FirstMethod->getSourceRange(), MethodStatic) 10520 << FirstMethodType << FirstName << FirstStatic; 10521 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10522 SecondMethod->getSourceRange(), MethodStatic) 10523 << SecondMethodType << SecondName << SecondStatic; 10524 Diagnosed = true; 10525 break; 10526 } 10527 10528 const bool FirstVolatile = FirstMethod->isVolatile(); 10529 const bool SecondVolatile = SecondMethod->isVolatile(); 10530 if (FirstVolatile != SecondVolatile) { 10531 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10532 FirstMethod->getSourceRange(), MethodVolatile) 10533 << FirstMethodType << FirstName << FirstVolatile; 10534 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10535 SecondMethod->getSourceRange(), MethodVolatile) 10536 << SecondMethodType << SecondName << SecondVolatile; 10537 Diagnosed = true; 10538 break; 10539 } 10540 10541 const bool FirstConst = FirstMethod->isConst(); 10542 const bool SecondConst = SecondMethod->isConst(); 10543 if (FirstConst != SecondConst) { 10544 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10545 FirstMethod->getSourceRange(), MethodConst) 10546 << FirstMethodType << FirstName << FirstConst; 10547 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10548 SecondMethod->getSourceRange(), MethodConst) 10549 << SecondMethodType << SecondName << SecondConst; 10550 Diagnosed = true; 10551 break; 10552 } 10553 10554 const bool FirstInline = FirstMethod->isInlineSpecified(); 10555 const bool SecondInline = SecondMethod->isInlineSpecified(); 10556 if (FirstInline != SecondInline) { 10557 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10558 FirstMethod->getSourceRange(), MethodInline) 10559 << FirstMethodType << FirstName << FirstInline; 10560 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10561 SecondMethod->getSourceRange(), MethodInline) 10562 << SecondMethodType << SecondName << SecondInline; 10563 Diagnosed = true; 10564 break; 10565 } 10566 10567 const unsigned FirstNumParameters = FirstMethod->param_size(); 10568 const unsigned SecondNumParameters = SecondMethod->param_size(); 10569 if (FirstNumParameters != SecondNumParameters) { 10570 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10571 FirstMethod->getSourceRange(), 10572 MethodNumberParameters) 10573 << FirstMethodType << FirstName << FirstNumParameters; 10574 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10575 SecondMethod->getSourceRange(), 10576 MethodNumberParameters) 10577 << SecondMethodType << SecondName << SecondNumParameters; 10578 Diagnosed = true; 10579 break; 10580 } 10581 10582 // Need this status boolean to know when break out of the switch. 10583 bool ParameterMismatch = false; 10584 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10585 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10586 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10587 10588 QualType FirstParamType = FirstParam->getType(); 10589 QualType SecondParamType = SecondParam->getType(); 10590 if (FirstParamType != SecondParamType && 10591 ComputeQualTypeODRHash(FirstParamType) != 10592 ComputeQualTypeODRHash(SecondParamType)) { 10593 if (const DecayedType *ParamDecayedType = 10594 FirstParamType->getAs<DecayedType>()) { 10595 ODRDiagDeclError( 10596 FirstRecord, FirstModule, FirstMethod->getLocation(), 10597 FirstMethod->getSourceRange(), MethodParameterType) 10598 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10599 << true << ParamDecayedType->getOriginalType(); 10600 } else { 10601 ODRDiagDeclError( 10602 FirstRecord, FirstModule, FirstMethod->getLocation(), 10603 FirstMethod->getSourceRange(), MethodParameterType) 10604 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10605 << false; 10606 } 10607 10608 if (const DecayedType *ParamDecayedType = 10609 SecondParamType->getAs<DecayedType>()) { 10610 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10611 SecondMethod->getSourceRange(), 10612 MethodParameterType) 10613 << SecondMethodType << SecondName << (I + 1) 10614 << SecondParamType << true 10615 << ParamDecayedType->getOriginalType(); 10616 } else { 10617 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10618 SecondMethod->getSourceRange(), 10619 MethodParameterType) 10620 << SecondMethodType << SecondName << (I + 1) 10621 << SecondParamType << false; 10622 } 10623 ParameterMismatch = true; 10624 break; 10625 } 10626 10627 DeclarationName FirstParamName = FirstParam->getDeclName(); 10628 DeclarationName SecondParamName = SecondParam->getDeclName(); 10629 if (FirstParamName != SecondParamName) { 10630 ODRDiagDeclError(FirstRecord, FirstModule, 10631 FirstMethod->getLocation(), 10632 FirstMethod->getSourceRange(), MethodParameterName) 10633 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10634 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10635 SecondMethod->getSourceRange(), MethodParameterName) 10636 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10637 ParameterMismatch = true; 10638 break; 10639 } 10640 10641 const Expr *FirstInit = FirstParam->getInit(); 10642 const Expr *SecondInit = SecondParam->getInit(); 10643 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10644 ODRDiagDeclError(FirstRecord, FirstModule, 10645 FirstMethod->getLocation(), 10646 FirstMethod->getSourceRange(), 10647 MethodParameterSingleDefaultArgument) 10648 << FirstMethodType << FirstName << (I + 1) 10649 << (FirstInit == nullptr) 10650 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10651 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10652 SecondMethod->getSourceRange(), 10653 MethodParameterSingleDefaultArgument) 10654 << SecondMethodType << SecondName << (I + 1) 10655 << (SecondInit == nullptr) 10656 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10657 ParameterMismatch = true; 10658 break; 10659 } 10660 10661 if (FirstInit && SecondInit && 10662 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10663 ODRDiagDeclError(FirstRecord, FirstModule, 10664 FirstMethod->getLocation(), 10665 FirstMethod->getSourceRange(), 10666 MethodParameterDifferentDefaultArgument) 10667 << FirstMethodType << FirstName << (I + 1) 10668 << FirstInit->getSourceRange(); 10669 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10670 SecondMethod->getSourceRange(), 10671 MethodParameterDifferentDefaultArgument) 10672 << SecondMethodType << SecondName << (I + 1) 10673 << SecondInit->getSourceRange(); 10674 ParameterMismatch = true; 10675 break; 10676 10677 } 10678 } 10679 10680 if (ParameterMismatch) { 10681 Diagnosed = true; 10682 break; 10683 } 10684 10685 const auto *FirstTemplateArgs = 10686 FirstMethod->getTemplateSpecializationArgs(); 10687 const auto *SecondTemplateArgs = 10688 SecondMethod->getTemplateSpecializationArgs(); 10689 10690 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10691 (!FirstTemplateArgs && SecondTemplateArgs)) { 10692 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10693 FirstMethod->getSourceRange(), 10694 MethodNoTemplateArguments) 10695 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10696 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10697 SecondMethod->getSourceRange(), 10698 MethodNoTemplateArguments) 10699 << SecondMethodType << SecondName 10700 << (SecondTemplateArgs != nullptr); 10701 10702 Diagnosed = true; 10703 break; 10704 } 10705 10706 if (FirstTemplateArgs && SecondTemplateArgs) { 10707 // Remove pack expansions from argument list. 10708 auto ExpandTemplateArgumentList = 10709 [](const TemplateArgumentList *TAL) { 10710 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10711 for (const TemplateArgument &TA : TAL->asArray()) { 10712 if (TA.getKind() != TemplateArgument::Pack) { 10713 ExpandedList.push_back(&TA); 10714 continue; 10715 } 10716 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10717 ExpandedList.push_back(&PackTA); 10718 } 10719 } 10720 return ExpandedList; 10721 }; 10722 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10723 ExpandTemplateArgumentList(FirstTemplateArgs); 10724 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10725 ExpandTemplateArgumentList(SecondTemplateArgs); 10726 10727 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10728 ODRDiagDeclError(FirstRecord, FirstModule, 10729 FirstMethod->getLocation(), 10730 FirstMethod->getSourceRange(), 10731 MethodDifferentNumberTemplateArguments) 10732 << FirstMethodType << FirstName 10733 << (unsigned)FirstExpandedList.size(); 10734 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10735 SecondMethod->getSourceRange(), 10736 MethodDifferentNumberTemplateArguments) 10737 << SecondMethodType << SecondName 10738 << (unsigned)SecondExpandedList.size(); 10739 10740 Diagnosed = true; 10741 break; 10742 } 10743 10744 bool TemplateArgumentMismatch = false; 10745 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10746 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10747 &SecondTA = *SecondExpandedList[i]; 10748 if (ComputeTemplateArgumentODRHash(FirstTA) == 10749 ComputeTemplateArgumentODRHash(SecondTA)) { 10750 continue; 10751 } 10752 10753 ODRDiagDeclError( 10754 FirstRecord, FirstModule, FirstMethod->getLocation(), 10755 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10756 << FirstMethodType << FirstName << FirstTA << i + 1; 10757 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10758 SecondMethod->getSourceRange(), 10759 MethodDifferentTemplateArgument) 10760 << SecondMethodType << SecondName << SecondTA << i + 1; 10761 10762 TemplateArgumentMismatch = true; 10763 break; 10764 } 10765 10766 if (TemplateArgumentMismatch) { 10767 Diagnosed = true; 10768 break; 10769 } 10770 } 10771 10772 // Compute the hash of the method as if it has no body. 10773 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10774 Hash.clear(); 10775 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10776 return Hash.CalculateHash(); 10777 }; 10778 10779 // Compare the hash generated to the hash stored. A difference means 10780 // that a body was present in the original source. Due to merging, 10781 // the stardard way of detecting a body will not work. 10782 const bool HasFirstBody = 10783 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10784 const bool HasSecondBody = 10785 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10786 10787 if (HasFirstBody != HasSecondBody) { 10788 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10789 FirstMethod->getSourceRange(), MethodSingleBody) 10790 << FirstMethodType << FirstName << HasFirstBody; 10791 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10792 SecondMethod->getSourceRange(), MethodSingleBody) 10793 << SecondMethodType << SecondName << HasSecondBody; 10794 Diagnosed = true; 10795 break; 10796 } 10797 10798 if (HasFirstBody && HasSecondBody) { 10799 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10800 FirstMethod->getSourceRange(), MethodDifferentBody) 10801 << FirstMethodType << FirstName; 10802 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10803 SecondMethod->getSourceRange(), MethodDifferentBody) 10804 << SecondMethodType << SecondName; 10805 Diagnosed = true; 10806 break; 10807 } 10808 10809 break; 10810 } 10811 case TypeAlias: 10812 case TypeDef: { 10813 Diagnosed = ODRDiagTypeDefOrAlias( 10814 FirstRecord, FirstModule, SecondModule, 10815 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10816 FirstDiffType == TypeAlias); 10817 break; 10818 } 10819 case Var: { 10820 Diagnosed = 10821 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10822 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10823 break; 10824 } 10825 case Friend: { 10826 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10827 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10828 10829 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10830 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10831 10832 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10833 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10834 10835 if (FirstND && SecondND) { 10836 ODRDiagDeclError(FirstRecord, FirstModule, 10837 FirstFriend->getFriendLoc(), 10838 FirstFriend->getSourceRange(), FriendFunction) 10839 << FirstND; 10840 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10841 SecondFriend->getSourceRange(), FriendFunction) 10842 << SecondND; 10843 10844 Diagnosed = true; 10845 break; 10846 } 10847 10848 if (FirstTSI && SecondTSI) { 10849 QualType FirstFriendType = FirstTSI->getType(); 10850 QualType SecondFriendType = SecondTSI->getType(); 10851 assert(ComputeQualTypeODRHash(FirstFriendType) != 10852 ComputeQualTypeODRHash(SecondFriendType)); 10853 ODRDiagDeclError(FirstRecord, FirstModule, 10854 FirstFriend->getFriendLoc(), 10855 FirstFriend->getSourceRange(), FriendType) 10856 << FirstFriendType; 10857 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10858 SecondFriend->getSourceRange(), FriendType) 10859 << SecondFriendType; 10860 Diagnosed = true; 10861 break; 10862 } 10863 10864 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10865 FirstFriend->getSourceRange(), FriendTypeFunction) 10866 << (FirstTSI == nullptr); 10867 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10868 SecondFriend->getSourceRange(), FriendTypeFunction) 10869 << (SecondTSI == nullptr); 10870 10871 Diagnosed = true; 10872 break; 10873 } 10874 case FunctionTemplate: { 10875 FunctionTemplateDecl *FirstTemplate = 10876 cast<FunctionTemplateDecl>(FirstDecl); 10877 FunctionTemplateDecl *SecondTemplate = 10878 cast<FunctionTemplateDecl>(SecondDecl); 10879 10880 TemplateParameterList *FirstTPL = 10881 FirstTemplate->getTemplateParameters(); 10882 TemplateParameterList *SecondTPL = 10883 SecondTemplate->getTemplateParameters(); 10884 10885 if (FirstTPL->size() != SecondTPL->size()) { 10886 ODRDiagDeclError(FirstRecord, FirstModule, 10887 FirstTemplate->getLocation(), 10888 FirstTemplate->getSourceRange(), 10889 FunctionTemplateDifferentNumberParameters) 10890 << FirstTemplate << FirstTPL->size(); 10891 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10892 SecondTemplate->getSourceRange(), 10893 FunctionTemplateDifferentNumberParameters) 10894 << SecondTemplate << SecondTPL->size(); 10895 10896 Diagnosed = true; 10897 break; 10898 } 10899 10900 bool ParameterMismatch = false; 10901 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10902 NamedDecl *FirstParam = FirstTPL->getParam(i); 10903 NamedDecl *SecondParam = SecondTPL->getParam(i); 10904 10905 if (FirstParam->getKind() != SecondParam->getKind()) { 10906 enum { 10907 TemplateTypeParameter, 10908 NonTypeTemplateParameter, 10909 TemplateTemplateParameter, 10910 }; 10911 auto GetParamType = [](NamedDecl *D) { 10912 switch (D->getKind()) { 10913 default: 10914 llvm_unreachable("Unexpected template parameter type"); 10915 case Decl::TemplateTypeParm: 10916 return TemplateTypeParameter; 10917 case Decl::NonTypeTemplateParm: 10918 return NonTypeTemplateParameter; 10919 case Decl::TemplateTemplateParm: 10920 return TemplateTemplateParameter; 10921 } 10922 }; 10923 10924 ODRDiagDeclError(FirstRecord, FirstModule, 10925 FirstTemplate->getLocation(), 10926 FirstTemplate->getSourceRange(), 10927 FunctionTemplateParameterDifferentKind) 10928 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10929 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10930 SecondTemplate->getSourceRange(), 10931 FunctionTemplateParameterDifferentKind) 10932 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10933 10934 ParameterMismatch = true; 10935 break; 10936 } 10937 10938 if (FirstParam->getName() != SecondParam->getName()) { 10939 ODRDiagDeclError( 10940 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10941 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10942 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10943 << FirstParam; 10944 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10945 SecondTemplate->getSourceRange(), 10946 FunctionTemplateParameterName) 10947 << SecondTemplate << (i + 1) 10948 << (bool)SecondParam->getIdentifier() << SecondParam; 10949 ParameterMismatch = true; 10950 break; 10951 } 10952 10953 if (isa<TemplateTypeParmDecl>(FirstParam) && 10954 isa<TemplateTypeParmDecl>(SecondParam)) { 10955 TemplateTypeParmDecl *FirstTTPD = 10956 cast<TemplateTypeParmDecl>(FirstParam); 10957 TemplateTypeParmDecl *SecondTTPD = 10958 cast<TemplateTypeParmDecl>(SecondParam); 10959 bool HasFirstDefaultArgument = 10960 FirstTTPD->hasDefaultArgument() && 10961 !FirstTTPD->defaultArgumentWasInherited(); 10962 bool HasSecondDefaultArgument = 10963 SecondTTPD->hasDefaultArgument() && 10964 !SecondTTPD->defaultArgumentWasInherited(); 10965 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10966 ODRDiagDeclError(FirstRecord, FirstModule, 10967 FirstTemplate->getLocation(), 10968 FirstTemplate->getSourceRange(), 10969 FunctionTemplateParameterSingleDefaultArgument) 10970 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10971 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10972 SecondTemplate->getSourceRange(), 10973 FunctionTemplateParameterSingleDefaultArgument) 10974 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10975 ParameterMismatch = true; 10976 break; 10977 } 10978 10979 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10980 QualType FirstType = FirstTTPD->getDefaultArgument(); 10981 QualType SecondType = SecondTTPD->getDefaultArgument(); 10982 if (ComputeQualTypeODRHash(FirstType) != 10983 ComputeQualTypeODRHash(SecondType)) { 10984 ODRDiagDeclError( 10985 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10986 FirstTemplate->getSourceRange(), 10987 FunctionTemplateParameterDifferentDefaultArgument) 10988 << FirstTemplate << (i + 1) << FirstType; 10989 ODRDiagDeclNote( 10990 SecondModule, SecondTemplate->getLocation(), 10991 SecondTemplate->getSourceRange(), 10992 FunctionTemplateParameterDifferentDefaultArgument) 10993 << SecondTemplate << (i + 1) << SecondType; 10994 ParameterMismatch = true; 10995 break; 10996 } 10997 } 10998 10999 if (FirstTTPD->isParameterPack() != 11000 SecondTTPD->isParameterPack()) { 11001 ODRDiagDeclError(FirstRecord, FirstModule, 11002 FirstTemplate->getLocation(), 11003 FirstTemplate->getSourceRange(), 11004 FunctionTemplatePackParameter) 11005 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11006 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11007 SecondTemplate->getSourceRange(), 11008 FunctionTemplatePackParameter) 11009 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11010 ParameterMismatch = true; 11011 break; 11012 } 11013 } 11014 11015 if (isa<TemplateTemplateParmDecl>(FirstParam) && 11016 isa<TemplateTemplateParmDecl>(SecondParam)) { 11017 TemplateTemplateParmDecl *FirstTTPD = 11018 cast<TemplateTemplateParmDecl>(FirstParam); 11019 TemplateTemplateParmDecl *SecondTTPD = 11020 cast<TemplateTemplateParmDecl>(SecondParam); 11021 11022 TemplateParameterList *FirstTPL = 11023 FirstTTPD->getTemplateParameters(); 11024 TemplateParameterList *SecondTPL = 11025 SecondTTPD->getTemplateParameters(); 11026 11027 if (ComputeTemplateParameterListODRHash(FirstTPL) != 11028 ComputeTemplateParameterListODRHash(SecondTPL)) { 11029 ODRDiagDeclError(FirstRecord, FirstModule, 11030 FirstTemplate->getLocation(), 11031 FirstTemplate->getSourceRange(), 11032 FunctionTemplateParameterDifferentType) 11033 << FirstTemplate << (i + 1); 11034 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11035 SecondTemplate->getSourceRange(), 11036 FunctionTemplateParameterDifferentType) 11037 << SecondTemplate << (i + 1); 11038 ParameterMismatch = true; 11039 break; 11040 } 11041 11042 bool HasFirstDefaultArgument = 11043 FirstTTPD->hasDefaultArgument() && 11044 !FirstTTPD->defaultArgumentWasInherited(); 11045 bool HasSecondDefaultArgument = 11046 SecondTTPD->hasDefaultArgument() && 11047 !SecondTTPD->defaultArgumentWasInherited(); 11048 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11049 ODRDiagDeclError(FirstRecord, FirstModule, 11050 FirstTemplate->getLocation(), 11051 FirstTemplate->getSourceRange(), 11052 FunctionTemplateParameterSingleDefaultArgument) 11053 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11054 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11055 SecondTemplate->getSourceRange(), 11056 FunctionTemplateParameterSingleDefaultArgument) 11057 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11058 ParameterMismatch = true; 11059 break; 11060 } 11061 11062 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11063 TemplateArgument FirstTA = 11064 FirstTTPD->getDefaultArgument().getArgument(); 11065 TemplateArgument SecondTA = 11066 SecondTTPD->getDefaultArgument().getArgument(); 11067 if (ComputeTemplateArgumentODRHash(FirstTA) != 11068 ComputeTemplateArgumentODRHash(SecondTA)) { 11069 ODRDiagDeclError( 11070 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11071 FirstTemplate->getSourceRange(), 11072 FunctionTemplateParameterDifferentDefaultArgument) 11073 << FirstTemplate << (i + 1) << FirstTA; 11074 ODRDiagDeclNote( 11075 SecondModule, SecondTemplate->getLocation(), 11076 SecondTemplate->getSourceRange(), 11077 FunctionTemplateParameterDifferentDefaultArgument) 11078 << SecondTemplate << (i + 1) << SecondTA; 11079 ParameterMismatch = true; 11080 break; 11081 } 11082 } 11083 11084 if (FirstTTPD->isParameterPack() != 11085 SecondTTPD->isParameterPack()) { 11086 ODRDiagDeclError(FirstRecord, FirstModule, 11087 FirstTemplate->getLocation(), 11088 FirstTemplate->getSourceRange(), 11089 FunctionTemplatePackParameter) 11090 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11091 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11092 SecondTemplate->getSourceRange(), 11093 FunctionTemplatePackParameter) 11094 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11095 ParameterMismatch = true; 11096 break; 11097 } 11098 } 11099 11100 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11101 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11102 NonTypeTemplateParmDecl *FirstNTTPD = 11103 cast<NonTypeTemplateParmDecl>(FirstParam); 11104 NonTypeTemplateParmDecl *SecondNTTPD = 11105 cast<NonTypeTemplateParmDecl>(SecondParam); 11106 11107 QualType FirstType = FirstNTTPD->getType(); 11108 QualType SecondType = SecondNTTPD->getType(); 11109 if (ComputeQualTypeODRHash(FirstType) != 11110 ComputeQualTypeODRHash(SecondType)) { 11111 ODRDiagDeclError(FirstRecord, FirstModule, 11112 FirstTemplate->getLocation(), 11113 FirstTemplate->getSourceRange(), 11114 FunctionTemplateParameterDifferentType) 11115 << FirstTemplate << (i + 1); 11116 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11117 SecondTemplate->getSourceRange(), 11118 FunctionTemplateParameterDifferentType) 11119 << SecondTemplate << (i + 1); 11120 ParameterMismatch = true; 11121 break; 11122 } 11123 11124 bool HasFirstDefaultArgument = 11125 FirstNTTPD->hasDefaultArgument() && 11126 !FirstNTTPD->defaultArgumentWasInherited(); 11127 bool HasSecondDefaultArgument = 11128 SecondNTTPD->hasDefaultArgument() && 11129 !SecondNTTPD->defaultArgumentWasInherited(); 11130 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11131 ODRDiagDeclError(FirstRecord, FirstModule, 11132 FirstTemplate->getLocation(), 11133 FirstTemplate->getSourceRange(), 11134 FunctionTemplateParameterSingleDefaultArgument) 11135 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11136 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11137 SecondTemplate->getSourceRange(), 11138 FunctionTemplateParameterSingleDefaultArgument) 11139 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11140 ParameterMismatch = true; 11141 break; 11142 } 11143 11144 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11145 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11146 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11147 if (ComputeODRHash(FirstDefaultArgument) != 11148 ComputeODRHash(SecondDefaultArgument)) { 11149 ODRDiagDeclError( 11150 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11151 FirstTemplate->getSourceRange(), 11152 FunctionTemplateParameterDifferentDefaultArgument) 11153 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11154 ODRDiagDeclNote( 11155 SecondModule, SecondTemplate->getLocation(), 11156 SecondTemplate->getSourceRange(), 11157 FunctionTemplateParameterDifferentDefaultArgument) 11158 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11159 ParameterMismatch = true; 11160 break; 11161 } 11162 } 11163 11164 if (FirstNTTPD->isParameterPack() != 11165 SecondNTTPD->isParameterPack()) { 11166 ODRDiagDeclError(FirstRecord, FirstModule, 11167 FirstTemplate->getLocation(), 11168 FirstTemplate->getSourceRange(), 11169 FunctionTemplatePackParameter) 11170 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11171 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11172 SecondTemplate->getSourceRange(), 11173 FunctionTemplatePackParameter) 11174 << SecondTemplate << (i + 1) 11175 << SecondNTTPD->isParameterPack(); 11176 ParameterMismatch = true; 11177 break; 11178 } 11179 } 11180 } 11181 11182 if (ParameterMismatch) { 11183 Diagnosed = true; 11184 break; 11185 } 11186 11187 break; 11188 } 11189 } 11190 11191 if (Diagnosed) 11192 continue; 11193 11194 Diag(FirstDecl->getLocation(), 11195 diag::err_module_odr_violation_mismatch_decl_unknown) 11196 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11197 << FirstDecl->getSourceRange(); 11198 Diag(SecondDecl->getLocation(), 11199 diag::note_module_odr_violation_mismatch_decl_unknown) 11200 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11201 Diagnosed = true; 11202 } 11203 11204 if (!Diagnosed) { 11205 // All definitions are updates to the same declaration. This happens if a 11206 // module instantiates the declaration of a class template specialization 11207 // and two or more other modules instantiate its definition. 11208 // 11209 // FIXME: Indicate which modules had instantiations of this definition. 11210 // FIXME: How can this even happen? 11211 Diag(Merge.first->getLocation(), 11212 diag::err_module_odr_violation_different_instantiations) 11213 << Merge.first; 11214 } 11215 } 11216 11217 // Issue ODR failures diagnostics for functions. 11218 for (auto &Merge : FunctionOdrMergeFailures) { 11219 enum ODRFunctionDifference { 11220 ReturnType, 11221 ParameterName, 11222 ParameterType, 11223 ParameterSingleDefaultArgument, 11224 ParameterDifferentDefaultArgument, 11225 FunctionBody, 11226 }; 11227 11228 FunctionDecl *FirstFunction = Merge.first; 11229 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11230 11231 bool Diagnosed = false; 11232 for (auto &SecondFunction : Merge.second) { 11233 11234 if (FirstFunction == SecondFunction) 11235 continue; 11236 11237 std::string SecondModule = 11238 getOwningModuleNameForDiagnostic(SecondFunction); 11239 11240 auto ODRDiagError = [FirstFunction, &FirstModule, 11241 this](SourceLocation Loc, SourceRange Range, 11242 ODRFunctionDifference DiffType) { 11243 return Diag(Loc, diag::err_module_odr_violation_function) 11244 << FirstFunction << FirstModule.empty() << FirstModule << Range 11245 << DiffType; 11246 }; 11247 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11248 SourceRange Range, 11249 ODRFunctionDifference DiffType) { 11250 return Diag(Loc, diag::note_module_odr_violation_function) 11251 << SecondModule << Range << DiffType; 11252 }; 11253 11254 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11255 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11256 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11257 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11258 << FirstFunction->getReturnType(); 11259 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11260 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11261 << SecondFunction->getReturnType(); 11262 Diagnosed = true; 11263 break; 11264 } 11265 11266 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11267 "Merged functions with different number of parameters"); 11268 11269 auto ParamSize = FirstFunction->param_size(); 11270 bool ParameterMismatch = false; 11271 for (unsigned I = 0; I < ParamSize; ++I) { 11272 auto *FirstParam = FirstFunction->getParamDecl(I); 11273 auto *SecondParam = SecondFunction->getParamDecl(I); 11274 11275 assert(getContext().hasSameType(FirstParam->getType(), 11276 SecondParam->getType()) && 11277 "Merged function has different parameter types."); 11278 11279 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11280 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11281 ParameterName) 11282 << I + 1 << FirstParam->getDeclName(); 11283 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11284 ParameterName) 11285 << I + 1 << SecondParam->getDeclName(); 11286 ParameterMismatch = true; 11287 break; 11288 }; 11289 11290 QualType FirstParamType = FirstParam->getType(); 11291 QualType SecondParamType = SecondParam->getType(); 11292 if (FirstParamType != SecondParamType && 11293 ComputeQualTypeODRHash(FirstParamType) != 11294 ComputeQualTypeODRHash(SecondParamType)) { 11295 if (const DecayedType *ParamDecayedType = 11296 FirstParamType->getAs<DecayedType>()) { 11297 ODRDiagError(FirstParam->getLocation(), 11298 FirstParam->getSourceRange(), ParameterType) 11299 << (I + 1) << FirstParamType << true 11300 << ParamDecayedType->getOriginalType(); 11301 } else { 11302 ODRDiagError(FirstParam->getLocation(), 11303 FirstParam->getSourceRange(), ParameterType) 11304 << (I + 1) << FirstParamType << false; 11305 } 11306 11307 if (const DecayedType *ParamDecayedType = 11308 SecondParamType->getAs<DecayedType>()) { 11309 ODRDiagNote(SecondParam->getLocation(), 11310 SecondParam->getSourceRange(), ParameterType) 11311 << (I + 1) << SecondParamType << true 11312 << ParamDecayedType->getOriginalType(); 11313 } else { 11314 ODRDiagNote(SecondParam->getLocation(), 11315 SecondParam->getSourceRange(), ParameterType) 11316 << (I + 1) << SecondParamType << false; 11317 } 11318 ParameterMismatch = true; 11319 break; 11320 } 11321 11322 const Expr *FirstInit = FirstParam->getInit(); 11323 const Expr *SecondInit = SecondParam->getInit(); 11324 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11325 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11326 ParameterSingleDefaultArgument) 11327 << (I + 1) << (FirstInit == nullptr) 11328 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11329 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11330 ParameterSingleDefaultArgument) 11331 << (I + 1) << (SecondInit == nullptr) 11332 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11333 ParameterMismatch = true; 11334 break; 11335 } 11336 11337 if (FirstInit && SecondInit && 11338 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11339 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11340 ParameterDifferentDefaultArgument) 11341 << (I + 1) << FirstInit->getSourceRange(); 11342 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11343 ParameterDifferentDefaultArgument) 11344 << (I + 1) << SecondInit->getSourceRange(); 11345 ParameterMismatch = true; 11346 break; 11347 } 11348 11349 assert(ComputeSubDeclODRHash(FirstParam) == 11350 ComputeSubDeclODRHash(SecondParam) && 11351 "Undiagnosed parameter difference."); 11352 } 11353 11354 if (ParameterMismatch) { 11355 Diagnosed = true; 11356 break; 11357 } 11358 11359 // If no error has been generated before now, assume the problem is in 11360 // the body and generate a message. 11361 ODRDiagError(FirstFunction->getLocation(), 11362 FirstFunction->getSourceRange(), FunctionBody); 11363 ODRDiagNote(SecondFunction->getLocation(), 11364 SecondFunction->getSourceRange(), FunctionBody); 11365 Diagnosed = true; 11366 break; 11367 } 11368 (void)Diagnosed; 11369 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11370 } 11371 11372 // Issue ODR failures diagnostics for enums. 11373 for (auto &Merge : EnumOdrMergeFailures) { 11374 enum ODREnumDifference { 11375 SingleScopedEnum, 11376 EnumTagKeywordMismatch, 11377 SingleSpecifiedType, 11378 DifferentSpecifiedTypes, 11379 DifferentNumberEnumConstants, 11380 EnumConstantName, 11381 EnumConstantSingleInitilizer, 11382 EnumConstantDifferentInitilizer, 11383 }; 11384 11385 // If we've already pointed out a specific problem with this enum, don't 11386 // bother issuing a general "something's different" diagnostic. 11387 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11388 continue; 11389 11390 EnumDecl *FirstEnum = Merge.first; 11391 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11392 11393 using DeclHashes = 11394 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11395 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11396 DeclHashes &Hashes, EnumDecl *Enum) { 11397 for (auto *D : Enum->decls()) { 11398 // Due to decl merging, the first EnumDecl is the parent of 11399 // Decls in both records. 11400 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum)) 11401 continue; 11402 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11403 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11404 ComputeSubDeclODRHash(D)); 11405 } 11406 }; 11407 DeclHashes FirstHashes; 11408 PopulateHashes(FirstHashes, FirstEnum); 11409 bool Diagnosed = false; 11410 for (auto &SecondEnum : Merge.second) { 11411 11412 if (FirstEnum == SecondEnum) 11413 continue; 11414 11415 std::string SecondModule = 11416 getOwningModuleNameForDiagnostic(SecondEnum); 11417 11418 auto ODRDiagError = [FirstEnum, &FirstModule, 11419 this](SourceLocation Loc, SourceRange Range, 11420 ODREnumDifference DiffType) { 11421 return Diag(Loc, diag::err_module_odr_violation_enum) 11422 << FirstEnum << FirstModule.empty() << FirstModule << Range 11423 << DiffType; 11424 }; 11425 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11426 SourceRange Range, 11427 ODREnumDifference DiffType) { 11428 return Diag(Loc, diag::note_module_odr_violation_enum) 11429 << SecondModule << Range << DiffType; 11430 }; 11431 11432 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11433 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11434 SingleScopedEnum) 11435 << FirstEnum->isScoped(); 11436 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11437 SingleScopedEnum) 11438 << SecondEnum->isScoped(); 11439 Diagnosed = true; 11440 continue; 11441 } 11442 11443 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11444 if (FirstEnum->isScopedUsingClassTag() != 11445 SecondEnum->isScopedUsingClassTag()) { 11446 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11447 EnumTagKeywordMismatch) 11448 << FirstEnum->isScopedUsingClassTag(); 11449 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11450 EnumTagKeywordMismatch) 11451 << SecondEnum->isScopedUsingClassTag(); 11452 Diagnosed = true; 11453 continue; 11454 } 11455 } 11456 11457 QualType FirstUnderlyingType = 11458 FirstEnum->getIntegerTypeSourceInfo() 11459 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11460 : QualType(); 11461 QualType SecondUnderlyingType = 11462 SecondEnum->getIntegerTypeSourceInfo() 11463 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11464 : QualType(); 11465 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11466 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11467 SingleSpecifiedType) 11468 << !FirstUnderlyingType.isNull(); 11469 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11470 SingleSpecifiedType) 11471 << !SecondUnderlyingType.isNull(); 11472 Diagnosed = true; 11473 continue; 11474 } 11475 11476 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11477 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11478 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11479 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11480 DifferentSpecifiedTypes) 11481 << FirstUnderlyingType; 11482 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11483 DifferentSpecifiedTypes) 11484 << SecondUnderlyingType; 11485 Diagnosed = true; 11486 continue; 11487 } 11488 } 11489 11490 DeclHashes SecondHashes; 11491 PopulateHashes(SecondHashes, SecondEnum); 11492 11493 if (FirstHashes.size() != SecondHashes.size()) { 11494 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11495 DifferentNumberEnumConstants) 11496 << (int)FirstHashes.size(); 11497 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11498 DifferentNumberEnumConstants) 11499 << (int)SecondHashes.size(); 11500 Diagnosed = true; 11501 continue; 11502 } 11503 11504 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11505 if (FirstHashes[I].second == SecondHashes[I].second) 11506 continue; 11507 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11508 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11509 11510 if (FirstEnumConstant->getDeclName() != 11511 SecondEnumConstant->getDeclName()) { 11512 11513 ODRDiagError(FirstEnumConstant->getLocation(), 11514 FirstEnumConstant->getSourceRange(), EnumConstantName) 11515 << I + 1 << FirstEnumConstant; 11516 ODRDiagNote(SecondEnumConstant->getLocation(), 11517 SecondEnumConstant->getSourceRange(), EnumConstantName) 11518 << I + 1 << SecondEnumConstant; 11519 Diagnosed = true; 11520 break; 11521 } 11522 11523 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11524 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11525 if (!FirstInit && !SecondInit) 11526 continue; 11527 11528 if (!FirstInit || !SecondInit) { 11529 ODRDiagError(FirstEnumConstant->getLocation(), 11530 FirstEnumConstant->getSourceRange(), 11531 EnumConstantSingleInitilizer) 11532 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11533 ODRDiagNote(SecondEnumConstant->getLocation(), 11534 SecondEnumConstant->getSourceRange(), 11535 EnumConstantSingleInitilizer) 11536 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11537 Diagnosed = true; 11538 break; 11539 } 11540 11541 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11542 ODRDiagError(FirstEnumConstant->getLocation(), 11543 FirstEnumConstant->getSourceRange(), 11544 EnumConstantDifferentInitilizer) 11545 << I + 1 << FirstEnumConstant; 11546 ODRDiagNote(SecondEnumConstant->getLocation(), 11547 SecondEnumConstant->getSourceRange(), 11548 EnumConstantDifferentInitilizer) 11549 << I + 1 << SecondEnumConstant; 11550 Diagnosed = true; 11551 break; 11552 } 11553 } 11554 } 11555 11556 (void)Diagnosed; 11557 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11558 } 11559 } 11560 11561 void ASTReader::StartedDeserializing() { 11562 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11563 ReadTimer->startTimer(); 11564 } 11565 11566 void ASTReader::FinishedDeserializing() { 11567 assert(NumCurrentElementsDeserializing && 11568 "FinishedDeserializing not paired with StartedDeserializing"); 11569 if (NumCurrentElementsDeserializing == 1) { 11570 // We decrease NumCurrentElementsDeserializing only after pending actions 11571 // are finished, to avoid recursively re-calling finishPendingActions(). 11572 finishPendingActions(); 11573 } 11574 --NumCurrentElementsDeserializing; 11575 11576 if (NumCurrentElementsDeserializing == 0) { 11577 // Propagate exception specification and deduced type updates along 11578 // redeclaration chains. 11579 // 11580 // We do this now rather than in finishPendingActions because we want to 11581 // be able to walk the complete redeclaration chains of the updated decls. 11582 while (!PendingExceptionSpecUpdates.empty() || 11583 !PendingDeducedTypeUpdates.empty()) { 11584 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11585 PendingExceptionSpecUpdates.clear(); 11586 for (auto Update : ESUpdates) { 11587 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11588 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11589 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11590 if (auto *Listener = getContext().getASTMutationListener()) 11591 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11592 for (auto *Redecl : Update.second->redecls()) 11593 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11594 } 11595 11596 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11597 PendingDeducedTypeUpdates.clear(); 11598 for (auto Update : DTUpdates) { 11599 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11600 // FIXME: If the return type is already deduced, check that it matches. 11601 getContext().adjustDeducedFunctionResultType(Update.first, 11602 Update.second); 11603 } 11604 } 11605 11606 if (ReadTimer) 11607 ReadTimer->stopTimer(); 11608 11609 diagnoseOdrViolations(); 11610 11611 // We are not in recursive loading, so it's safe to pass the "interesting" 11612 // decls to the consumer. 11613 if (Consumer) 11614 PassInterestingDeclsToConsumer(); 11615 } 11616 } 11617 11618 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11619 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11620 // Remove any fake results before adding any real ones. 11621 auto It = PendingFakeLookupResults.find(II); 11622 if (It != PendingFakeLookupResults.end()) { 11623 for (auto *ND : It->second) 11624 SemaObj->IdResolver.RemoveDecl(ND); 11625 // FIXME: this works around module+PCH performance issue. 11626 // Rather than erase the result from the map, which is O(n), just clear 11627 // the vector of NamedDecls. 11628 It->second.clear(); 11629 } 11630 } 11631 11632 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11633 SemaObj->TUScope->AddDecl(D); 11634 } else if (SemaObj->TUScope) { 11635 // Adding the decl to IdResolver may have failed because it was already in 11636 // (even though it was not added in scope). If it is already in, make sure 11637 // it gets in the scope as well. 11638 if (std::find(SemaObj->IdResolver.begin(Name), 11639 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11640 SemaObj->TUScope->AddDecl(D); 11641 } 11642 } 11643 11644 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11645 ASTContext *Context, 11646 const PCHContainerReader &PCHContainerRdr, 11647 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11648 StringRef isysroot, 11649 DisableValidationForModuleKind DisableValidationKind, 11650 bool AllowASTWithCompilerErrors, 11651 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11652 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11653 std::unique_ptr<llvm::Timer> ReadTimer) 11654 : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH) 11655 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11656 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11657 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11658 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11659 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11660 PCHContainerRdr, PP.getHeaderSearchInfo()), 11661 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11662 DisableValidationKind(DisableValidationKind), 11663 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11664 AllowConfigurationMismatch(AllowConfigurationMismatch), 11665 ValidateSystemInputs(ValidateSystemInputs), 11666 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11667 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11668 SourceMgr.setExternalSLocEntrySource(this); 11669 11670 for (const auto &Ext : Extensions) { 11671 auto BlockName = Ext->getExtensionMetadata().BlockName; 11672 auto Known = ModuleFileExtensions.find(BlockName); 11673 if (Known != ModuleFileExtensions.end()) { 11674 Diags.Report(diag::warn_duplicate_module_file_extension) 11675 << BlockName; 11676 continue; 11677 } 11678 11679 ModuleFileExtensions.insert({BlockName, Ext}); 11680 } 11681 } 11682 11683 ASTReader::~ASTReader() { 11684 if (OwnsDeserializationListener) 11685 delete DeserializationListener; 11686 } 11687 11688 IdentifierResolver &ASTReader::getIdResolver() { 11689 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11690 } 11691 11692 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11693 unsigned AbbrevID) { 11694 Idx = 0; 11695 Record.clear(); 11696 return Cursor.readRecord(AbbrevID, Record); 11697 } 11698 //===----------------------------------------------------------------------===// 11699 //// OMPClauseReader implementation 11700 ////===----------------------------------------------------------------------===// 11701 11702 // This has to be in namespace clang because it's friended by all 11703 // of the OMP clauses. 11704 namespace clang { 11705 11706 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11707 ASTRecordReader &Record; 11708 ASTContext &Context; 11709 11710 public: 11711 OMPClauseReader(ASTRecordReader &Record) 11712 : Record(Record), Context(Record.getContext()) {} 11713 #define GEN_CLANG_CLAUSE_CLASS 11714 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11715 #include "llvm/Frontend/OpenMP/OMP.inc" 11716 OMPClause *readClause(); 11717 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11718 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11719 }; 11720 11721 } // end namespace clang 11722 11723 OMPClause *ASTRecordReader::readOMPClause() { 11724 return OMPClauseReader(*this).readClause(); 11725 } 11726 11727 OMPClause *OMPClauseReader::readClause() { 11728 OMPClause *C = nullptr; 11729 switch (llvm::omp::Clause(Record.readInt())) { 11730 case llvm::omp::OMPC_if: 11731 C = new (Context) OMPIfClause(); 11732 break; 11733 case llvm::omp::OMPC_final: 11734 C = new (Context) OMPFinalClause(); 11735 break; 11736 case llvm::omp::OMPC_num_threads: 11737 C = new (Context) OMPNumThreadsClause(); 11738 break; 11739 case llvm::omp::OMPC_safelen: 11740 C = new (Context) OMPSafelenClause(); 11741 break; 11742 case llvm::omp::OMPC_simdlen: 11743 C = new (Context) OMPSimdlenClause(); 11744 break; 11745 case llvm::omp::OMPC_sizes: { 11746 unsigned NumSizes = Record.readInt(); 11747 C = OMPSizesClause::CreateEmpty(Context, NumSizes); 11748 break; 11749 } 11750 case llvm::omp::OMPC_full: 11751 C = OMPFullClause::CreateEmpty(Context); 11752 break; 11753 case llvm::omp::OMPC_partial: 11754 C = OMPPartialClause::CreateEmpty(Context); 11755 break; 11756 case llvm::omp::OMPC_allocator: 11757 C = new (Context) OMPAllocatorClause(); 11758 break; 11759 case llvm::omp::OMPC_collapse: 11760 C = new (Context) OMPCollapseClause(); 11761 break; 11762 case llvm::omp::OMPC_default: 11763 C = new (Context) OMPDefaultClause(); 11764 break; 11765 case llvm::omp::OMPC_proc_bind: 11766 C = new (Context) OMPProcBindClause(); 11767 break; 11768 case llvm::omp::OMPC_schedule: 11769 C = new (Context) OMPScheduleClause(); 11770 break; 11771 case llvm::omp::OMPC_ordered: 11772 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11773 break; 11774 case llvm::omp::OMPC_nowait: 11775 C = new (Context) OMPNowaitClause(); 11776 break; 11777 case llvm::omp::OMPC_untied: 11778 C = new (Context) OMPUntiedClause(); 11779 break; 11780 case llvm::omp::OMPC_mergeable: 11781 C = new (Context) OMPMergeableClause(); 11782 break; 11783 case llvm::omp::OMPC_read: 11784 C = new (Context) OMPReadClause(); 11785 break; 11786 case llvm::omp::OMPC_write: 11787 C = new (Context) OMPWriteClause(); 11788 break; 11789 case llvm::omp::OMPC_update: 11790 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11791 break; 11792 case llvm::omp::OMPC_capture: 11793 C = new (Context) OMPCaptureClause(); 11794 break; 11795 case llvm::omp::OMPC_seq_cst: 11796 C = new (Context) OMPSeqCstClause(); 11797 break; 11798 case llvm::omp::OMPC_acq_rel: 11799 C = new (Context) OMPAcqRelClause(); 11800 break; 11801 case llvm::omp::OMPC_acquire: 11802 C = new (Context) OMPAcquireClause(); 11803 break; 11804 case llvm::omp::OMPC_release: 11805 C = new (Context) OMPReleaseClause(); 11806 break; 11807 case llvm::omp::OMPC_relaxed: 11808 C = new (Context) OMPRelaxedClause(); 11809 break; 11810 case llvm::omp::OMPC_threads: 11811 C = new (Context) OMPThreadsClause(); 11812 break; 11813 case llvm::omp::OMPC_simd: 11814 C = new (Context) OMPSIMDClause(); 11815 break; 11816 case llvm::omp::OMPC_nogroup: 11817 C = new (Context) OMPNogroupClause(); 11818 break; 11819 case llvm::omp::OMPC_unified_address: 11820 C = new (Context) OMPUnifiedAddressClause(); 11821 break; 11822 case llvm::omp::OMPC_unified_shared_memory: 11823 C = new (Context) OMPUnifiedSharedMemoryClause(); 11824 break; 11825 case llvm::omp::OMPC_reverse_offload: 11826 C = new (Context) OMPReverseOffloadClause(); 11827 break; 11828 case llvm::omp::OMPC_dynamic_allocators: 11829 C = new (Context) OMPDynamicAllocatorsClause(); 11830 break; 11831 case llvm::omp::OMPC_atomic_default_mem_order: 11832 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11833 break; 11834 case llvm::omp::OMPC_private: 11835 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11836 break; 11837 case llvm::omp::OMPC_firstprivate: 11838 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11839 break; 11840 case llvm::omp::OMPC_lastprivate: 11841 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11842 break; 11843 case llvm::omp::OMPC_shared: 11844 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11845 break; 11846 case llvm::omp::OMPC_reduction: { 11847 unsigned N = Record.readInt(); 11848 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11849 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11850 break; 11851 } 11852 case llvm::omp::OMPC_task_reduction: 11853 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11854 break; 11855 case llvm::omp::OMPC_in_reduction: 11856 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11857 break; 11858 case llvm::omp::OMPC_linear: 11859 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11860 break; 11861 case llvm::omp::OMPC_aligned: 11862 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11863 break; 11864 case llvm::omp::OMPC_copyin: 11865 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11866 break; 11867 case llvm::omp::OMPC_copyprivate: 11868 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11869 break; 11870 case llvm::omp::OMPC_flush: 11871 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11872 break; 11873 case llvm::omp::OMPC_depobj: 11874 C = OMPDepobjClause::CreateEmpty(Context); 11875 break; 11876 case llvm::omp::OMPC_depend: { 11877 unsigned NumVars = Record.readInt(); 11878 unsigned NumLoops = Record.readInt(); 11879 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11880 break; 11881 } 11882 case llvm::omp::OMPC_device: 11883 C = new (Context) OMPDeviceClause(); 11884 break; 11885 case llvm::omp::OMPC_map: { 11886 OMPMappableExprListSizeTy Sizes; 11887 Sizes.NumVars = Record.readInt(); 11888 Sizes.NumUniqueDeclarations = Record.readInt(); 11889 Sizes.NumComponentLists = Record.readInt(); 11890 Sizes.NumComponents = Record.readInt(); 11891 C = OMPMapClause::CreateEmpty(Context, Sizes); 11892 break; 11893 } 11894 case llvm::omp::OMPC_num_teams: 11895 C = new (Context) OMPNumTeamsClause(); 11896 break; 11897 case llvm::omp::OMPC_thread_limit: 11898 C = new (Context) OMPThreadLimitClause(); 11899 break; 11900 case llvm::omp::OMPC_priority: 11901 C = new (Context) OMPPriorityClause(); 11902 break; 11903 case llvm::omp::OMPC_grainsize: 11904 C = new (Context) OMPGrainsizeClause(); 11905 break; 11906 case llvm::omp::OMPC_num_tasks: 11907 C = new (Context) OMPNumTasksClause(); 11908 break; 11909 case llvm::omp::OMPC_hint: 11910 C = new (Context) OMPHintClause(); 11911 break; 11912 case llvm::omp::OMPC_dist_schedule: 11913 C = new (Context) OMPDistScheduleClause(); 11914 break; 11915 case llvm::omp::OMPC_defaultmap: 11916 C = new (Context) OMPDefaultmapClause(); 11917 break; 11918 case llvm::omp::OMPC_to: { 11919 OMPMappableExprListSizeTy Sizes; 11920 Sizes.NumVars = Record.readInt(); 11921 Sizes.NumUniqueDeclarations = Record.readInt(); 11922 Sizes.NumComponentLists = Record.readInt(); 11923 Sizes.NumComponents = Record.readInt(); 11924 C = OMPToClause::CreateEmpty(Context, Sizes); 11925 break; 11926 } 11927 case llvm::omp::OMPC_from: { 11928 OMPMappableExprListSizeTy Sizes; 11929 Sizes.NumVars = Record.readInt(); 11930 Sizes.NumUniqueDeclarations = Record.readInt(); 11931 Sizes.NumComponentLists = Record.readInt(); 11932 Sizes.NumComponents = Record.readInt(); 11933 C = OMPFromClause::CreateEmpty(Context, Sizes); 11934 break; 11935 } 11936 case llvm::omp::OMPC_use_device_ptr: { 11937 OMPMappableExprListSizeTy Sizes; 11938 Sizes.NumVars = Record.readInt(); 11939 Sizes.NumUniqueDeclarations = Record.readInt(); 11940 Sizes.NumComponentLists = Record.readInt(); 11941 Sizes.NumComponents = Record.readInt(); 11942 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11943 break; 11944 } 11945 case llvm::omp::OMPC_use_device_addr: { 11946 OMPMappableExprListSizeTy Sizes; 11947 Sizes.NumVars = Record.readInt(); 11948 Sizes.NumUniqueDeclarations = Record.readInt(); 11949 Sizes.NumComponentLists = Record.readInt(); 11950 Sizes.NumComponents = Record.readInt(); 11951 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11952 break; 11953 } 11954 case llvm::omp::OMPC_is_device_ptr: { 11955 OMPMappableExprListSizeTy Sizes; 11956 Sizes.NumVars = Record.readInt(); 11957 Sizes.NumUniqueDeclarations = Record.readInt(); 11958 Sizes.NumComponentLists = Record.readInt(); 11959 Sizes.NumComponents = Record.readInt(); 11960 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11961 break; 11962 } 11963 case llvm::omp::OMPC_allocate: 11964 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11965 break; 11966 case llvm::omp::OMPC_nontemporal: 11967 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11968 break; 11969 case llvm::omp::OMPC_inclusive: 11970 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11971 break; 11972 case llvm::omp::OMPC_exclusive: 11973 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11974 break; 11975 case llvm::omp::OMPC_order: 11976 C = new (Context) OMPOrderClause(); 11977 break; 11978 case llvm::omp::OMPC_init: 11979 C = OMPInitClause::CreateEmpty(Context, Record.readInt()); 11980 break; 11981 case llvm::omp::OMPC_use: 11982 C = new (Context) OMPUseClause(); 11983 break; 11984 case llvm::omp::OMPC_destroy: 11985 C = new (Context) OMPDestroyClause(); 11986 break; 11987 case llvm::omp::OMPC_novariants: 11988 C = new (Context) OMPNovariantsClause(); 11989 break; 11990 case llvm::omp::OMPC_nocontext: 11991 C = new (Context) OMPNocontextClause(); 11992 break; 11993 case llvm::omp::OMPC_detach: 11994 C = new (Context) OMPDetachClause(); 11995 break; 11996 case llvm::omp::OMPC_uses_allocators: 11997 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11998 break; 11999 case llvm::omp::OMPC_affinity: 12000 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 12001 break; 12002 case llvm::omp::OMPC_filter: 12003 C = new (Context) OMPFilterClause(); 12004 break; 12005 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 12006 case llvm::omp::Enum: \ 12007 break; 12008 #include "llvm/Frontend/OpenMP/OMPKinds.def" 12009 default: 12010 break; 12011 } 12012 assert(C && "Unknown OMPClause type"); 12013 12014 Visit(C); 12015 C->setLocStart(Record.readSourceLocation()); 12016 C->setLocEnd(Record.readSourceLocation()); 12017 12018 return C; 12019 } 12020 12021 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 12022 C->setPreInitStmt(Record.readSubStmt(), 12023 static_cast<OpenMPDirectiveKind>(Record.readInt())); 12024 } 12025 12026 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 12027 VisitOMPClauseWithPreInit(C); 12028 C->setPostUpdateExpr(Record.readSubExpr()); 12029 } 12030 12031 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 12032 VisitOMPClauseWithPreInit(C); 12033 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 12034 C->setNameModifierLoc(Record.readSourceLocation()); 12035 C->setColonLoc(Record.readSourceLocation()); 12036 C->setCondition(Record.readSubExpr()); 12037 C->setLParenLoc(Record.readSourceLocation()); 12038 } 12039 12040 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12041 VisitOMPClauseWithPreInit(C); 12042 C->setCondition(Record.readSubExpr()); 12043 C->setLParenLoc(Record.readSourceLocation()); 12044 } 12045 12046 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12047 VisitOMPClauseWithPreInit(C); 12048 C->setNumThreads(Record.readSubExpr()); 12049 C->setLParenLoc(Record.readSourceLocation()); 12050 } 12051 12052 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12053 C->setSafelen(Record.readSubExpr()); 12054 C->setLParenLoc(Record.readSourceLocation()); 12055 } 12056 12057 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12058 C->setSimdlen(Record.readSubExpr()); 12059 C->setLParenLoc(Record.readSourceLocation()); 12060 } 12061 12062 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) { 12063 for (Expr *&E : C->getSizesRefs()) 12064 E = Record.readSubExpr(); 12065 C->setLParenLoc(Record.readSourceLocation()); 12066 } 12067 12068 void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {} 12069 12070 void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) { 12071 C->setFactor(Record.readSubExpr()); 12072 C->setLParenLoc(Record.readSourceLocation()); 12073 } 12074 12075 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12076 C->setAllocator(Record.readExpr()); 12077 C->setLParenLoc(Record.readSourceLocation()); 12078 } 12079 12080 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12081 C->setNumForLoops(Record.readSubExpr()); 12082 C->setLParenLoc(Record.readSourceLocation()); 12083 } 12084 12085 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12086 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12087 C->setLParenLoc(Record.readSourceLocation()); 12088 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12089 } 12090 12091 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12092 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12093 C->setLParenLoc(Record.readSourceLocation()); 12094 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12095 } 12096 12097 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12098 VisitOMPClauseWithPreInit(C); 12099 C->setScheduleKind( 12100 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12101 C->setFirstScheduleModifier( 12102 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12103 C->setSecondScheduleModifier( 12104 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12105 C->setChunkSize(Record.readSubExpr()); 12106 C->setLParenLoc(Record.readSourceLocation()); 12107 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12108 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12109 C->setScheduleKindLoc(Record.readSourceLocation()); 12110 C->setCommaLoc(Record.readSourceLocation()); 12111 } 12112 12113 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12114 C->setNumForLoops(Record.readSubExpr()); 12115 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12116 C->setLoopNumIterations(I, Record.readSubExpr()); 12117 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12118 C->setLoopCounter(I, Record.readSubExpr()); 12119 C->setLParenLoc(Record.readSourceLocation()); 12120 } 12121 12122 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12123 C->setEventHandler(Record.readSubExpr()); 12124 C->setLParenLoc(Record.readSourceLocation()); 12125 } 12126 12127 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12128 12129 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12130 12131 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12132 12133 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12134 12135 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12136 12137 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12138 if (C->isExtended()) { 12139 C->setLParenLoc(Record.readSourceLocation()); 12140 C->setArgumentLoc(Record.readSourceLocation()); 12141 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12142 } 12143 } 12144 12145 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12146 12147 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12148 12149 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12150 12151 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12152 12153 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12154 12155 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12156 12157 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12158 12159 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12160 12161 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12162 12163 void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) { 12164 unsigned NumVars = C->varlist_size(); 12165 SmallVector<Expr *, 16> Vars; 12166 Vars.reserve(NumVars); 12167 for (unsigned I = 0; I != NumVars; ++I) 12168 Vars.push_back(Record.readSubExpr()); 12169 C->setVarRefs(Vars); 12170 C->setIsTarget(Record.readBool()); 12171 C->setIsTargetSync(Record.readBool()); 12172 C->setLParenLoc(Record.readSourceLocation()); 12173 C->setVarLoc(Record.readSourceLocation()); 12174 } 12175 12176 void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) { 12177 C->setInteropVar(Record.readSubExpr()); 12178 C->setLParenLoc(Record.readSourceLocation()); 12179 C->setVarLoc(Record.readSourceLocation()); 12180 } 12181 12182 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) { 12183 C->setInteropVar(Record.readSubExpr()); 12184 C->setLParenLoc(Record.readSourceLocation()); 12185 C->setVarLoc(Record.readSourceLocation()); 12186 } 12187 12188 void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) { 12189 VisitOMPClauseWithPreInit(C); 12190 C->setCondition(Record.readSubExpr()); 12191 C->setLParenLoc(Record.readSourceLocation()); 12192 } 12193 12194 void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) { 12195 VisitOMPClauseWithPreInit(C); 12196 C->setCondition(Record.readSubExpr()); 12197 C->setLParenLoc(Record.readSourceLocation()); 12198 } 12199 12200 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12201 12202 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12203 OMPUnifiedSharedMemoryClause *) {} 12204 12205 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12206 12207 void 12208 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12209 } 12210 12211 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12212 OMPAtomicDefaultMemOrderClause *C) { 12213 C->setAtomicDefaultMemOrderKind( 12214 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12215 C->setLParenLoc(Record.readSourceLocation()); 12216 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12217 } 12218 12219 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12220 C->setLParenLoc(Record.readSourceLocation()); 12221 unsigned NumVars = C->varlist_size(); 12222 SmallVector<Expr *, 16> Vars; 12223 Vars.reserve(NumVars); 12224 for (unsigned i = 0; i != NumVars; ++i) 12225 Vars.push_back(Record.readSubExpr()); 12226 C->setVarRefs(Vars); 12227 Vars.clear(); 12228 for (unsigned i = 0; i != NumVars; ++i) 12229 Vars.push_back(Record.readSubExpr()); 12230 C->setPrivateCopies(Vars); 12231 } 12232 12233 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12234 VisitOMPClauseWithPreInit(C); 12235 C->setLParenLoc(Record.readSourceLocation()); 12236 unsigned NumVars = C->varlist_size(); 12237 SmallVector<Expr *, 16> Vars; 12238 Vars.reserve(NumVars); 12239 for (unsigned i = 0; i != NumVars; ++i) 12240 Vars.push_back(Record.readSubExpr()); 12241 C->setVarRefs(Vars); 12242 Vars.clear(); 12243 for (unsigned i = 0; i != NumVars; ++i) 12244 Vars.push_back(Record.readSubExpr()); 12245 C->setPrivateCopies(Vars); 12246 Vars.clear(); 12247 for (unsigned i = 0; i != NumVars; ++i) 12248 Vars.push_back(Record.readSubExpr()); 12249 C->setInits(Vars); 12250 } 12251 12252 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12253 VisitOMPClauseWithPostUpdate(C); 12254 C->setLParenLoc(Record.readSourceLocation()); 12255 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12256 C->setKindLoc(Record.readSourceLocation()); 12257 C->setColonLoc(Record.readSourceLocation()); 12258 unsigned NumVars = C->varlist_size(); 12259 SmallVector<Expr *, 16> Vars; 12260 Vars.reserve(NumVars); 12261 for (unsigned i = 0; i != NumVars; ++i) 12262 Vars.push_back(Record.readSubExpr()); 12263 C->setVarRefs(Vars); 12264 Vars.clear(); 12265 for (unsigned i = 0; i != NumVars; ++i) 12266 Vars.push_back(Record.readSubExpr()); 12267 C->setPrivateCopies(Vars); 12268 Vars.clear(); 12269 for (unsigned i = 0; i != NumVars; ++i) 12270 Vars.push_back(Record.readSubExpr()); 12271 C->setSourceExprs(Vars); 12272 Vars.clear(); 12273 for (unsigned i = 0; i != NumVars; ++i) 12274 Vars.push_back(Record.readSubExpr()); 12275 C->setDestinationExprs(Vars); 12276 Vars.clear(); 12277 for (unsigned i = 0; i != NumVars; ++i) 12278 Vars.push_back(Record.readSubExpr()); 12279 C->setAssignmentOps(Vars); 12280 } 12281 12282 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12283 C->setLParenLoc(Record.readSourceLocation()); 12284 unsigned NumVars = C->varlist_size(); 12285 SmallVector<Expr *, 16> Vars; 12286 Vars.reserve(NumVars); 12287 for (unsigned i = 0; i != NumVars; ++i) 12288 Vars.push_back(Record.readSubExpr()); 12289 C->setVarRefs(Vars); 12290 } 12291 12292 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12293 VisitOMPClauseWithPostUpdate(C); 12294 C->setLParenLoc(Record.readSourceLocation()); 12295 C->setModifierLoc(Record.readSourceLocation()); 12296 C->setColonLoc(Record.readSourceLocation()); 12297 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12298 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12299 C->setQualifierLoc(NNSL); 12300 C->setNameInfo(DNI); 12301 12302 unsigned NumVars = C->varlist_size(); 12303 SmallVector<Expr *, 16> Vars; 12304 Vars.reserve(NumVars); 12305 for (unsigned i = 0; i != NumVars; ++i) 12306 Vars.push_back(Record.readSubExpr()); 12307 C->setVarRefs(Vars); 12308 Vars.clear(); 12309 for (unsigned i = 0; i != NumVars; ++i) 12310 Vars.push_back(Record.readSubExpr()); 12311 C->setPrivates(Vars); 12312 Vars.clear(); 12313 for (unsigned i = 0; i != NumVars; ++i) 12314 Vars.push_back(Record.readSubExpr()); 12315 C->setLHSExprs(Vars); 12316 Vars.clear(); 12317 for (unsigned i = 0; i != NumVars; ++i) 12318 Vars.push_back(Record.readSubExpr()); 12319 C->setRHSExprs(Vars); 12320 Vars.clear(); 12321 for (unsigned i = 0; i != NumVars; ++i) 12322 Vars.push_back(Record.readSubExpr()); 12323 C->setReductionOps(Vars); 12324 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12325 Vars.clear(); 12326 for (unsigned i = 0; i != NumVars; ++i) 12327 Vars.push_back(Record.readSubExpr()); 12328 C->setInscanCopyOps(Vars); 12329 Vars.clear(); 12330 for (unsigned i = 0; i != NumVars; ++i) 12331 Vars.push_back(Record.readSubExpr()); 12332 C->setInscanCopyArrayTemps(Vars); 12333 Vars.clear(); 12334 for (unsigned i = 0; i != NumVars; ++i) 12335 Vars.push_back(Record.readSubExpr()); 12336 C->setInscanCopyArrayElems(Vars); 12337 } 12338 } 12339 12340 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12341 VisitOMPClauseWithPostUpdate(C); 12342 C->setLParenLoc(Record.readSourceLocation()); 12343 C->setColonLoc(Record.readSourceLocation()); 12344 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12345 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12346 C->setQualifierLoc(NNSL); 12347 C->setNameInfo(DNI); 12348 12349 unsigned NumVars = C->varlist_size(); 12350 SmallVector<Expr *, 16> Vars; 12351 Vars.reserve(NumVars); 12352 for (unsigned I = 0; I != NumVars; ++I) 12353 Vars.push_back(Record.readSubExpr()); 12354 C->setVarRefs(Vars); 12355 Vars.clear(); 12356 for (unsigned I = 0; I != NumVars; ++I) 12357 Vars.push_back(Record.readSubExpr()); 12358 C->setPrivates(Vars); 12359 Vars.clear(); 12360 for (unsigned I = 0; I != NumVars; ++I) 12361 Vars.push_back(Record.readSubExpr()); 12362 C->setLHSExprs(Vars); 12363 Vars.clear(); 12364 for (unsigned I = 0; I != NumVars; ++I) 12365 Vars.push_back(Record.readSubExpr()); 12366 C->setRHSExprs(Vars); 12367 Vars.clear(); 12368 for (unsigned I = 0; I != NumVars; ++I) 12369 Vars.push_back(Record.readSubExpr()); 12370 C->setReductionOps(Vars); 12371 } 12372 12373 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12374 VisitOMPClauseWithPostUpdate(C); 12375 C->setLParenLoc(Record.readSourceLocation()); 12376 C->setColonLoc(Record.readSourceLocation()); 12377 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12378 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12379 C->setQualifierLoc(NNSL); 12380 C->setNameInfo(DNI); 12381 12382 unsigned NumVars = C->varlist_size(); 12383 SmallVector<Expr *, 16> Vars; 12384 Vars.reserve(NumVars); 12385 for (unsigned I = 0; I != NumVars; ++I) 12386 Vars.push_back(Record.readSubExpr()); 12387 C->setVarRefs(Vars); 12388 Vars.clear(); 12389 for (unsigned I = 0; I != NumVars; ++I) 12390 Vars.push_back(Record.readSubExpr()); 12391 C->setPrivates(Vars); 12392 Vars.clear(); 12393 for (unsigned I = 0; I != NumVars; ++I) 12394 Vars.push_back(Record.readSubExpr()); 12395 C->setLHSExprs(Vars); 12396 Vars.clear(); 12397 for (unsigned I = 0; I != NumVars; ++I) 12398 Vars.push_back(Record.readSubExpr()); 12399 C->setRHSExprs(Vars); 12400 Vars.clear(); 12401 for (unsigned I = 0; I != NumVars; ++I) 12402 Vars.push_back(Record.readSubExpr()); 12403 C->setReductionOps(Vars); 12404 Vars.clear(); 12405 for (unsigned I = 0; I != NumVars; ++I) 12406 Vars.push_back(Record.readSubExpr()); 12407 C->setTaskgroupDescriptors(Vars); 12408 } 12409 12410 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12411 VisitOMPClauseWithPostUpdate(C); 12412 C->setLParenLoc(Record.readSourceLocation()); 12413 C->setColonLoc(Record.readSourceLocation()); 12414 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12415 C->setModifierLoc(Record.readSourceLocation()); 12416 unsigned NumVars = C->varlist_size(); 12417 SmallVector<Expr *, 16> Vars; 12418 Vars.reserve(NumVars); 12419 for (unsigned i = 0; i != NumVars; ++i) 12420 Vars.push_back(Record.readSubExpr()); 12421 C->setVarRefs(Vars); 12422 Vars.clear(); 12423 for (unsigned i = 0; i != NumVars; ++i) 12424 Vars.push_back(Record.readSubExpr()); 12425 C->setPrivates(Vars); 12426 Vars.clear(); 12427 for (unsigned i = 0; i != NumVars; ++i) 12428 Vars.push_back(Record.readSubExpr()); 12429 C->setInits(Vars); 12430 Vars.clear(); 12431 for (unsigned i = 0; i != NumVars; ++i) 12432 Vars.push_back(Record.readSubExpr()); 12433 C->setUpdates(Vars); 12434 Vars.clear(); 12435 for (unsigned i = 0; i != NumVars; ++i) 12436 Vars.push_back(Record.readSubExpr()); 12437 C->setFinals(Vars); 12438 C->setStep(Record.readSubExpr()); 12439 C->setCalcStep(Record.readSubExpr()); 12440 Vars.clear(); 12441 for (unsigned I = 0; I != NumVars + 1; ++I) 12442 Vars.push_back(Record.readSubExpr()); 12443 C->setUsedExprs(Vars); 12444 } 12445 12446 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12447 C->setLParenLoc(Record.readSourceLocation()); 12448 C->setColonLoc(Record.readSourceLocation()); 12449 unsigned NumVars = C->varlist_size(); 12450 SmallVector<Expr *, 16> Vars; 12451 Vars.reserve(NumVars); 12452 for (unsigned i = 0; i != NumVars; ++i) 12453 Vars.push_back(Record.readSubExpr()); 12454 C->setVarRefs(Vars); 12455 C->setAlignment(Record.readSubExpr()); 12456 } 12457 12458 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12459 C->setLParenLoc(Record.readSourceLocation()); 12460 unsigned NumVars = C->varlist_size(); 12461 SmallVector<Expr *, 16> Exprs; 12462 Exprs.reserve(NumVars); 12463 for (unsigned i = 0; i != NumVars; ++i) 12464 Exprs.push_back(Record.readSubExpr()); 12465 C->setVarRefs(Exprs); 12466 Exprs.clear(); 12467 for (unsigned i = 0; i != NumVars; ++i) 12468 Exprs.push_back(Record.readSubExpr()); 12469 C->setSourceExprs(Exprs); 12470 Exprs.clear(); 12471 for (unsigned i = 0; i != NumVars; ++i) 12472 Exprs.push_back(Record.readSubExpr()); 12473 C->setDestinationExprs(Exprs); 12474 Exprs.clear(); 12475 for (unsigned i = 0; i != NumVars; ++i) 12476 Exprs.push_back(Record.readSubExpr()); 12477 C->setAssignmentOps(Exprs); 12478 } 12479 12480 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12481 C->setLParenLoc(Record.readSourceLocation()); 12482 unsigned NumVars = C->varlist_size(); 12483 SmallVector<Expr *, 16> Exprs; 12484 Exprs.reserve(NumVars); 12485 for (unsigned i = 0; i != NumVars; ++i) 12486 Exprs.push_back(Record.readSubExpr()); 12487 C->setVarRefs(Exprs); 12488 Exprs.clear(); 12489 for (unsigned i = 0; i != NumVars; ++i) 12490 Exprs.push_back(Record.readSubExpr()); 12491 C->setSourceExprs(Exprs); 12492 Exprs.clear(); 12493 for (unsigned i = 0; i != NumVars; ++i) 12494 Exprs.push_back(Record.readSubExpr()); 12495 C->setDestinationExprs(Exprs); 12496 Exprs.clear(); 12497 for (unsigned i = 0; i != NumVars; ++i) 12498 Exprs.push_back(Record.readSubExpr()); 12499 C->setAssignmentOps(Exprs); 12500 } 12501 12502 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12503 C->setLParenLoc(Record.readSourceLocation()); 12504 unsigned NumVars = C->varlist_size(); 12505 SmallVector<Expr *, 16> Vars; 12506 Vars.reserve(NumVars); 12507 for (unsigned i = 0; i != NumVars; ++i) 12508 Vars.push_back(Record.readSubExpr()); 12509 C->setVarRefs(Vars); 12510 } 12511 12512 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12513 C->setDepobj(Record.readSubExpr()); 12514 C->setLParenLoc(Record.readSourceLocation()); 12515 } 12516 12517 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12518 C->setLParenLoc(Record.readSourceLocation()); 12519 C->setModifier(Record.readSubExpr()); 12520 C->setDependencyKind( 12521 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12522 C->setDependencyLoc(Record.readSourceLocation()); 12523 C->setColonLoc(Record.readSourceLocation()); 12524 unsigned NumVars = C->varlist_size(); 12525 SmallVector<Expr *, 16> Vars; 12526 Vars.reserve(NumVars); 12527 for (unsigned I = 0; I != NumVars; ++I) 12528 Vars.push_back(Record.readSubExpr()); 12529 C->setVarRefs(Vars); 12530 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12531 C->setLoopData(I, Record.readSubExpr()); 12532 } 12533 12534 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12535 VisitOMPClauseWithPreInit(C); 12536 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12537 C->setDevice(Record.readSubExpr()); 12538 C->setModifierLoc(Record.readSourceLocation()); 12539 C->setLParenLoc(Record.readSourceLocation()); 12540 } 12541 12542 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12543 C->setLParenLoc(Record.readSourceLocation()); 12544 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12545 C->setMapTypeModifier( 12546 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12547 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12548 } 12549 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12550 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12551 C->setMapType( 12552 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12553 C->setMapLoc(Record.readSourceLocation()); 12554 C->setColonLoc(Record.readSourceLocation()); 12555 auto NumVars = C->varlist_size(); 12556 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12557 auto TotalLists = C->getTotalComponentListNum(); 12558 auto TotalComponents = C->getTotalComponentsNum(); 12559 12560 SmallVector<Expr *, 16> Vars; 12561 Vars.reserve(NumVars); 12562 for (unsigned i = 0; i != NumVars; ++i) 12563 Vars.push_back(Record.readExpr()); 12564 C->setVarRefs(Vars); 12565 12566 SmallVector<Expr *, 16> UDMappers; 12567 UDMappers.reserve(NumVars); 12568 for (unsigned I = 0; I < NumVars; ++I) 12569 UDMappers.push_back(Record.readExpr()); 12570 C->setUDMapperRefs(UDMappers); 12571 12572 SmallVector<ValueDecl *, 16> Decls; 12573 Decls.reserve(UniqueDecls); 12574 for (unsigned i = 0; i < UniqueDecls; ++i) 12575 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12576 C->setUniqueDecls(Decls); 12577 12578 SmallVector<unsigned, 16> ListsPerDecl; 12579 ListsPerDecl.reserve(UniqueDecls); 12580 for (unsigned i = 0; i < UniqueDecls; ++i) 12581 ListsPerDecl.push_back(Record.readInt()); 12582 C->setDeclNumLists(ListsPerDecl); 12583 12584 SmallVector<unsigned, 32> ListSizes; 12585 ListSizes.reserve(TotalLists); 12586 for (unsigned i = 0; i < TotalLists; ++i) 12587 ListSizes.push_back(Record.readInt()); 12588 C->setComponentListSizes(ListSizes); 12589 12590 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12591 Components.reserve(TotalComponents); 12592 for (unsigned i = 0; i < TotalComponents; ++i) { 12593 Expr *AssociatedExprPr = Record.readExpr(); 12594 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12595 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12596 /*IsNonContiguous=*/false); 12597 } 12598 C->setComponents(Components, ListSizes); 12599 } 12600 12601 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12602 C->setLParenLoc(Record.readSourceLocation()); 12603 C->setColonLoc(Record.readSourceLocation()); 12604 C->setAllocator(Record.readSubExpr()); 12605 unsigned NumVars = C->varlist_size(); 12606 SmallVector<Expr *, 16> Vars; 12607 Vars.reserve(NumVars); 12608 for (unsigned i = 0; i != NumVars; ++i) 12609 Vars.push_back(Record.readSubExpr()); 12610 C->setVarRefs(Vars); 12611 } 12612 12613 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12614 VisitOMPClauseWithPreInit(C); 12615 C->setNumTeams(Record.readSubExpr()); 12616 C->setLParenLoc(Record.readSourceLocation()); 12617 } 12618 12619 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12620 VisitOMPClauseWithPreInit(C); 12621 C->setThreadLimit(Record.readSubExpr()); 12622 C->setLParenLoc(Record.readSourceLocation()); 12623 } 12624 12625 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12626 VisitOMPClauseWithPreInit(C); 12627 C->setPriority(Record.readSubExpr()); 12628 C->setLParenLoc(Record.readSourceLocation()); 12629 } 12630 12631 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12632 VisitOMPClauseWithPreInit(C); 12633 C->setGrainsize(Record.readSubExpr()); 12634 C->setLParenLoc(Record.readSourceLocation()); 12635 } 12636 12637 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12638 VisitOMPClauseWithPreInit(C); 12639 C->setNumTasks(Record.readSubExpr()); 12640 C->setLParenLoc(Record.readSourceLocation()); 12641 } 12642 12643 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12644 C->setHint(Record.readSubExpr()); 12645 C->setLParenLoc(Record.readSourceLocation()); 12646 } 12647 12648 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12649 VisitOMPClauseWithPreInit(C); 12650 C->setDistScheduleKind( 12651 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12652 C->setChunkSize(Record.readSubExpr()); 12653 C->setLParenLoc(Record.readSourceLocation()); 12654 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12655 C->setCommaLoc(Record.readSourceLocation()); 12656 } 12657 12658 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12659 C->setDefaultmapKind( 12660 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12661 C->setDefaultmapModifier( 12662 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12663 C->setLParenLoc(Record.readSourceLocation()); 12664 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12665 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12666 } 12667 12668 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12669 C->setLParenLoc(Record.readSourceLocation()); 12670 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12671 C->setMotionModifier( 12672 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12673 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12674 } 12675 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12676 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12677 C->setColonLoc(Record.readSourceLocation()); 12678 auto NumVars = C->varlist_size(); 12679 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12680 auto TotalLists = C->getTotalComponentListNum(); 12681 auto TotalComponents = C->getTotalComponentsNum(); 12682 12683 SmallVector<Expr *, 16> Vars; 12684 Vars.reserve(NumVars); 12685 for (unsigned i = 0; i != NumVars; ++i) 12686 Vars.push_back(Record.readSubExpr()); 12687 C->setVarRefs(Vars); 12688 12689 SmallVector<Expr *, 16> UDMappers; 12690 UDMappers.reserve(NumVars); 12691 for (unsigned I = 0; I < NumVars; ++I) 12692 UDMappers.push_back(Record.readSubExpr()); 12693 C->setUDMapperRefs(UDMappers); 12694 12695 SmallVector<ValueDecl *, 16> Decls; 12696 Decls.reserve(UniqueDecls); 12697 for (unsigned i = 0; i < UniqueDecls; ++i) 12698 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12699 C->setUniqueDecls(Decls); 12700 12701 SmallVector<unsigned, 16> ListsPerDecl; 12702 ListsPerDecl.reserve(UniqueDecls); 12703 for (unsigned i = 0; i < UniqueDecls; ++i) 12704 ListsPerDecl.push_back(Record.readInt()); 12705 C->setDeclNumLists(ListsPerDecl); 12706 12707 SmallVector<unsigned, 32> ListSizes; 12708 ListSizes.reserve(TotalLists); 12709 for (unsigned i = 0; i < TotalLists; ++i) 12710 ListSizes.push_back(Record.readInt()); 12711 C->setComponentListSizes(ListSizes); 12712 12713 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12714 Components.reserve(TotalComponents); 12715 for (unsigned i = 0; i < TotalComponents; ++i) { 12716 Expr *AssociatedExprPr = Record.readSubExpr(); 12717 bool IsNonContiguous = Record.readBool(); 12718 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12719 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12720 } 12721 C->setComponents(Components, ListSizes); 12722 } 12723 12724 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12725 C->setLParenLoc(Record.readSourceLocation()); 12726 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12727 C->setMotionModifier( 12728 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12729 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12730 } 12731 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12732 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12733 C->setColonLoc(Record.readSourceLocation()); 12734 auto NumVars = C->varlist_size(); 12735 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12736 auto TotalLists = C->getTotalComponentListNum(); 12737 auto TotalComponents = C->getTotalComponentsNum(); 12738 12739 SmallVector<Expr *, 16> Vars; 12740 Vars.reserve(NumVars); 12741 for (unsigned i = 0; i != NumVars; ++i) 12742 Vars.push_back(Record.readSubExpr()); 12743 C->setVarRefs(Vars); 12744 12745 SmallVector<Expr *, 16> UDMappers; 12746 UDMappers.reserve(NumVars); 12747 for (unsigned I = 0; I < NumVars; ++I) 12748 UDMappers.push_back(Record.readSubExpr()); 12749 C->setUDMapperRefs(UDMappers); 12750 12751 SmallVector<ValueDecl *, 16> Decls; 12752 Decls.reserve(UniqueDecls); 12753 for (unsigned i = 0; i < UniqueDecls; ++i) 12754 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12755 C->setUniqueDecls(Decls); 12756 12757 SmallVector<unsigned, 16> ListsPerDecl; 12758 ListsPerDecl.reserve(UniqueDecls); 12759 for (unsigned i = 0; i < UniqueDecls; ++i) 12760 ListsPerDecl.push_back(Record.readInt()); 12761 C->setDeclNumLists(ListsPerDecl); 12762 12763 SmallVector<unsigned, 32> ListSizes; 12764 ListSizes.reserve(TotalLists); 12765 for (unsigned i = 0; i < TotalLists; ++i) 12766 ListSizes.push_back(Record.readInt()); 12767 C->setComponentListSizes(ListSizes); 12768 12769 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12770 Components.reserve(TotalComponents); 12771 for (unsigned i = 0; i < TotalComponents; ++i) { 12772 Expr *AssociatedExprPr = Record.readSubExpr(); 12773 bool IsNonContiguous = Record.readBool(); 12774 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12775 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12776 } 12777 C->setComponents(Components, ListSizes); 12778 } 12779 12780 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12781 C->setLParenLoc(Record.readSourceLocation()); 12782 auto NumVars = C->varlist_size(); 12783 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12784 auto TotalLists = C->getTotalComponentListNum(); 12785 auto TotalComponents = C->getTotalComponentsNum(); 12786 12787 SmallVector<Expr *, 16> Vars; 12788 Vars.reserve(NumVars); 12789 for (unsigned i = 0; i != NumVars; ++i) 12790 Vars.push_back(Record.readSubExpr()); 12791 C->setVarRefs(Vars); 12792 Vars.clear(); 12793 for (unsigned i = 0; i != NumVars; ++i) 12794 Vars.push_back(Record.readSubExpr()); 12795 C->setPrivateCopies(Vars); 12796 Vars.clear(); 12797 for (unsigned i = 0; i != NumVars; ++i) 12798 Vars.push_back(Record.readSubExpr()); 12799 C->setInits(Vars); 12800 12801 SmallVector<ValueDecl *, 16> Decls; 12802 Decls.reserve(UniqueDecls); 12803 for (unsigned i = 0; i < UniqueDecls; ++i) 12804 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12805 C->setUniqueDecls(Decls); 12806 12807 SmallVector<unsigned, 16> ListsPerDecl; 12808 ListsPerDecl.reserve(UniqueDecls); 12809 for (unsigned i = 0; i < UniqueDecls; ++i) 12810 ListsPerDecl.push_back(Record.readInt()); 12811 C->setDeclNumLists(ListsPerDecl); 12812 12813 SmallVector<unsigned, 32> ListSizes; 12814 ListSizes.reserve(TotalLists); 12815 for (unsigned i = 0; i < TotalLists; ++i) 12816 ListSizes.push_back(Record.readInt()); 12817 C->setComponentListSizes(ListSizes); 12818 12819 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12820 Components.reserve(TotalComponents); 12821 for (unsigned i = 0; i < TotalComponents; ++i) { 12822 auto *AssociatedExprPr = Record.readSubExpr(); 12823 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12824 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12825 /*IsNonContiguous=*/false); 12826 } 12827 C->setComponents(Components, ListSizes); 12828 } 12829 12830 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12831 C->setLParenLoc(Record.readSourceLocation()); 12832 auto NumVars = C->varlist_size(); 12833 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12834 auto TotalLists = C->getTotalComponentListNum(); 12835 auto TotalComponents = C->getTotalComponentsNum(); 12836 12837 SmallVector<Expr *, 16> Vars; 12838 Vars.reserve(NumVars); 12839 for (unsigned i = 0; i != NumVars; ++i) 12840 Vars.push_back(Record.readSubExpr()); 12841 C->setVarRefs(Vars); 12842 12843 SmallVector<ValueDecl *, 16> Decls; 12844 Decls.reserve(UniqueDecls); 12845 for (unsigned i = 0; i < UniqueDecls; ++i) 12846 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12847 C->setUniqueDecls(Decls); 12848 12849 SmallVector<unsigned, 16> ListsPerDecl; 12850 ListsPerDecl.reserve(UniqueDecls); 12851 for (unsigned i = 0; i < UniqueDecls; ++i) 12852 ListsPerDecl.push_back(Record.readInt()); 12853 C->setDeclNumLists(ListsPerDecl); 12854 12855 SmallVector<unsigned, 32> ListSizes; 12856 ListSizes.reserve(TotalLists); 12857 for (unsigned i = 0; i < TotalLists; ++i) 12858 ListSizes.push_back(Record.readInt()); 12859 C->setComponentListSizes(ListSizes); 12860 12861 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12862 Components.reserve(TotalComponents); 12863 for (unsigned i = 0; i < TotalComponents; ++i) { 12864 Expr *AssociatedExpr = Record.readSubExpr(); 12865 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12866 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12867 /*IsNonContiguous*/ false); 12868 } 12869 C->setComponents(Components, ListSizes); 12870 } 12871 12872 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12873 C->setLParenLoc(Record.readSourceLocation()); 12874 auto NumVars = C->varlist_size(); 12875 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12876 auto TotalLists = C->getTotalComponentListNum(); 12877 auto TotalComponents = C->getTotalComponentsNum(); 12878 12879 SmallVector<Expr *, 16> Vars; 12880 Vars.reserve(NumVars); 12881 for (unsigned i = 0; i != NumVars; ++i) 12882 Vars.push_back(Record.readSubExpr()); 12883 C->setVarRefs(Vars); 12884 Vars.clear(); 12885 12886 SmallVector<ValueDecl *, 16> Decls; 12887 Decls.reserve(UniqueDecls); 12888 for (unsigned i = 0; i < UniqueDecls; ++i) 12889 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12890 C->setUniqueDecls(Decls); 12891 12892 SmallVector<unsigned, 16> ListsPerDecl; 12893 ListsPerDecl.reserve(UniqueDecls); 12894 for (unsigned i = 0; i < UniqueDecls; ++i) 12895 ListsPerDecl.push_back(Record.readInt()); 12896 C->setDeclNumLists(ListsPerDecl); 12897 12898 SmallVector<unsigned, 32> ListSizes; 12899 ListSizes.reserve(TotalLists); 12900 for (unsigned i = 0; i < TotalLists; ++i) 12901 ListSizes.push_back(Record.readInt()); 12902 C->setComponentListSizes(ListSizes); 12903 12904 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12905 Components.reserve(TotalComponents); 12906 for (unsigned i = 0; i < TotalComponents; ++i) { 12907 Expr *AssociatedExpr = Record.readSubExpr(); 12908 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12909 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12910 /*IsNonContiguous=*/false); 12911 } 12912 C->setComponents(Components, ListSizes); 12913 } 12914 12915 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12916 C->setLParenLoc(Record.readSourceLocation()); 12917 unsigned NumVars = C->varlist_size(); 12918 SmallVector<Expr *, 16> Vars; 12919 Vars.reserve(NumVars); 12920 for (unsigned i = 0; i != NumVars; ++i) 12921 Vars.push_back(Record.readSubExpr()); 12922 C->setVarRefs(Vars); 12923 Vars.clear(); 12924 Vars.reserve(NumVars); 12925 for (unsigned i = 0; i != NumVars; ++i) 12926 Vars.push_back(Record.readSubExpr()); 12927 C->setPrivateRefs(Vars); 12928 } 12929 12930 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12931 C->setLParenLoc(Record.readSourceLocation()); 12932 unsigned NumVars = C->varlist_size(); 12933 SmallVector<Expr *, 16> Vars; 12934 Vars.reserve(NumVars); 12935 for (unsigned i = 0; i != NumVars; ++i) 12936 Vars.push_back(Record.readSubExpr()); 12937 C->setVarRefs(Vars); 12938 } 12939 12940 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12941 C->setLParenLoc(Record.readSourceLocation()); 12942 unsigned NumVars = C->varlist_size(); 12943 SmallVector<Expr *, 16> Vars; 12944 Vars.reserve(NumVars); 12945 for (unsigned i = 0; i != NumVars; ++i) 12946 Vars.push_back(Record.readSubExpr()); 12947 C->setVarRefs(Vars); 12948 } 12949 12950 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12951 C->setLParenLoc(Record.readSourceLocation()); 12952 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12953 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12954 Data.reserve(NumOfAllocators); 12955 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12956 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12957 D.Allocator = Record.readSubExpr(); 12958 D.AllocatorTraits = Record.readSubExpr(); 12959 D.LParenLoc = Record.readSourceLocation(); 12960 D.RParenLoc = Record.readSourceLocation(); 12961 } 12962 C->setAllocatorsData(Data); 12963 } 12964 12965 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12966 C->setLParenLoc(Record.readSourceLocation()); 12967 C->setModifier(Record.readSubExpr()); 12968 C->setColonLoc(Record.readSourceLocation()); 12969 unsigned NumOfLocators = C->varlist_size(); 12970 SmallVector<Expr *, 4> Locators; 12971 Locators.reserve(NumOfLocators); 12972 for (unsigned I = 0; I != NumOfLocators; ++I) 12973 Locators.push_back(Record.readSubExpr()); 12974 C->setVarRefs(Locators); 12975 } 12976 12977 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12978 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12979 C->setLParenLoc(Record.readSourceLocation()); 12980 C->setKindKwLoc(Record.readSourceLocation()); 12981 } 12982 12983 void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) { 12984 VisitOMPClauseWithPreInit(C); 12985 C->setThreadID(Record.readSubExpr()); 12986 C->setLParenLoc(Record.readSourceLocation()); 12987 } 12988 12989 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12990 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12991 TI.Sets.resize(readUInt32()); 12992 for (auto &Set : TI.Sets) { 12993 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12994 Set.Selectors.resize(readUInt32()); 12995 for (auto &Selector : Set.Selectors) { 12996 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12997 Selector.ScoreOrCondition = nullptr; 12998 if (readBool()) 12999 Selector.ScoreOrCondition = readExprRef(); 13000 Selector.Properties.resize(readUInt32()); 13001 for (auto &Property : Selector.Properties) 13002 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 13003 } 13004 } 13005 return &TI; 13006 } 13007 13008 void ASTRecordReader::readOMPChildren(OMPChildren *Data) { 13009 if (!Data) 13010 return; 13011 if (Reader->ReadingKind == ASTReader::Read_Stmt) { 13012 // Skip NumClauses, NumChildren and HasAssociatedStmt fields. 13013 skipInts(3); 13014 } 13015 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses()); 13016 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I) 13017 Clauses[I] = readOMPClause(); 13018 Data->setClauses(Clauses); 13019 if (Data->hasAssociatedStmt()) 13020 Data->setAssociatedStmt(readStmt()); 13021 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I) 13022 Data->getChildren()[I] = readStmt(); 13023 } 13024