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 if (LangOpts.Modules) { 788 if (SpecificModuleCachePath != ExistingModuleCachePath) { 789 if (Diags) 790 Diags->Report(diag::err_pch_modulecache_mismatch) 791 << SpecificModuleCachePath << ExistingModuleCachePath; 792 return true; 793 } 794 } 795 796 return false; 797 } 798 799 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 800 StringRef SpecificModuleCachePath, 801 bool Complain) { 802 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 803 PP.getHeaderSearchInfo().getModuleCachePath(), 804 Complain ? &Reader.Diags : nullptr, 805 PP.getLangOpts()); 806 } 807 808 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 809 PP.setCounterValue(Value); 810 } 811 812 //===----------------------------------------------------------------------===// 813 // AST reader implementation 814 //===----------------------------------------------------------------------===// 815 816 static uint64_t readULEB(const unsigned char *&P) { 817 unsigned Length = 0; 818 const char *Error = nullptr; 819 820 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error); 821 if (Error) 822 llvm::report_fatal_error(Error); 823 P += Length; 824 return Val; 825 } 826 827 /// Read ULEB-encoded key length and data length. 828 static std::pair<unsigned, unsigned> 829 readULEBKeyDataLength(const unsigned char *&P) { 830 unsigned KeyLen = readULEB(P); 831 if ((unsigned)KeyLen != KeyLen) 832 llvm::report_fatal_error("key too large"); 833 834 unsigned DataLen = readULEB(P); 835 if ((unsigned)DataLen != DataLen) 836 llvm::report_fatal_error("data too large"); 837 838 return std::make_pair(KeyLen, DataLen); 839 } 840 841 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 842 bool TakeOwnership) { 843 DeserializationListener = Listener; 844 OwnsDeserializationListener = TakeOwnership; 845 } 846 847 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 848 return serialization::ComputeHash(Sel); 849 } 850 851 std::pair<unsigned, unsigned> 852 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 853 return readULEBKeyDataLength(d); 854 } 855 856 ASTSelectorLookupTrait::internal_key_type 857 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 858 using namespace llvm::support; 859 860 SelectorTable &SelTable = Reader.getContext().Selectors; 861 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 862 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 863 F, endian::readNext<uint32_t, little, unaligned>(d)); 864 if (N == 0) 865 return SelTable.getNullarySelector(FirstII); 866 else if (N == 1) 867 return SelTable.getUnarySelector(FirstII); 868 869 SmallVector<IdentifierInfo *, 16> Args; 870 Args.push_back(FirstII); 871 for (unsigned I = 1; I != N; ++I) 872 Args.push_back(Reader.getLocalIdentifier( 873 F, endian::readNext<uint32_t, little, unaligned>(d))); 874 875 return SelTable.getSelector(N, Args.data()); 876 } 877 878 ASTSelectorLookupTrait::data_type 879 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 880 unsigned DataLen) { 881 using namespace llvm::support; 882 883 data_type Result; 884 885 Result.ID = Reader.getGlobalSelectorID( 886 F, endian::readNext<uint32_t, little, unaligned>(d)); 887 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 888 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 889 Result.InstanceBits = FullInstanceBits & 0x3; 890 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 891 Result.FactoryBits = FullFactoryBits & 0x3; 892 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 893 unsigned NumInstanceMethods = FullInstanceBits >> 3; 894 unsigned NumFactoryMethods = FullFactoryBits >> 3; 895 896 // Load instance methods 897 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 898 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 899 F, endian::readNext<uint32_t, little, unaligned>(d))) 900 Result.Instance.push_back(Method); 901 } 902 903 // Load factory methods 904 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 905 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 906 F, endian::readNext<uint32_t, little, unaligned>(d))) 907 Result.Factory.push_back(Method); 908 } 909 910 return Result; 911 } 912 913 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 914 return llvm::djbHash(a); 915 } 916 917 std::pair<unsigned, unsigned> 918 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 919 return readULEBKeyDataLength(d); 920 } 921 922 ASTIdentifierLookupTraitBase::internal_key_type 923 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 924 assert(n >= 2 && d[n-1] == '\0'); 925 return StringRef((const char*) d, n-1); 926 } 927 928 /// Whether the given identifier is "interesting". 929 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 930 bool IsModule) { 931 return II.hadMacroDefinition() || II.isPoisoned() || 932 (!IsModule && II.getObjCOrBuiltinID()) || 933 II.hasRevertedTokenIDToIdentifier() || 934 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 935 II.getFETokenInfo()); 936 } 937 938 static bool readBit(unsigned &Bits) { 939 bool Value = Bits & 0x1; 940 Bits >>= 1; 941 return Value; 942 } 943 944 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 945 using namespace llvm::support; 946 947 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 948 return Reader.getGlobalIdentifierID(F, RawID >> 1); 949 } 950 951 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 952 if (!II.isFromAST()) { 953 II.setIsFromAST(); 954 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 955 if (isInterestingIdentifier(Reader, II, IsModule)) 956 II.setChangedSinceDeserialization(); 957 } 958 } 959 960 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 961 const unsigned char* d, 962 unsigned DataLen) { 963 using namespace llvm::support; 964 965 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 966 bool IsInteresting = RawID & 0x01; 967 968 // Wipe out the "is interesting" bit. 969 RawID = RawID >> 1; 970 971 // Build the IdentifierInfo and link the identifier ID with it. 972 IdentifierInfo *II = KnownII; 973 if (!II) { 974 II = &Reader.getIdentifierTable().getOwn(k); 975 KnownII = II; 976 } 977 markIdentifierFromAST(Reader, *II); 978 Reader.markIdentifierUpToDate(II); 979 980 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 981 if (!IsInteresting) { 982 // For uninteresting identifiers, there's nothing else to do. Just notify 983 // the reader that we've finished loading this identifier. 984 Reader.SetIdentifierInfo(ID, II); 985 return II; 986 } 987 988 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 989 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 990 bool CPlusPlusOperatorKeyword = readBit(Bits); 991 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 992 bool Poisoned = readBit(Bits); 993 bool ExtensionToken = readBit(Bits); 994 bool HadMacroDefinition = readBit(Bits); 995 996 assert(Bits == 0 && "Extra bits in the identifier?"); 997 DataLen -= 8; 998 999 // Set or check the various bits in the IdentifierInfo structure. 1000 // Token IDs are read-only. 1001 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 1002 II->revertTokenIDToIdentifier(); 1003 if (!F.isModule()) 1004 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 1005 assert(II->isExtensionToken() == ExtensionToken && 1006 "Incorrect extension token flag"); 1007 (void)ExtensionToken; 1008 if (Poisoned) 1009 II->setIsPoisoned(true); 1010 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 1011 "Incorrect C++ operator keyword flag"); 1012 (void)CPlusPlusOperatorKeyword; 1013 1014 // If this identifier is a macro, deserialize the macro 1015 // definition. 1016 if (HadMacroDefinition) { 1017 uint32_t MacroDirectivesOffset = 1018 endian::readNext<uint32_t, little, unaligned>(d); 1019 DataLen -= 4; 1020 1021 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 1022 } 1023 1024 Reader.SetIdentifierInfo(ID, II); 1025 1026 // Read all of the declarations visible at global scope with this 1027 // name. 1028 if (DataLen > 0) { 1029 SmallVector<uint32_t, 4> DeclIDs; 1030 for (; DataLen > 0; DataLen -= 4) 1031 DeclIDs.push_back(Reader.getGlobalDeclID( 1032 F, endian::readNext<uint32_t, little, unaligned>(d))); 1033 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1034 } 1035 1036 return II; 1037 } 1038 1039 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1040 : Kind(Name.getNameKind()) { 1041 switch (Kind) { 1042 case DeclarationName::Identifier: 1043 Data = (uint64_t)Name.getAsIdentifierInfo(); 1044 break; 1045 case DeclarationName::ObjCZeroArgSelector: 1046 case DeclarationName::ObjCOneArgSelector: 1047 case DeclarationName::ObjCMultiArgSelector: 1048 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1049 break; 1050 case DeclarationName::CXXOperatorName: 1051 Data = Name.getCXXOverloadedOperator(); 1052 break; 1053 case DeclarationName::CXXLiteralOperatorName: 1054 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1055 break; 1056 case DeclarationName::CXXDeductionGuideName: 1057 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1058 ->getDeclName().getAsIdentifierInfo(); 1059 break; 1060 case DeclarationName::CXXConstructorName: 1061 case DeclarationName::CXXDestructorName: 1062 case DeclarationName::CXXConversionFunctionName: 1063 case DeclarationName::CXXUsingDirective: 1064 Data = 0; 1065 break; 1066 } 1067 } 1068 1069 unsigned DeclarationNameKey::getHash() const { 1070 llvm::FoldingSetNodeID ID; 1071 ID.AddInteger(Kind); 1072 1073 switch (Kind) { 1074 case DeclarationName::Identifier: 1075 case DeclarationName::CXXLiteralOperatorName: 1076 case DeclarationName::CXXDeductionGuideName: 1077 ID.AddString(((IdentifierInfo*)Data)->getName()); 1078 break; 1079 case DeclarationName::ObjCZeroArgSelector: 1080 case DeclarationName::ObjCOneArgSelector: 1081 case DeclarationName::ObjCMultiArgSelector: 1082 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1083 break; 1084 case DeclarationName::CXXOperatorName: 1085 ID.AddInteger((OverloadedOperatorKind)Data); 1086 break; 1087 case DeclarationName::CXXConstructorName: 1088 case DeclarationName::CXXDestructorName: 1089 case DeclarationName::CXXConversionFunctionName: 1090 case DeclarationName::CXXUsingDirective: 1091 break; 1092 } 1093 1094 return ID.ComputeHash(); 1095 } 1096 1097 ModuleFile * 1098 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1099 using namespace llvm::support; 1100 1101 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1102 return Reader.getLocalModuleFile(F, ModuleFileID); 1103 } 1104 1105 std::pair<unsigned, unsigned> 1106 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1107 return readULEBKeyDataLength(d); 1108 } 1109 1110 ASTDeclContextNameLookupTrait::internal_key_type 1111 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1112 using namespace llvm::support; 1113 1114 auto Kind = (DeclarationName::NameKind)*d++; 1115 uint64_t Data; 1116 switch (Kind) { 1117 case DeclarationName::Identifier: 1118 case DeclarationName::CXXLiteralOperatorName: 1119 case DeclarationName::CXXDeductionGuideName: 1120 Data = (uint64_t)Reader.getLocalIdentifier( 1121 F, endian::readNext<uint32_t, little, unaligned>(d)); 1122 break; 1123 case DeclarationName::ObjCZeroArgSelector: 1124 case DeclarationName::ObjCOneArgSelector: 1125 case DeclarationName::ObjCMultiArgSelector: 1126 Data = 1127 (uint64_t)Reader.getLocalSelector( 1128 F, endian::readNext<uint32_t, little, unaligned>( 1129 d)).getAsOpaquePtr(); 1130 break; 1131 case DeclarationName::CXXOperatorName: 1132 Data = *d++; // OverloadedOperatorKind 1133 break; 1134 case DeclarationName::CXXConstructorName: 1135 case DeclarationName::CXXDestructorName: 1136 case DeclarationName::CXXConversionFunctionName: 1137 case DeclarationName::CXXUsingDirective: 1138 Data = 0; 1139 break; 1140 } 1141 1142 return DeclarationNameKey(Kind, Data); 1143 } 1144 1145 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1146 const unsigned char *d, 1147 unsigned DataLen, 1148 data_type_builder &Val) { 1149 using namespace llvm::support; 1150 1151 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1152 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1153 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1154 } 1155 } 1156 1157 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1158 BitstreamCursor &Cursor, 1159 uint64_t Offset, 1160 DeclContext *DC) { 1161 assert(Offset != 0); 1162 1163 SavedStreamPosition SavedPosition(Cursor); 1164 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1165 Error(std::move(Err)); 1166 return true; 1167 } 1168 1169 RecordData Record; 1170 StringRef Blob; 1171 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1172 if (!MaybeCode) { 1173 Error(MaybeCode.takeError()); 1174 return true; 1175 } 1176 unsigned Code = MaybeCode.get(); 1177 1178 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1179 if (!MaybeRecCode) { 1180 Error(MaybeRecCode.takeError()); 1181 return true; 1182 } 1183 unsigned RecCode = MaybeRecCode.get(); 1184 if (RecCode != DECL_CONTEXT_LEXICAL) { 1185 Error("Expected lexical block"); 1186 return true; 1187 } 1188 1189 assert(!isa<TranslationUnitDecl>(DC) && 1190 "expected a TU_UPDATE_LEXICAL record for TU"); 1191 // If we are handling a C++ class template instantiation, we can see multiple 1192 // lexical updates for the same record. It's important that we select only one 1193 // of them, so that field numbering works properly. Just pick the first one we 1194 // see. 1195 auto &Lex = LexicalDecls[DC]; 1196 if (!Lex.first) { 1197 Lex = std::make_pair( 1198 &M, llvm::makeArrayRef( 1199 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1200 Blob.data()), 1201 Blob.size() / 4)); 1202 } 1203 DC->setHasExternalLexicalStorage(true); 1204 return false; 1205 } 1206 1207 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1208 BitstreamCursor &Cursor, 1209 uint64_t Offset, 1210 DeclID ID) { 1211 assert(Offset != 0); 1212 1213 SavedStreamPosition SavedPosition(Cursor); 1214 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1215 Error(std::move(Err)); 1216 return true; 1217 } 1218 1219 RecordData Record; 1220 StringRef Blob; 1221 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1222 if (!MaybeCode) { 1223 Error(MaybeCode.takeError()); 1224 return true; 1225 } 1226 unsigned Code = MaybeCode.get(); 1227 1228 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1229 if (!MaybeRecCode) { 1230 Error(MaybeRecCode.takeError()); 1231 return true; 1232 } 1233 unsigned RecCode = MaybeRecCode.get(); 1234 if (RecCode != DECL_CONTEXT_VISIBLE) { 1235 Error("Expected visible lookup table block"); 1236 return true; 1237 } 1238 1239 // We can't safely determine the primary context yet, so delay attaching the 1240 // lookup table until we're done with recursive deserialization. 1241 auto *Data = (const unsigned char*)Blob.data(); 1242 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1243 return false; 1244 } 1245 1246 void ASTReader::Error(StringRef Msg) const { 1247 Error(diag::err_fe_pch_malformed, Msg); 1248 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1249 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1250 Diag(diag::note_module_cache_path) 1251 << PP.getHeaderSearchInfo().getModuleCachePath(); 1252 } 1253 } 1254 1255 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1256 StringRef Arg3) const { 1257 if (Diags.isDiagnosticInFlight()) 1258 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3); 1259 else 1260 Diag(DiagID) << Arg1 << Arg2 << Arg3; 1261 } 1262 1263 void ASTReader::Error(llvm::Error &&Err) const { 1264 Error(toString(std::move(Err))); 1265 } 1266 1267 //===----------------------------------------------------------------------===// 1268 // Source Manager Deserialization 1269 //===----------------------------------------------------------------------===// 1270 1271 /// Read the line table in the source manager block. 1272 /// \returns true if there was an error. 1273 bool ASTReader::ParseLineTable(ModuleFile &F, 1274 const RecordData &Record) { 1275 unsigned Idx = 0; 1276 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1277 1278 // Parse the file names 1279 std::map<int, int> FileIDs; 1280 FileIDs[-1] = -1; // For unspecified filenames. 1281 for (unsigned I = 0; Record[Idx]; ++I) { 1282 // Extract the file name 1283 auto Filename = ReadPath(F, Record, Idx); 1284 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1285 } 1286 ++Idx; 1287 1288 // Parse the line entries 1289 std::vector<LineEntry> Entries; 1290 while (Idx < Record.size()) { 1291 int FID = Record[Idx++]; 1292 assert(FID >= 0 && "Serialized line entries for non-local file."); 1293 // Remap FileID from 1-based old view. 1294 FID += F.SLocEntryBaseID - 1; 1295 1296 // Extract the line entries 1297 unsigned NumEntries = Record[Idx++]; 1298 assert(NumEntries && "no line entries for file ID"); 1299 Entries.clear(); 1300 Entries.reserve(NumEntries); 1301 for (unsigned I = 0; I != NumEntries; ++I) { 1302 unsigned FileOffset = Record[Idx++]; 1303 unsigned LineNo = Record[Idx++]; 1304 int FilenameID = FileIDs[Record[Idx++]]; 1305 SrcMgr::CharacteristicKind FileKind 1306 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1307 unsigned IncludeOffset = Record[Idx++]; 1308 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1309 FileKind, IncludeOffset)); 1310 } 1311 LineTable.AddEntry(FileID::get(FID), Entries); 1312 } 1313 1314 return false; 1315 } 1316 1317 /// Read a source manager block 1318 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1319 using namespace SrcMgr; 1320 1321 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1322 1323 // Set the source-location entry cursor to the current position in 1324 // the stream. This cursor will be used to read the contents of the 1325 // source manager block initially, and then lazily read 1326 // source-location entries as needed. 1327 SLocEntryCursor = F.Stream; 1328 1329 // The stream itself is going to skip over the source manager block. 1330 if (llvm::Error Err = F.Stream.SkipBlock()) { 1331 Error(std::move(Err)); 1332 return true; 1333 } 1334 1335 // Enter the source manager block. 1336 if (llvm::Error Err = 1337 SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 1338 Error(std::move(Err)); 1339 return true; 1340 } 1341 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo(); 1342 1343 RecordData Record; 1344 while (true) { 1345 Expected<llvm::BitstreamEntry> MaybeE = 1346 SLocEntryCursor.advanceSkippingSubblocks(); 1347 if (!MaybeE) { 1348 Error(MaybeE.takeError()); 1349 return true; 1350 } 1351 llvm::BitstreamEntry E = MaybeE.get(); 1352 1353 switch (E.Kind) { 1354 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1355 case llvm::BitstreamEntry::Error: 1356 Error("malformed block record in AST file"); 1357 return true; 1358 case llvm::BitstreamEntry::EndBlock: 1359 return false; 1360 case llvm::BitstreamEntry::Record: 1361 // The interesting case. 1362 break; 1363 } 1364 1365 // Read a record. 1366 Record.clear(); 1367 StringRef Blob; 1368 Expected<unsigned> MaybeRecord = 1369 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1370 if (!MaybeRecord) { 1371 Error(MaybeRecord.takeError()); 1372 return true; 1373 } 1374 switch (MaybeRecord.get()) { 1375 default: // Default behavior: ignore. 1376 break; 1377 1378 case SM_SLOC_FILE_ENTRY: 1379 case SM_SLOC_BUFFER_ENTRY: 1380 case SM_SLOC_EXPANSION_ENTRY: 1381 // Once we hit one of the source location entries, we're done. 1382 return false; 1383 } 1384 } 1385 } 1386 1387 /// If a header file is not found at the path that we expect it to be 1388 /// and the PCH file was moved from its original location, try to resolve the 1389 /// file by assuming that header+PCH were moved together and the header is in 1390 /// the same place relative to the PCH. 1391 static std::string 1392 resolveFileRelativeToOriginalDir(const std::string &Filename, 1393 const std::string &OriginalDir, 1394 const std::string &CurrDir) { 1395 assert(OriginalDir != CurrDir && 1396 "No point trying to resolve the file if the PCH dir didn't change"); 1397 1398 using namespace llvm::sys; 1399 1400 SmallString<128> filePath(Filename); 1401 fs::make_absolute(filePath); 1402 assert(path::is_absolute(OriginalDir)); 1403 SmallString<128> currPCHPath(CurrDir); 1404 1405 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1406 fileDirE = path::end(path::parent_path(filePath)); 1407 path::const_iterator origDirI = path::begin(OriginalDir), 1408 origDirE = path::end(OriginalDir); 1409 // Skip the common path components from filePath and OriginalDir. 1410 while (fileDirI != fileDirE && origDirI != origDirE && 1411 *fileDirI == *origDirI) { 1412 ++fileDirI; 1413 ++origDirI; 1414 } 1415 for (; origDirI != origDirE; ++origDirI) 1416 path::append(currPCHPath, ".."); 1417 path::append(currPCHPath, fileDirI, fileDirE); 1418 path::append(currPCHPath, path::filename(Filename)); 1419 return std::string(currPCHPath.str()); 1420 } 1421 1422 bool ASTReader::ReadSLocEntry(int ID) { 1423 if (ID == 0) 1424 return false; 1425 1426 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1427 Error("source location entry ID out-of-range for AST file"); 1428 return true; 1429 } 1430 1431 // Local helper to read the (possibly-compressed) buffer data following the 1432 // entry record. 1433 auto ReadBuffer = [this]( 1434 BitstreamCursor &SLocEntryCursor, 1435 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1436 RecordData Record; 1437 StringRef Blob; 1438 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1439 if (!MaybeCode) { 1440 Error(MaybeCode.takeError()); 1441 return nullptr; 1442 } 1443 unsigned Code = MaybeCode.get(); 1444 1445 Expected<unsigned> MaybeRecCode = 1446 SLocEntryCursor.readRecord(Code, Record, &Blob); 1447 if (!MaybeRecCode) { 1448 Error(MaybeRecCode.takeError()); 1449 return nullptr; 1450 } 1451 unsigned RecCode = MaybeRecCode.get(); 1452 1453 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1454 if (!llvm::zlib::isAvailable()) { 1455 Error("zlib is not available"); 1456 return nullptr; 1457 } 1458 SmallString<0> Uncompressed; 1459 if (llvm::Error E = 1460 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1461 Error("could not decompress embedded file contents: " + 1462 llvm::toString(std::move(E))); 1463 return nullptr; 1464 } 1465 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1466 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1467 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1468 } else { 1469 Error("AST record has invalid code"); 1470 return nullptr; 1471 } 1472 }; 1473 1474 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1475 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1476 F->SLocEntryOffsetsBase + 1477 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1478 Error(std::move(Err)); 1479 return true; 1480 } 1481 1482 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1483 unsigned BaseOffset = F->SLocEntryBaseOffset; 1484 1485 ++NumSLocEntriesRead; 1486 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1487 if (!MaybeEntry) { 1488 Error(MaybeEntry.takeError()); 1489 return true; 1490 } 1491 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1492 1493 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1494 Error("incorrectly-formatted source location entry in AST file"); 1495 return true; 1496 } 1497 1498 RecordData Record; 1499 StringRef Blob; 1500 Expected<unsigned> MaybeSLOC = 1501 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1502 if (!MaybeSLOC) { 1503 Error(MaybeSLOC.takeError()); 1504 return true; 1505 } 1506 switch (MaybeSLOC.get()) { 1507 default: 1508 Error("incorrectly-formatted source location entry in AST file"); 1509 return true; 1510 1511 case SM_SLOC_FILE_ENTRY: { 1512 // We will detect whether a file changed and return 'Failure' for it, but 1513 // we will also try to fail gracefully by setting up the SLocEntry. 1514 unsigned InputID = Record[4]; 1515 InputFile IF = getInputFile(*F, InputID); 1516 Optional<FileEntryRef> File = IF.getFile(); 1517 bool OverriddenBuffer = IF.isOverridden(); 1518 1519 // Note that we only check if a File was returned. If it was out-of-date 1520 // we have complained but we will continue creating a FileID to recover 1521 // gracefully. 1522 if (!File) 1523 return true; 1524 1525 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1526 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1527 // This is the module's main file. 1528 IncludeLoc = getImportLocation(F); 1529 } 1530 SrcMgr::CharacteristicKind 1531 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1532 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID, 1533 BaseOffset + Record[0]); 1534 SrcMgr::FileInfo &FileInfo = 1535 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1536 FileInfo.NumCreatedFIDs = Record[5]; 1537 if (Record[3]) 1538 FileInfo.setHasLineDirectives(); 1539 1540 unsigned NumFileDecls = Record[7]; 1541 if (NumFileDecls && ContextObj) { 1542 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1543 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1544 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1545 NumFileDecls)); 1546 } 1547 1548 const SrcMgr::ContentCache &ContentCache = 1549 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter)); 1550 if (OverriddenBuffer && !ContentCache.BufferOverridden && 1551 ContentCache.ContentsEntry == ContentCache.OrigEntry && 1552 !ContentCache.getBufferIfLoaded()) { 1553 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1554 if (!Buffer) 1555 return true; 1556 SourceMgr.overrideFileContents(*File, std::move(Buffer)); 1557 } 1558 1559 break; 1560 } 1561 1562 case SM_SLOC_BUFFER_ENTRY: { 1563 const char *Name = Blob.data(); 1564 unsigned Offset = Record[0]; 1565 SrcMgr::CharacteristicKind 1566 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1567 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1568 if (IncludeLoc.isInvalid() && F->isModule()) { 1569 IncludeLoc = getImportLocation(F); 1570 } 1571 1572 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1573 if (!Buffer) 1574 return true; 1575 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1576 BaseOffset + Offset, IncludeLoc); 1577 break; 1578 } 1579 1580 case SM_SLOC_EXPANSION_ENTRY: { 1581 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1582 SourceMgr.createExpansionLoc(SpellingLoc, 1583 ReadSourceLocation(*F, Record[2]), 1584 ReadSourceLocation(*F, Record[3]), 1585 Record[5], 1586 Record[4], 1587 ID, 1588 BaseOffset + Record[0]); 1589 break; 1590 } 1591 } 1592 1593 return false; 1594 } 1595 1596 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1597 if (ID == 0) 1598 return std::make_pair(SourceLocation(), ""); 1599 1600 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1601 Error("source location entry ID out-of-range for AST file"); 1602 return std::make_pair(SourceLocation(), ""); 1603 } 1604 1605 // Find which module file this entry lands in. 1606 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1607 if (!M->isModule()) 1608 return std::make_pair(SourceLocation(), ""); 1609 1610 // FIXME: Can we map this down to a particular submodule? That would be 1611 // ideal. 1612 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1613 } 1614 1615 /// Find the location where the module F is imported. 1616 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1617 if (F->ImportLoc.isValid()) 1618 return F->ImportLoc; 1619 1620 // Otherwise we have a PCH. It's considered to be "imported" at the first 1621 // location of its includer. 1622 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1623 // Main file is the importer. 1624 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1625 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1626 } 1627 return F->ImportedBy[0]->FirstLoc; 1628 } 1629 1630 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1631 /// the abbreviations that are at the top of the block and then leave the cursor 1632 /// pointing into the block. 1633 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID, 1634 uint64_t *StartOfBlockOffset) { 1635 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 1636 // FIXME this drops errors on the floor. 1637 consumeError(std::move(Err)); 1638 return true; 1639 } 1640 1641 if (StartOfBlockOffset) 1642 *StartOfBlockOffset = Cursor.GetCurrentBitNo(); 1643 1644 while (true) { 1645 uint64_t Offset = Cursor.GetCurrentBitNo(); 1646 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1647 if (!MaybeCode) { 1648 // FIXME this drops errors on the floor. 1649 consumeError(MaybeCode.takeError()); 1650 return true; 1651 } 1652 unsigned Code = MaybeCode.get(); 1653 1654 // We expect all abbrevs to be at the start of the block. 1655 if (Code != llvm::bitc::DEFINE_ABBREV) { 1656 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1657 // FIXME this drops errors on the floor. 1658 consumeError(std::move(Err)); 1659 return true; 1660 } 1661 return false; 1662 } 1663 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) { 1664 // FIXME this drops errors on the floor. 1665 consumeError(std::move(Err)); 1666 return true; 1667 } 1668 } 1669 } 1670 1671 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1672 unsigned &Idx) { 1673 Token Tok; 1674 Tok.startToken(); 1675 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1676 Tok.setLength(Record[Idx++]); 1677 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1678 Tok.setIdentifierInfo(II); 1679 Tok.setKind((tok::TokenKind)Record[Idx++]); 1680 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1681 return Tok; 1682 } 1683 1684 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1685 BitstreamCursor &Stream = F.MacroCursor; 1686 1687 // Keep track of where we are in the stream, then jump back there 1688 // after reading this macro. 1689 SavedStreamPosition SavedPosition(Stream); 1690 1691 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1692 // FIXME this drops errors on the floor. 1693 consumeError(std::move(Err)); 1694 return nullptr; 1695 } 1696 RecordData Record; 1697 SmallVector<IdentifierInfo*, 16> MacroParams; 1698 MacroInfo *Macro = nullptr; 1699 1700 while (true) { 1701 // Advance to the next record, but if we get to the end of the block, don't 1702 // pop it (removing all the abbreviations from the cursor) since we want to 1703 // be able to reseek within the block and read entries. 1704 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1705 Expected<llvm::BitstreamEntry> MaybeEntry = 1706 Stream.advanceSkippingSubblocks(Flags); 1707 if (!MaybeEntry) { 1708 Error(MaybeEntry.takeError()); 1709 return Macro; 1710 } 1711 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1712 1713 switch (Entry.Kind) { 1714 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1715 case llvm::BitstreamEntry::Error: 1716 Error("malformed block record in AST file"); 1717 return Macro; 1718 case llvm::BitstreamEntry::EndBlock: 1719 return Macro; 1720 case llvm::BitstreamEntry::Record: 1721 // The interesting case. 1722 break; 1723 } 1724 1725 // Read a record. 1726 Record.clear(); 1727 PreprocessorRecordTypes RecType; 1728 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1729 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1730 else { 1731 Error(MaybeRecType.takeError()); 1732 return Macro; 1733 } 1734 switch (RecType) { 1735 case PP_MODULE_MACRO: 1736 case PP_MACRO_DIRECTIVE_HISTORY: 1737 return Macro; 1738 1739 case PP_MACRO_OBJECT_LIKE: 1740 case PP_MACRO_FUNCTION_LIKE: { 1741 // If we already have a macro, that means that we've hit the end 1742 // of the definition of the macro we were looking for. We're 1743 // done. 1744 if (Macro) 1745 return Macro; 1746 1747 unsigned NextIndex = 1; // Skip identifier ID. 1748 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1749 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1750 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1751 MI->setIsUsed(Record[NextIndex++]); 1752 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1753 1754 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1755 // Decode function-like macro info. 1756 bool isC99VarArgs = Record[NextIndex++]; 1757 bool isGNUVarArgs = Record[NextIndex++]; 1758 bool hasCommaPasting = Record[NextIndex++]; 1759 MacroParams.clear(); 1760 unsigned NumArgs = Record[NextIndex++]; 1761 for (unsigned i = 0; i != NumArgs; ++i) 1762 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1763 1764 // Install function-like macro info. 1765 MI->setIsFunctionLike(); 1766 if (isC99VarArgs) MI->setIsC99Varargs(); 1767 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1768 if (hasCommaPasting) MI->setHasCommaPasting(); 1769 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1770 } 1771 1772 // Remember that we saw this macro last so that we add the tokens that 1773 // form its body to it. 1774 Macro = MI; 1775 1776 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1777 Record[NextIndex]) { 1778 // We have a macro definition. Register the association 1779 PreprocessedEntityID 1780 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1781 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1782 PreprocessingRecord::PPEntityID PPID = 1783 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1784 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1785 PPRec.getPreprocessedEntity(PPID)); 1786 if (PPDef) 1787 PPRec.RegisterMacroDefinition(Macro, PPDef); 1788 } 1789 1790 ++NumMacrosRead; 1791 break; 1792 } 1793 1794 case PP_TOKEN: { 1795 // If we see a TOKEN before a PP_MACRO_*, then the file is 1796 // erroneous, just pretend we didn't see this. 1797 if (!Macro) break; 1798 1799 unsigned Idx = 0; 1800 Token Tok = ReadToken(F, Record, Idx); 1801 Macro->AddTokenToBody(Tok); 1802 break; 1803 } 1804 } 1805 } 1806 } 1807 1808 PreprocessedEntityID 1809 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1810 unsigned LocalID) const { 1811 if (!M.ModuleOffsetMap.empty()) 1812 ReadModuleOffsetMap(M); 1813 1814 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1815 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1816 assert(I != M.PreprocessedEntityRemap.end() 1817 && "Invalid index into preprocessed entity index remap"); 1818 1819 return LocalID + I->second; 1820 } 1821 1822 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1823 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1824 } 1825 1826 HeaderFileInfoTrait::internal_key_type 1827 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1828 internal_key_type ikey = {FE->getSize(), 1829 M.HasTimestamps ? FE->getModificationTime() : 0, 1830 FE->getName(), /*Imported*/ false}; 1831 return ikey; 1832 } 1833 1834 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1835 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1836 return false; 1837 1838 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1839 return true; 1840 1841 // Determine whether the actual files are equivalent. 1842 FileManager &FileMgr = Reader.getFileManager(); 1843 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1844 if (!Key.Imported) { 1845 if (auto File = FileMgr.getFile(Key.Filename)) 1846 return *File; 1847 return nullptr; 1848 } 1849 1850 std::string Resolved = std::string(Key.Filename); 1851 Reader.ResolveImportedPath(M, Resolved); 1852 if (auto File = FileMgr.getFile(Resolved)) 1853 return *File; 1854 return nullptr; 1855 }; 1856 1857 const FileEntry *FEA = GetFile(a); 1858 const FileEntry *FEB = GetFile(b); 1859 return FEA && FEA == FEB; 1860 } 1861 1862 std::pair<unsigned, unsigned> 1863 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1864 return readULEBKeyDataLength(d); 1865 } 1866 1867 HeaderFileInfoTrait::internal_key_type 1868 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1869 using namespace llvm::support; 1870 1871 internal_key_type ikey; 1872 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1873 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1874 ikey.Filename = (const char *)d; 1875 ikey.Imported = true; 1876 return ikey; 1877 } 1878 1879 HeaderFileInfoTrait::data_type 1880 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1881 unsigned DataLen) { 1882 using namespace llvm::support; 1883 1884 const unsigned char *End = d + DataLen; 1885 HeaderFileInfo HFI; 1886 unsigned Flags = *d++; 1887 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1888 HFI.isImport |= (Flags >> 5) & 0x01; 1889 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1890 HFI.DirInfo = (Flags >> 1) & 0x07; 1891 HFI.IndexHeaderMapHeader = Flags & 0x01; 1892 // FIXME: Find a better way to handle this. Maybe just store a 1893 // "has been included" flag? 1894 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1895 HFI.NumIncludes); 1896 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1897 M, endian::readNext<uint32_t, little, unaligned>(d)); 1898 if (unsigned FrameworkOffset = 1899 endian::readNext<uint32_t, little, unaligned>(d)) { 1900 // The framework offset is 1 greater than the actual offset, 1901 // since 0 is used as an indicator for "no framework name". 1902 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1903 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1904 } 1905 1906 assert((End - d) % 4 == 0 && 1907 "Wrong data length in HeaderFileInfo deserialization"); 1908 while (d != End) { 1909 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1910 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1911 LocalSMID >>= 2; 1912 1913 // This header is part of a module. Associate it with the module to enable 1914 // implicit module import. 1915 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1916 Module *Mod = Reader.getSubmodule(GlobalSMID); 1917 FileManager &FileMgr = Reader.getFileManager(); 1918 ModuleMap &ModMap = 1919 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1920 1921 std::string Filename = std::string(key.Filename); 1922 if (key.Imported) 1923 Reader.ResolveImportedPath(M, Filename); 1924 // FIXME: This is not always the right filename-as-written, but we're not 1925 // going to use this information to rebuild the module, so it doesn't make 1926 // a lot of difference. 1927 Module::Header H = {std::string(key.Filename), *FileMgr.getFile(Filename)}; 1928 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1929 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1930 } 1931 1932 // This HeaderFileInfo was externally loaded. 1933 HFI.External = true; 1934 HFI.IsValid = true; 1935 return HFI; 1936 } 1937 1938 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1939 uint32_t MacroDirectivesOffset) { 1940 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1941 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1942 } 1943 1944 void ASTReader::ReadDefinedMacros() { 1945 // Note that we are loading defined macros. 1946 Deserializing Macros(this); 1947 1948 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1949 BitstreamCursor &MacroCursor = I.MacroCursor; 1950 1951 // If there was no preprocessor block, skip this file. 1952 if (MacroCursor.getBitcodeBytes().empty()) 1953 continue; 1954 1955 BitstreamCursor Cursor = MacroCursor; 1956 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1957 Error(std::move(Err)); 1958 return; 1959 } 1960 1961 RecordData Record; 1962 while (true) { 1963 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1964 if (!MaybeE) { 1965 Error(MaybeE.takeError()); 1966 return; 1967 } 1968 llvm::BitstreamEntry E = MaybeE.get(); 1969 1970 switch (E.Kind) { 1971 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1972 case llvm::BitstreamEntry::Error: 1973 Error("malformed block record in AST file"); 1974 return; 1975 case llvm::BitstreamEntry::EndBlock: 1976 goto NextCursor; 1977 1978 case llvm::BitstreamEntry::Record: { 1979 Record.clear(); 1980 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1981 if (!MaybeRecord) { 1982 Error(MaybeRecord.takeError()); 1983 return; 1984 } 1985 switch (MaybeRecord.get()) { 1986 default: // Default behavior: ignore. 1987 break; 1988 1989 case PP_MACRO_OBJECT_LIKE: 1990 case PP_MACRO_FUNCTION_LIKE: { 1991 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1992 if (II->isOutOfDate()) 1993 updateOutOfDateIdentifier(*II); 1994 break; 1995 } 1996 1997 case PP_TOKEN: 1998 // Ignore tokens. 1999 break; 2000 } 2001 break; 2002 } 2003 } 2004 } 2005 NextCursor: ; 2006 } 2007 } 2008 2009 namespace { 2010 2011 /// Visitor class used to look up identifirs in an AST file. 2012 class IdentifierLookupVisitor { 2013 StringRef Name; 2014 unsigned NameHash; 2015 unsigned PriorGeneration; 2016 unsigned &NumIdentifierLookups; 2017 unsigned &NumIdentifierLookupHits; 2018 IdentifierInfo *Found = nullptr; 2019 2020 public: 2021 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2022 unsigned &NumIdentifierLookups, 2023 unsigned &NumIdentifierLookupHits) 2024 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2025 PriorGeneration(PriorGeneration), 2026 NumIdentifierLookups(NumIdentifierLookups), 2027 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2028 2029 bool operator()(ModuleFile &M) { 2030 // If we've already searched this module file, skip it now. 2031 if (M.Generation <= PriorGeneration) 2032 return true; 2033 2034 ASTIdentifierLookupTable *IdTable 2035 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2036 if (!IdTable) 2037 return false; 2038 2039 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2040 Found); 2041 ++NumIdentifierLookups; 2042 ASTIdentifierLookupTable::iterator Pos = 2043 IdTable->find_hashed(Name, NameHash, &Trait); 2044 if (Pos == IdTable->end()) 2045 return false; 2046 2047 // Dereferencing the iterator has the effect of building the 2048 // IdentifierInfo node and populating it with the various 2049 // declarations it needs. 2050 ++NumIdentifierLookupHits; 2051 Found = *Pos; 2052 return true; 2053 } 2054 2055 // Retrieve the identifier info found within the module 2056 // files. 2057 IdentifierInfo *getIdentifierInfo() const { return Found; } 2058 }; 2059 2060 } // namespace 2061 2062 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2063 // Note that we are loading an identifier. 2064 Deserializing AnIdentifier(this); 2065 2066 unsigned PriorGeneration = 0; 2067 if (getContext().getLangOpts().Modules) 2068 PriorGeneration = IdentifierGeneration[&II]; 2069 2070 // If there is a global index, look there first to determine which modules 2071 // provably do not have any results for this identifier. 2072 GlobalModuleIndex::HitSet Hits; 2073 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2074 if (!loadGlobalIndex()) { 2075 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2076 HitsPtr = &Hits; 2077 } 2078 } 2079 2080 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2081 NumIdentifierLookups, 2082 NumIdentifierLookupHits); 2083 ModuleMgr.visit(Visitor, HitsPtr); 2084 markIdentifierUpToDate(&II); 2085 } 2086 2087 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2088 if (!II) 2089 return; 2090 2091 II->setOutOfDate(false); 2092 2093 // Update the generation for this identifier. 2094 if (getContext().getLangOpts().Modules) 2095 IdentifierGeneration[II] = getGeneration(); 2096 } 2097 2098 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2099 const PendingMacroInfo &PMInfo) { 2100 ModuleFile &M = *PMInfo.M; 2101 2102 BitstreamCursor &Cursor = M.MacroCursor; 2103 SavedStreamPosition SavedPosition(Cursor); 2104 if (llvm::Error Err = 2105 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2106 Error(std::move(Err)); 2107 return; 2108 } 2109 2110 struct ModuleMacroRecord { 2111 SubmoduleID SubModID; 2112 MacroInfo *MI; 2113 SmallVector<SubmoduleID, 8> Overrides; 2114 }; 2115 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2116 2117 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2118 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2119 // macro histroy. 2120 RecordData Record; 2121 while (true) { 2122 Expected<llvm::BitstreamEntry> MaybeEntry = 2123 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2124 if (!MaybeEntry) { 2125 Error(MaybeEntry.takeError()); 2126 return; 2127 } 2128 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2129 2130 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2131 Error("malformed block record in AST file"); 2132 return; 2133 } 2134 2135 Record.clear(); 2136 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2137 if (!MaybePP) { 2138 Error(MaybePP.takeError()); 2139 return; 2140 } 2141 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2142 case PP_MACRO_DIRECTIVE_HISTORY: 2143 break; 2144 2145 case PP_MODULE_MACRO: { 2146 ModuleMacros.push_back(ModuleMacroRecord()); 2147 auto &Info = ModuleMacros.back(); 2148 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2149 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2150 for (int I = 2, N = Record.size(); I != N; ++I) 2151 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2152 continue; 2153 } 2154 2155 default: 2156 Error("malformed block record in AST file"); 2157 return; 2158 } 2159 2160 // We found the macro directive history; that's the last record 2161 // for this macro. 2162 break; 2163 } 2164 2165 // Module macros are listed in reverse dependency order. 2166 { 2167 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2168 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2169 for (auto &MMR : ModuleMacros) { 2170 Overrides.clear(); 2171 for (unsigned ModID : MMR.Overrides) { 2172 Module *Mod = getSubmodule(ModID); 2173 auto *Macro = PP.getModuleMacro(Mod, II); 2174 assert(Macro && "missing definition for overridden macro"); 2175 Overrides.push_back(Macro); 2176 } 2177 2178 bool Inserted = false; 2179 Module *Owner = getSubmodule(MMR.SubModID); 2180 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2181 } 2182 } 2183 2184 // Don't read the directive history for a module; we don't have anywhere 2185 // to put it. 2186 if (M.isModule()) 2187 return; 2188 2189 // Deserialize the macro directives history in reverse source-order. 2190 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2191 unsigned Idx = 0, N = Record.size(); 2192 while (Idx < N) { 2193 MacroDirective *MD = nullptr; 2194 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2195 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2196 switch (K) { 2197 case MacroDirective::MD_Define: { 2198 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2199 MD = PP.AllocateDefMacroDirective(MI, Loc); 2200 break; 2201 } 2202 case MacroDirective::MD_Undefine: 2203 MD = PP.AllocateUndefMacroDirective(Loc); 2204 break; 2205 case MacroDirective::MD_Visibility: 2206 bool isPublic = Record[Idx++]; 2207 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2208 break; 2209 } 2210 2211 if (!Latest) 2212 Latest = MD; 2213 if (Earliest) 2214 Earliest->setPrevious(MD); 2215 Earliest = MD; 2216 } 2217 2218 if (Latest) 2219 PP.setLoadedMacroDirective(II, Earliest, Latest); 2220 } 2221 2222 bool ASTReader::shouldDisableValidationForFile( 2223 const serialization::ModuleFile &M) const { 2224 if (DisableValidationKind == DisableValidationForModuleKind::None) 2225 return false; 2226 2227 // If a PCH is loaded and validation is disabled for PCH then disable 2228 // validation for the PCH and the modules it loads. 2229 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind); 2230 2231 switch (K) { 2232 case MK_MainFile: 2233 case MK_Preamble: 2234 case MK_PCH: 2235 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH); 2236 case MK_ImplicitModule: 2237 case MK_ExplicitModule: 2238 case MK_PrebuiltModule: 2239 return bool(DisableValidationKind & DisableValidationForModuleKind::Module); 2240 } 2241 2242 return false; 2243 } 2244 2245 ASTReader::InputFileInfo 2246 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2247 // Go find this input file. 2248 BitstreamCursor &Cursor = F.InputFilesCursor; 2249 SavedStreamPosition SavedPosition(Cursor); 2250 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2251 // FIXME this drops errors on the floor. 2252 consumeError(std::move(Err)); 2253 } 2254 2255 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2256 if (!MaybeCode) { 2257 // FIXME this drops errors on the floor. 2258 consumeError(MaybeCode.takeError()); 2259 } 2260 unsigned Code = MaybeCode.get(); 2261 RecordData Record; 2262 StringRef Blob; 2263 2264 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2265 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2266 "invalid record type for input file"); 2267 else { 2268 // FIXME this drops errors on the floor. 2269 consumeError(Maybe.takeError()); 2270 } 2271 2272 assert(Record[0] == ID && "Bogus stored ID or offset"); 2273 InputFileInfo R; 2274 R.StoredSize = static_cast<off_t>(Record[1]); 2275 R.StoredTime = static_cast<time_t>(Record[2]); 2276 R.Overridden = static_cast<bool>(Record[3]); 2277 R.Transient = static_cast<bool>(Record[4]); 2278 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2279 R.Filename = std::string(Blob); 2280 ResolveImportedPath(F, R.Filename); 2281 2282 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2283 if (!MaybeEntry) // FIXME this drops errors on the floor. 2284 consumeError(MaybeEntry.takeError()); 2285 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2286 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2287 "expected record type for input file hash"); 2288 2289 Record.clear(); 2290 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2291 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2292 "invalid record type for input file hash"); 2293 else { 2294 // FIXME this drops errors on the floor. 2295 consumeError(Maybe.takeError()); 2296 } 2297 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2298 static_cast<uint64_t>(Record[0]); 2299 return R; 2300 } 2301 2302 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2303 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2304 // If this ID is bogus, just return an empty input file. 2305 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2306 return InputFile(); 2307 2308 // If we've already loaded this input file, return it. 2309 if (F.InputFilesLoaded[ID-1].getFile()) 2310 return F.InputFilesLoaded[ID-1]; 2311 2312 if (F.InputFilesLoaded[ID-1].isNotFound()) 2313 return InputFile(); 2314 2315 // Go find this input file. 2316 BitstreamCursor &Cursor = F.InputFilesCursor; 2317 SavedStreamPosition SavedPosition(Cursor); 2318 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2319 // FIXME this drops errors on the floor. 2320 consumeError(std::move(Err)); 2321 } 2322 2323 InputFileInfo FI = readInputFileInfo(F, ID); 2324 off_t StoredSize = FI.StoredSize; 2325 time_t StoredTime = FI.StoredTime; 2326 bool Overridden = FI.Overridden; 2327 bool Transient = FI.Transient; 2328 StringRef Filename = FI.Filename; 2329 uint64_t StoredContentHash = FI.ContentHash; 2330 2331 OptionalFileEntryRefDegradesToFileEntryPtr File = 2332 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false)); 2333 2334 // If we didn't find the file, resolve it relative to the 2335 // original directory from which this AST file was created. 2336 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2337 F.OriginalDir != F.BaseDirectory) { 2338 std::string Resolved = resolveFileRelativeToOriginalDir( 2339 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2340 if (!Resolved.empty()) 2341 File = expectedToOptional(FileMgr.getFileRef(Resolved)); 2342 } 2343 2344 // For an overridden file, create a virtual file with the stored 2345 // size/timestamp. 2346 if ((Overridden || Transient) && !File) 2347 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime); 2348 2349 if (!File) { 2350 if (Complain) { 2351 std::string ErrorStr = "could not find file '"; 2352 ErrorStr += Filename; 2353 ErrorStr += "' referenced by AST file '"; 2354 ErrorStr += F.FileName; 2355 ErrorStr += "'"; 2356 Error(ErrorStr); 2357 } 2358 // Record that we didn't find the file. 2359 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2360 return InputFile(); 2361 } 2362 2363 // Check if there was a request to override the contents of the file 2364 // that was part of the precompiled header. Overriding such a file 2365 // can lead to problems when lexing using the source locations from the 2366 // PCH. 2367 SourceManager &SM = getSourceManager(); 2368 // FIXME: Reject if the overrides are different. 2369 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2370 if (Complain) 2371 Error(diag::err_fe_pch_file_overridden, Filename); 2372 2373 // After emitting the diagnostic, bypass the overriding file to recover 2374 // (this creates a separate FileEntry). 2375 File = SM.bypassFileContentsOverride(*File); 2376 if (!File) { 2377 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2378 return InputFile(); 2379 } 2380 } 2381 2382 enum ModificationType { 2383 Size, 2384 ModTime, 2385 Content, 2386 None, 2387 }; 2388 auto HasInputFileChanged = [&]() { 2389 if (StoredSize != File->getSize()) 2390 return ModificationType::Size; 2391 if (!shouldDisableValidationForFile(F) && StoredTime && 2392 StoredTime != File->getModificationTime()) { 2393 // In case the modification time changes but not the content, 2394 // accept the cached file as legit. 2395 if (ValidateASTInputFilesContent && 2396 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2397 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2398 if (!MemBuffOrError) { 2399 if (!Complain) 2400 return ModificationType::ModTime; 2401 std::string ErrorStr = "could not get buffer for file '"; 2402 ErrorStr += File->getName(); 2403 ErrorStr += "'"; 2404 Error(ErrorStr); 2405 return ModificationType::ModTime; 2406 } 2407 2408 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2409 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2410 return ModificationType::None; 2411 return ModificationType::Content; 2412 } 2413 return ModificationType::ModTime; 2414 } 2415 return ModificationType::None; 2416 }; 2417 2418 bool IsOutOfDate = false; 2419 auto FileChange = HasInputFileChanged(); 2420 // For an overridden file, there is nothing to validate. 2421 if (!Overridden && FileChange != ModificationType::None) { 2422 if (Complain && !Diags.isDiagnosticInFlight()) { 2423 // Build a list of the PCH imports that got us here (in reverse). 2424 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2425 while (!ImportStack.back()->ImportedBy.empty()) 2426 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2427 2428 // The top-level PCH is stale. 2429 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2430 Diag(diag::err_fe_ast_file_modified) 2431 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind) 2432 << TopLevelPCHName << FileChange; 2433 2434 // Print the import stack. 2435 if (ImportStack.size() > 1) { 2436 Diag(diag::note_pch_required_by) 2437 << Filename << ImportStack[0]->FileName; 2438 for (unsigned I = 1; I < ImportStack.size(); ++I) 2439 Diag(diag::note_pch_required_by) 2440 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2441 } 2442 2443 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2444 } 2445 2446 IsOutOfDate = true; 2447 } 2448 // FIXME: If the file is overridden and we've already opened it, 2449 // issue an error (or split it into a separate FileEntry). 2450 2451 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate); 2452 2453 // Note that we've loaded this input file. 2454 F.InputFilesLoaded[ID-1] = IF; 2455 return IF; 2456 } 2457 2458 /// If we are loading a relocatable PCH or module file, and the filename 2459 /// is not an absolute path, add the system or module root to the beginning of 2460 /// the file name. 2461 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2462 // Resolve relative to the base directory, if we have one. 2463 if (!M.BaseDirectory.empty()) 2464 return ResolveImportedPath(Filename, M.BaseDirectory); 2465 } 2466 2467 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2468 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2469 return; 2470 2471 SmallString<128> Buffer; 2472 llvm::sys::path::append(Buffer, Prefix, Filename); 2473 Filename.assign(Buffer.begin(), Buffer.end()); 2474 } 2475 2476 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2477 switch (ARR) { 2478 case ASTReader::Failure: return true; 2479 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2480 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2481 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2482 case ASTReader::ConfigurationMismatch: 2483 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2484 case ASTReader::HadErrors: return true; 2485 case ASTReader::Success: return false; 2486 } 2487 2488 llvm_unreachable("unknown ASTReadResult"); 2489 } 2490 2491 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2492 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2493 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2494 std::string &SuggestedPredefines) { 2495 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2496 // FIXME this drops errors on the floor. 2497 consumeError(std::move(Err)); 2498 return Failure; 2499 } 2500 2501 // Read all of the records in the options block. 2502 RecordData Record; 2503 ASTReadResult Result = Success; 2504 while (true) { 2505 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2506 if (!MaybeEntry) { 2507 // FIXME this drops errors on the floor. 2508 consumeError(MaybeEntry.takeError()); 2509 return Failure; 2510 } 2511 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2512 2513 switch (Entry.Kind) { 2514 case llvm::BitstreamEntry::Error: 2515 case llvm::BitstreamEntry::SubBlock: 2516 return Failure; 2517 2518 case llvm::BitstreamEntry::EndBlock: 2519 return Result; 2520 2521 case llvm::BitstreamEntry::Record: 2522 // The interesting case. 2523 break; 2524 } 2525 2526 // Read and process a record. 2527 Record.clear(); 2528 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2529 if (!MaybeRecordType) { 2530 // FIXME this drops errors on the floor. 2531 consumeError(MaybeRecordType.takeError()); 2532 return Failure; 2533 } 2534 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2535 case LANGUAGE_OPTIONS: { 2536 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2537 if (ParseLanguageOptions(Record, Complain, Listener, 2538 AllowCompatibleConfigurationMismatch)) 2539 Result = ConfigurationMismatch; 2540 break; 2541 } 2542 2543 case TARGET_OPTIONS: { 2544 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2545 if (ParseTargetOptions(Record, Complain, Listener, 2546 AllowCompatibleConfigurationMismatch)) 2547 Result = ConfigurationMismatch; 2548 break; 2549 } 2550 2551 case FILE_SYSTEM_OPTIONS: { 2552 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2553 if (!AllowCompatibleConfigurationMismatch && 2554 ParseFileSystemOptions(Record, Complain, Listener)) 2555 Result = ConfigurationMismatch; 2556 break; 2557 } 2558 2559 case HEADER_SEARCH_OPTIONS: { 2560 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2561 if (!AllowCompatibleConfigurationMismatch && 2562 ParseHeaderSearchOptions(Record, Complain, Listener)) 2563 Result = ConfigurationMismatch; 2564 break; 2565 } 2566 2567 case PREPROCESSOR_OPTIONS: 2568 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2569 if (!AllowCompatibleConfigurationMismatch && 2570 ParsePreprocessorOptions(Record, Complain, Listener, 2571 SuggestedPredefines)) 2572 Result = ConfigurationMismatch; 2573 break; 2574 } 2575 } 2576 } 2577 2578 ASTReader::ASTReadResult 2579 ASTReader::ReadControlBlock(ModuleFile &F, 2580 SmallVectorImpl<ImportedModule> &Loaded, 2581 const ModuleFile *ImportedBy, 2582 unsigned ClientLoadCapabilities) { 2583 BitstreamCursor &Stream = F.Stream; 2584 2585 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2586 Error(std::move(Err)); 2587 return Failure; 2588 } 2589 2590 // Lambda to read the unhashed control block the first time it's called. 2591 // 2592 // For PCM files, the unhashed control block cannot be read until after the 2593 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2594 // need to look ahead before reading the IMPORTS record. For consistency, 2595 // this block is always read somehow (see BitstreamEntry::EndBlock). 2596 bool HasReadUnhashedControlBlock = false; 2597 auto readUnhashedControlBlockOnce = [&]() { 2598 if (!HasReadUnhashedControlBlock) { 2599 HasReadUnhashedControlBlock = true; 2600 if (ASTReadResult Result = 2601 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2602 return Result; 2603 } 2604 return Success; 2605 }; 2606 2607 bool DisableValidation = shouldDisableValidationForFile(F); 2608 2609 // Read all of the records and blocks in the control block. 2610 RecordData Record; 2611 unsigned NumInputs = 0; 2612 unsigned NumUserInputs = 0; 2613 StringRef BaseDirectoryAsWritten; 2614 while (true) { 2615 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2616 if (!MaybeEntry) { 2617 Error(MaybeEntry.takeError()); 2618 return Failure; 2619 } 2620 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2621 2622 switch (Entry.Kind) { 2623 case llvm::BitstreamEntry::Error: 2624 Error("malformed block record in AST file"); 2625 return Failure; 2626 case llvm::BitstreamEntry::EndBlock: { 2627 // Validate the module before returning. This call catches an AST with 2628 // no module name and no imports. 2629 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2630 return Result; 2631 2632 // Validate input files. 2633 const HeaderSearchOptions &HSOpts = 2634 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2635 2636 // All user input files reside at the index range [0, NumUserInputs), and 2637 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2638 // loaded module files, ignore missing inputs. 2639 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2640 F.Kind != MK_PrebuiltModule) { 2641 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2642 2643 // If we are reading a module, we will create a verification timestamp, 2644 // so we verify all input files. Otherwise, verify only user input 2645 // files. 2646 2647 unsigned N = NumUserInputs; 2648 if (ValidateSystemInputs || 2649 (HSOpts.ModulesValidateOncePerBuildSession && 2650 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2651 F.Kind == MK_ImplicitModule)) 2652 N = NumInputs; 2653 2654 for (unsigned I = 0; I < N; ++I) { 2655 InputFile IF = getInputFile(F, I+1, Complain); 2656 if (!IF.getFile() || IF.isOutOfDate()) 2657 return OutOfDate; 2658 } 2659 } 2660 2661 if (Listener) 2662 Listener->visitModuleFile(F.FileName, F.Kind); 2663 2664 if (Listener && Listener->needsInputFileVisitation()) { 2665 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2666 : NumUserInputs; 2667 for (unsigned I = 0; I < N; ++I) { 2668 bool IsSystem = I >= NumUserInputs; 2669 InputFileInfo FI = readInputFileInfo(F, I+1); 2670 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2671 F.Kind == MK_ExplicitModule || 2672 F.Kind == MK_PrebuiltModule); 2673 } 2674 } 2675 2676 return Success; 2677 } 2678 2679 case llvm::BitstreamEntry::SubBlock: 2680 switch (Entry.ID) { 2681 case INPUT_FILES_BLOCK_ID: 2682 F.InputFilesCursor = Stream; 2683 if (llvm::Error Err = Stream.SkipBlock()) { 2684 Error(std::move(Err)); 2685 return Failure; 2686 } 2687 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2688 Error("malformed block record in AST file"); 2689 return Failure; 2690 } 2691 continue; 2692 2693 case OPTIONS_BLOCK_ID: 2694 // If we're reading the first module for this group, check its options 2695 // are compatible with ours. For modules it imports, no further checking 2696 // is required, because we checked them when we built it. 2697 if (Listener && !ImportedBy) { 2698 // Should we allow the configuration of the module file to differ from 2699 // the configuration of the current translation unit in a compatible 2700 // way? 2701 // 2702 // FIXME: Allow this for files explicitly specified with -include-pch. 2703 bool AllowCompatibleConfigurationMismatch = 2704 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2705 2706 ASTReadResult Result = 2707 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2708 AllowCompatibleConfigurationMismatch, *Listener, 2709 SuggestedPredefines); 2710 if (Result == Failure) { 2711 Error("malformed block record in AST file"); 2712 return Result; 2713 } 2714 2715 if (DisableValidation || 2716 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2717 Result = Success; 2718 2719 // If we can't load the module, exit early since we likely 2720 // will rebuild the module anyway. The stream may be in the 2721 // middle of a block. 2722 if (Result != Success) 2723 return Result; 2724 } else if (llvm::Error Err = Stream.SkipBlock()) { 2725 Error(std::move(Err)); 2726 return Failure; 2727 } 2728 continue; 2729 2730 default: 2731 if (llvm::Error Err = Stream.SkipBlock()) { 2732 Error(std::move(Err)); 2733 return Failure; 2734 } 2735 continue; 2736 } 2737 2738 case llvm::BitstreamEntry::Record: 2739 // The interesting case. 2740 break; 2741 } 2742 2743 // Read and process a record. 2744 Record.clear(); 2745 StringRef Blob; 2746 Expected<unsigned> MaybeRecordType = 2747 Stream.readRecord(Entry.ID, Record, &Blob); 2748 if (!MaybeRecordType) { 2749 Error(MaybeRecordType.takeError()); 2750 return Failure; 2751 } 2752 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2753 case METADATA: { 2754 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2755 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2756 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2757 : diag::err_pch_version_too_new); 2758 return VersionMismatch; 2759 } 2760 2761 bool hasErrors = Record[6]; 2762 if (hasErrors && !DisableValidation) { 2763 // If requested by the caller, mark modules on error as out-of-date. 2764 if (F.Kind == MK_ImplicitModule && 2765 (ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate)) 2766 return OutOfDate; 2767 2768 if (!AllowASTWithCompilerErrors) { 2769 Diag(diag::err_pch_with_compiler_errors); 2770 return HadErrors; 2771 } 2772 } 2773 if (hasErrors) { 2774 Diags.ErrorOccurred = true; 2775 Diags.UncompilableErrorOccurred = true; 2776 Diags.UnrecoverableErrorOccurred = true; 2777 } 2778 2779 F.RelocatablePCH = Record[4]; 2780 // Relative paths in a relocatable PCH are relative to our sysroot. 2781 if (F.RelocatablePCH) 2782 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2783 2784 F.HasTimestamps = Record[5]; 2785 2786 const std::string &CurBranch = getClangFullRepositoryVersion(); 2787 StringRef ASTBranch = Blob; 2788 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2789 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2790 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2791 return VersionMismatch; 2792 } 2793 break; 2794 } 2795 2796 case IMPORTS: { 2797 // Validate the AST before processing any imports (otherwise, untangling 2798 // them can be error-prone and expensive). A module will have a name and 2799 // will already have been validated, but this catches the PCH case. 2800 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2801 return Result; 2802 2803 // Load each of the imported PCH files. 2804 unsigned Idx = 0, N = Record.size(); 2805 while (Idx < N) { 2806 // Read information about the AST file. 2807 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2808 // The import location will be the local one for now; we will adjust 2809 // all import locations of module imports after the global source 2810 // location info are setup, in ReadAST. 2811 SourceLocation ImportLoc = 2812 ReadUntranslatedSourceLocation(Record[Idx++]); 2813 off_t StoredSize = (off_t)Record[Idx++]; 2814 time_t StoredModTime = (time_t)Record[Idx++]; 2815 auto FirstSignatureByte = Record.begin() + Idx; 2816 ASTFileSignature StoredSignature = ASTFileSignature::create( 2817 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size); 2818 Idx += ASTFileSignature::size; 2819 2820 std::string ImportedName = ReadString(Record, Idx); 2821 std::string ImportedFile; 2822 2823 // For prebuilt and explicit modules first consult the file map for 2824 // an override. Note that here we don't search prebuilt module 2825 // directories, only the explicit name to file mappings. Also, we will 2826 // still verify the size/signature making sure it is essentially the 2827 // same file but perhaps in a different location. 2828 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2829 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2830 ImportedName, /*FileMapOnly*/ true); 2831 2832 if (ImportedFile.empty()) 2833 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2834 // ModuleCache as when writing. 2835 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2836 else 2837 SkipPath(Record, Idx); 2838 2839 // If our client can't cope with us being out of date, we can't cope with 2840 // our dependency being missing. 2841 unsigned Capabilities = ClientLoadCapabilities; 2842 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2843 Capabilities &= ~ARR_Missing; 2844 2845 // Load the AST file. 2846 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2847 Loaded, StoredSize, StoredModTime, 2848 StoredSignature, Capabilities); 2849 2850 // If we diagnosed a problem, produce a backtrace. 2851 if (isDiagnosedResult(Result, Capabilities)) 2852 Diag(diag::note_module_file_imported_by) 2853 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2854 2855 switch (Result) { 2856 case Failure: return Failure; 2857 // If we have to ignore the dependency, we'll have to ignore this too. 2858 case Missing: 2859 case OutOfDate: return OutOfDate; 2860 case VersionMismatch: return VersionMismatch; 2861 case ConfigurationMismatch: return ConfigurationMismatch; 2862 case HadErrors: return HadErrors; 2863 case Success: break; 2864 } 2865 } 2866 break; 2867 } 2868 2869 case ORIGINAL_FILE: 2870 F.OriginalSourceFileID = FileID::get(Record[0]); 2871 F.ActualOriginalSourceFileName = std::string(Blob); 2872 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2873 ResolveImportedPath(F, F.OriginalSourceFileName); 2874 break; 2875 2876 case ORIGINAL_FILE_ID: 2877 F.OriginalSourceFileID = FileID::get(Record[0]); 2878 break; 2879 2880 case ORIGINAL_PCH_DIR: 2881 F.OriginalDir = std::string(Blob); 2882 break; 2883 2884 case MODULE_NAME: 2885 F.ModuleName = std::string(Blob); 2886 Diag(diag::remark_module_import) 2887 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2888 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2889 if (Listener) 2890 Listener->ReadModuleName(F.ModuleName); 2891 2892 // Validate the AST as soon as we have a name so we can exit early on 2893 // failure. 2894 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2895 return Result; 2896 2897 break; 2898 2899 case MODULE_DIRECTORY: { 2900 // Save the BaseDirectory as written in the PCM for computing the module 2901 // filename for the ModuleCache. 2902 BaseDirectoryAsWritten = Blob; 2903 assert(!F.ModuleName.empty() && 2904 "MODULE_DIRECTORY found before MODULE_NAME"); 2905 // If we've already loaded a module map file covering this module, we may 2906 // have a better path for it (relative to the current build). 2907 Module *M = PP.getHeaderSearchInfo().lookupModule( 2908 F.ModuleName, /*AllowSearch*/ true, 2909 /*AllowExtraModuleMapSearch*/ true); 2910 if (M && M->Directory) { 2911 // If we're implicitly loading a module, the base directory can't 2912 // change between the build and use. 2913 // Don't emit module relocation error if we have -fno-validate-pch 2914 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 2915 DisableValidationForModuleKind::Module) && 2916 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2917 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2918 if (!BuildDir || *BuildDir != M->Directory) { 2919 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2920 Diag(diag::err_imported_module_relocated) 2921 << F.ModuleName << Blob << M->Directory->getName(); 2922 return OutOfDate; 2923 } 2924 } 2925 F.BaseDirectory = std::string(M->Directory->getName()); 2926 } else { 2927 F.BaseDirectory = std::string(Blob); 2928 } 2929 break; 2930 } 2931 2932 case MODULE_MAP_FILE: 2933 if (ASTReadResult Result = 2934 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2935 return Result; 2936 break; 2937 2938 case INPUT_FILE_OFFSETS: 2939 NumInputs = Record[0]; 2940 NumUserInputs = Record[1]; 2941 F.InputFileOffsets = 2942 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2943 F.InputFilesLoaded.resize(NumInputs); 2944 F.NumUserInputFiles = NumUserInputs; 2945 break; 2946 } 2947 } 2948 } 2949 2950 ASTReader::ASTReadResult 2951 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2952 BitstreamCursor &Stream = F.Stream; 2953 2954 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) { 2955 Error(std::move(Err)); 2956 return Failure; 2957 } 2958 F.ASTBlockStartOffset = Stream.GetCurrentBitNo(); 2959 2960 // Read all of the records and blocks for the AST file. 2961 RecordData Record; 2962 while (true) { 2963 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2964 if (!MaybeEntry) { 2965 Error(MaybeEntry.takeError()); 2966 return Failure; 2967 } 2968 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2969 2970 switch (Entry.Kind) { 2971 case llvm::BitstreamEntry::Error: 2972 Error("error at end of module block in AST file"); 2973 return Failure; 2974 case llvm::BitstreamEntry::EndBlock: 2975 // Outside of C++, we do not store a lookup map for the translation unit. 2976 // Instead, mark it as needing a lookup map to be built if this module 2977 // contains any declarations lexically within it (which it always does!). 2978 // This usually has no cost, since we very rarely need the lookup map for 2979 // the translation unit outside C++. 2980 if (ASTContext *Ctx = ContextObj) { 2981 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2982 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2983 DC->setMustBuildLookupTable(); 2984 } 2985 2986 return Success; 2987 case llvm::BitstreamEntry::SubBlock: 2988 switch (Entry.ID) { 2989 case DECLTYPES_BLOCK_ID: 2990 // We lazily load the decls block, but we want to set up the 2991 // DeclsCursor cursor to point into it. Clone our current bitcode 2992 // cursor to it, enter the block and read the abbrevs in that block. 2993 // With the main cursor, we just skip over it. 2994 F.DeclsCursor = Stream; 2995 if (llvm::Error Err = Stream.SkipBlock()) { 2996 Error(std::move(Err)); 2997 return Failure; 2998 } 2999 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID, 3000 &F.DeclsBlockStartOffset)) { 3001 Error("malformed block record in AST file"); 3002 return Failure; 3003 } 3004 break; 3005 3006 case PREPROCESSOR_BLOCK_ID: 3007 F.MacroCursor = Stream; 3008 if (!PP.getExternalSource()) 3009 PP.setExternalSource(this); 3010 3011 if (llvm::Error Err = Stream.SkipBlock()) { 3012 Error(std::move(Err)); 3013 return Failure; 3014 } 3015 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 3016 Error("malformed block record in AST file"); 3017 return Failure; 3018 } 3019 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 3020 break; 3021 3022 case PREPROCESSOR_DETAIL_BLOCK_ID: 3023 F.PreprocessorDetailCursor = Stream; 3024 3025 if (llvm::Error Err = Stream.SkipBlock()) { 3026 Error(std::move(Err)); 3027 return Failure; 3028 } 3029 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3030 PREPROCESSOR_DETAIL_BLOCK_ID)) { 3031 Error("malformed preprocessor detail record in AST file"); 3032 return Failure; 3033 } 3034 F.PreprocessorDetailStartOffset 3035 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3036 3037 if (!PP.getPreprocessingRecord()) 3038 PP.createPreprocessingRecord(); 3039 if (!PP.getPreprocessingRecord()->getExternalSource()) 3040 PP.getPreprocessingRecord()->SetExternalSource(*this); 3041 break; 3042 3043 case SOURCE_MANAGER_BLOCK_ID: 3044 if (ReadSourceManagerBlock(F)) 3045 return Failure; 3046 break; 3047 3048 case SUBMODULE_BLOCK_ID: 3049 if (ASTReadResult Result = 3050 ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3051 return Result; 3052 break; 3053 3054 case COMMENTS_BLOCK_ID: { 3055 BitstreamCursor C = Stream; 3056 3057 if (llvm::Error Err = Stream.SkipBlock()) { 3058 Error(std::move(Err)); 3059 return Failure; 3060 } 3061 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 3062 Error("malformed comments block in AST file"); 3063 return Failure; 3064 } 3065 CommentsCursors.push_back(std::make_pair(C, &F)); 3066 break; 3067 } 3068 3069 default: 3070 if (llvm::Error Err = Stream.SkipBlock()) { 3071 Error(std::move(Err)); 3072 return Failure; 3073 } 3074 break; 3075 } 3076 continue; 3077 3078 case llvm::BitstreamEntry::Record: 3079 // The interesting case. 3080 break; 3081 } 3082 3083 // Read and process a record. 3084 Record.clear(); 3085 StringRef Blob; 3086 Expected<unsigned> MaybeRecordType = 3087 Stream.readRecord(Entry.ID, Record, &Blob); 3088 if (!MaybeRecordType) { 3089 Error(MaybeRecordType.takeError()); 3090 return Failure; 3091 } 3092 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3093 3094 // If we're not loading an AST context, we don't care about most records. 3095 if (!ContextObj) { 3096 switch (RecordType) { 3097 case IDENTIFIER_TABLE: 3098 case IDENTIFIER_OFFSET: 3099 case INTERESTING_IDENTIFIERS: 3100 case STATISTICS: 3101 case PP_CONDITIONAL_STACK: 3102 case PP_COUNTER_VALUE: 3103 case SOURCE_LOCATION_OFFSETS: 3104 case MODULE_OFFSET_MAP: 3105 case SOURCE_MANAGER_LINE_TABLE: 3106 case SOURCE_LOCATION_PRELOADS: 3107 case PPD_ENTITIES_OFFSETS: 3108 case HEADER_SEARCH_TABLE: 3109 case IMPORTED_MODULES: 3110 case MACRO_OFFSET: 3111 break; 3112 default: 3113 continue; 3114 } 3115 } 3116 3117 switch (RecordType) { 3118 default: // Default behavior: ignore. 3119 break; 3120 3121 case TYPE_OFFSET: { 3122 if (F.LocalNumTypes != 0) { 3123 Error("duplicate TYPE_OFFSET record in AST file"); 3124 return Failure; 3125 } 3126 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data()); 3127 F.LocalNumTypes = Record[0]; 3128 unsigned LocalBaseTypeIndex = Record[1]; 3129 F.BaseTypeIndex = getTotalNumTypes(); 3130 3131 if (F.LocalNumTypes > 0) { 3132 // Introduce the global -> local mapping for types within this module. 3133 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3134 3135 // Introduce the local -> global mapping for types within this module. 3136 F.TypeRemap.insertOrReplace( 3137 std::make_pair(LocalBaseTypeIndex, 3138 F.BaseTypeIndex - LocalBaseTypeIndex)); 3139 3140 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3141 } 3142 break; 3143 } 3144 3145 case DECL_OFFSET: { 3146 if (F.LocalNumDecls != 0) { 3147 Error("duplicate DECL_OFFSET record in AST file"); 3148 return Failure; 3149 } 3150 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3151 F.LocalNumDecls = Record[0]; 3152 unsigned LocalBaseDeclID = Record[1]; 3153 F.BaseDeclID = getTotalNumDecls(); 3154 3155 if (F.LocalNumDecls > 0) { 3156 // Introduce the global -> local mapping for declarations within this 3157 // module. 3158 GlobalDeclMap.insert( 3159 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3160 3161 // Introduce the local -> global mapping for declarations within this 3162 // module. 3163 F.DeclRemap.insertOrReplace( 3164 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3165 3166 // Introduce the global -> local mapping for declarations within this 3167 // module. 3168 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3169 3170 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3171 } 3172 break; 3173 } 3174 3175 case TU_UPDATE_LEXICAL: { 3176 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3177 LexicalContents Contents( 3178 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3179 Blob.data()), 3180 static_cast<unsigned int>(Blob.size() / 4)); 3181 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3182 TU->setHasExternalLexicalStorage(true); 3183 break; 3184 } 3185 3186 case UPDATE_VISIBLE: { 3187 unsigned Idx = 0; 3188 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3189 auto *Data = (const unsigned char*)Blob.data(); 3190 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3191 // If we've already loaded the decl, perform the updates when we finish 3192 // loading this block. 3193 if (Decl *D = GetExistingDecl(ID)) 3194 PendingUpdateRecords.push_back( 3195 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3196 break; 3197 } 3198 3199 case IDENTIFIER_TABLE: 3200 F.IdentifierTableData = 3201 reinterpret_cast<const unsigned char *>(Blob.data()); 3202 if (Record[0]) { 3203 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3204 F.IdentifierTableData + Record[0], 3205 F.IdentifierTableData + sizeof(uint32_t), 3206 F.IdentifierTableData, 3207 ASTIdentifierLookupTrait(*this, F)); 3208 3209 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3210 } 3211 break; 3212 3213 case IDENTIFIER_OFFSET: { 3214 if (F.LocalNumIdentifiers != 0) { 3215 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 3216 return Failure; 3217 } 3218 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3219 F.LocalNumIdentifiers = Record[0]; 3220 unsigned LocalBaseIdentifierID = Record[1]; 3221 F.BaseIdentifierID = getTotalNumIdentifiers(); 3222 3223 if (F.LocalNumIdentifiers > 0) { 3224 // Introduce the global -> local mapping for identifiers within this 3225 // module. 3226 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3227 &F)); 3228 3229 // Introduce the local -> global mapping for identifiers within this 3230 // module. 3231 F.IdentifierRemap.insertOrReplace( 3232 std::make_pair(LocalBaseIdentifierID, 3233 F.BaseIdentifierID - LocalBaseIdentifierID)); 3234 3235 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3236 + F.LocalNumIdentifiers); 3237 } 3238 break; 3239 } 3240 3241 case INTERESTING_IDENTIFIERS: 3242 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3243 break; 3244 3245 case EAGERLY_DESERIALIZED_DECLS: 3246 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3247 // about "interesting" decls (for instance, if we're building a module). 3248 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3249 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3250 break; 3251 3252 case MODULAR_CODEGEN_DECLS: 3253 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3254 // them (ie: if we're not codegenerating this module). 3255 if (F.Kind == MK_MainFile || 3256 getContext().getLangOpts().BuildingPCHWithObjectFile) 3257 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3258 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3259 break; 3260 3261 case SPECIAL_TYPES: 3262 if (SpecialTypes.empty()) { 3263 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3264 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3265 break; 3266 } 3267 3268 if (SpecialTypes.size() != Record.size()) { 3269 Error("invalid special-types record"); 3270 return Failure; 3271 } 3272 3273 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3274 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3275 if (!SpecialTypes[I]) 3276 SpecialTypes[I] = ID; 3277 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3278 // merge step? 3279 } 3280 break; 3281 3282 case STATISTICS: 3283 TotalNumStatements += Record[0]; 3284 TotalNumMacros += Record[1]; 3285 TotalLexicalDeclContexts += Record[2]; 3286 TotalVisibleDeclContexts += Record[3]; 3287 break; 3288 3289 case UNUSED_FILESCOPED_DECLS: 3290 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3291 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3292 break; 3293 3294 case DELEGATING_CTORS: 3295 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3296 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3297 break; 3298 3299 case WEAK_UNDECLARED_IDENTIFIERS: 3300 if (Record.size() % 4 != 0) { 3301 Error("invalid weak identifiers record"); 3302 return Failure; 3303 } 3304 3305 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3306 // files. This isn't the way to do it :) 3307 WeakUndeclaredIdentifiers.clear(); 3308 3309 // Translate the weak, undeclared identifiers into global IDs. 3310 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3311 WeakUndeclaredIdentifiers.push_back( 3312 getGlobalIdentifierID(F, Record[I++])); 3313 WeakUndeclaredIdentifiers.push_back( 3314 getGlobalIdentifierID(F, Record[I++])); 3315 WeakUndeclaredIdentifiers.push_back( 3316 ReadSourceLocation(F, Record, I).getRawEncoding()); 3317 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3318 } 3319 break; 3320 3321 case SELECTOR_OFFSETS: { 3322 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3323 F.LocalNumSelectors = Record[0]; 3324 unsigned LocalBaseSelectorID = Record[1]; 3325 F.BaseSelectorID = getTotalNumSelectors(); 3326 3327 if (F.LocalNumSelectors > 0) { 3328 // Introduce the global -> local mapping for selectors within this 3329 // module. 3330 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3331 3332 // Introduce the local -> global mapping for selectors within this 3333 // module. 3334 F.SelectorRemap.insertOrReplace( 3335 std::make_pair(LocalBaseSelectorID, 3336 F.BaseSelectorID - LocalBaseSelectorID)); 3337 3338 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3339 } 3340 break; 3341 } 3342 3343 case METHOD_POOL: 3344 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3345 if (Record[0]) 3346 F.SelectorLookupTable 3347 = ASTSelectorLookupTable::Create( 3348 F.SelectorLookupTableData + Record[0], 3349 F.SelectorLookupTableData, 3350 ASTSelectorLookupTrait(*this, F)); 3351 TotalNumMethodPoolEntries += Record[1]; 3352 break; 3353 3354 case REFERENCED_SELECTOR_POOL: 3355 if (!Record.empty()) { 3356 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3357 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3358 Record[Idx++])); 3359 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3360 getRawEncoding()); 3361 } 3362 } 3363 break; 3364 3365 case PP_CONDITIONAL_STACK: 3366 if (!Record.empty()) { 3367 unsigned Idx = 0, End = Record.size() - 1; 3368 bool ReachedEOFWhileSkipping = Record[Idx++]; 3369 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3370 if (ReachedEOFWhileSkipping) { 3371 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3372 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3373 bool FoundNonSkipPortion = Record[Idx++]; 3374 bool FoundElse = Record[Idx++]; 3375 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3376 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3377 FoundElse, ElseLoc); 3378 } 3379 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3380 while (Idx < End) { 3381 auto Loc = ReadSourceLocation(F, Record, Idx); 3382 bool WasSkipping = Record[Idx++]; 3383 bool FoundNonSkip = Record[Idx++]; 3384 bool FoundElse = Record[Idx++]; 3385 ConditionalStack.push_back( 3386 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3387 } 3388 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3389 } 3390 break; 3391 3392 case PP_COUNTER_VALUE: 3393 if (!Record.empty() && Listener) 3394 Listener->ReadCounter(F, Record[0]); 3395 break; 3396 3397 case FILE_SORTED_DECLS: 3398 F.FileSortedDecls = (const DeclID *)Blob.data(); 3399 F.NumFileSortedDecls = Record[0]; 3400 break; 3401 3402 case SOURCE_LOCATION_OFFSETS: { 3403 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3404 F.LocalNumSLocEntries = Record[0]; 3405 unsigned SLocSpaceSize = Record[1]; 3406 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset; 3407 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3408 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3409 SLocSpaceSize); 3410 if (!F.SLocEntryBaseID) { 3411 Error("ran out of source locations"); 3412 break; 3413 } 3414 // Make our entry in the range map. BaseID is negative and growing, so 3415 // we invert it. Because we invert it, though, we need the other end of 3416 // the range. 3417 unsigned RangeStart = 3418 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3419 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3420 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3421 3422 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3423 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 3424 GlobalSLocOffsetMap.insert( 3425 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3426 - SLocSpaceSize,&F)); 3427 3428 // Initialize the remapping table. 3429 // Invalid stays invalid. 3430 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3431 // This module. Base was 2 when being compiled. 3432 F.SLocRemap.insertOrReplace(std::make_pair(2U, 3433 static_cast<int>(F.SLocEntryBaseOffset - 2))); 3434 3435 TotalNumSLocEntries += F.LocalNumSLocEntries; 3436 break; 3437 } 3438 3439 case MODULE_OFFSET_MAP: 3440 F.ModuleOffsetMap = Blob; 3441 break; 3442 3443 case SOURCE_MANAGER_LINE_TABLE: 3444 if (ParseLineTable(F, Record)) { 3445 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file"); 3446 return Failure; 3447 } 3448 break; 3449 3450 case SOURCE_LOCATION_PRELOADS: { 3451 // Need to transform from the local view (1-based IDs) to the global view, 3452 // which is based off F.SLocEntryBaseID. 3453 if (!F.PreloadSLocEntries.empty()) { 3454 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3455 return Failure; 3456 } 3457 3458 F.PreloadSLocEntries.swap(Record); 3459 break; 3460 } 3461 3462 case EXT_VECTOR_DECLS: 3463 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3464 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3465 break; 3466 3467 case VTABLE_USES: 3468 if (Record.size() % 3 != 0) { 3469 Error("Invalid VTABLE_USES record"); 3470 return Failure; 3471 } 3472 3473 // Later tables overwrite earlier ones. 3474 // FIXME: Modules will have some trouble with this. This is clearly not 3475 // the right way to do this. 3476 VTableUses.clear(); 3477 3478 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3479 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3480 VTableUses.push_back( 3481 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3482 VTableUses.push_back(Record[Idx++]); 3483 } 3484 break; 3485 3486 case PENDING_IMPLICIT_INSTANTIATIONS: 3487 if (PendingInstantiations.size() % 2 != 0) { 3488 Error("Invalid existing PendingInstantiations"); 3489 return Failure; 3490 } 3491 3492 if (Record.size() % 2 != 0) { 3493 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3494 return Failure; 3495 } 3496 3497 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3498 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3499 PendingInstantiations.push_back( 3500 ReadSourceLocation(F, Record, I).getRawEncoding()); 3501 } 3502 break; 3503 3504 case SEMA_DECL_REFS: 3505 if (Record.size() != 3) { 3506 Error("Invalid SEMA_DECL_REFS block"); 3507 return Failure; 3508 } 3509 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3510 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3511 break; 3512 3513 case PPD_ENTITIES_OFFSETS: { 3514 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3515 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3516 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3517 3518 unsigned LocalBasePreprocessedEntityID = Record[0]; 3519 3520 unsigned StartingID; 3521 if (!PP.getPreprocessingRecord()) 3522 PP.createPreprocessingRecord(); 3523 if (!PP.getPreprocessingRecord()->getExternalSource()) 3524 PP.getPreprocessingRecord()->SetExternalSource(*this); 3525 StartingID 3526 = PP.getPreprocessingRecord() 3527 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3528 F.BasePreprocessedEntityID = StartingID; 3529 3530 if (F.NumPreprocessedEntities > 0) { 3531 // Introduce the global -> local mapping for preprocessed entities in 3532 // this module. 3533 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3534 3535 // Introduce the local -> global mapping for preprocessed entities in 3536 // this module. 3537 F.PreprocessedEntityRemap.insertOrReplace( 3538 std::make_pair(LocalBasePreprocessedEntityID, 3539 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3540 } 3541 3542 break; 3543 } 3544 3545 case PPD_SKIPPED_RANGES: { 3546 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3547 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3548 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3549 3550 if (!PP.getPreprocessingRecord()) 3551 PP.createPreprocessingRecord(); 3552 if (!PP.getPreprocessingRecord()->getExternalSource()) 3553 PP.getPreprocessingRecord()->SetExternalSource(*this); 3554 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3555 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3556 3557 if (F.NumPreprocessedSkippedRanges > 0) 3558 GlobalSkippedRangeMap.insert( 3559 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3560 break; 3561 } 3562 3563 case DECL_UPDATE_OFFSETS: 3564 if (Record.size() % 2 != 0) { 3565 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3566 return Failure; 3567 } 3568 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3569 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3570 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3571 3572 // If we've already loaded the decl, perform the updates when we finish 3573 // loading this block. 3574 if (Decl *D = GetExistingDecl(ID)) 3575 PendingUpdateRecords.push_back( 3576 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3577 } 3578 break; 3579 3580 case OBJC_CATEGORIES_MAP: 3581 if (F.LocalNumObjCCategoriesInMap != 0) { 3582 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3583 return Failure; 3584 } 3585 3586 F.LocalNumObjCCategoriesInMap = Record[0]; 3587 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3588 break; 3589 3590 case OBJC_CATEGORIES: 3591 F.ObjCCategories.swap(Record); 3592 break; 3593 3594 case CUDA_SPECIAL_DECL_REFS: 3595 // Later tables overwrite earlier ones. 3596 // FIXME: Modules will have trouble with this. 3597 CUDASpecialDeclRefs.clear(); 3598 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3599 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3600 break; 3601 3602 case HEADER_SEARCH_TABLE: 3603 F.HeaderFileInfoTableData = Blob.data(); 3604 F.LocalNumHeaderFileInfos = Record[1]; 3605 if (Record[0]) { 3606 F.HeaderFileInfoTable 3607 = HeaderFileInfoLookupTable::Create( 3608 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3609 (const unsigned char *)F.HeaderFileInfoTableData, 3610 HeaderFileInfoTrait(*this, F, 3611 &PP.getHeaderSearchInfo(), 3612 Blob.data() + Record[2])); 3613 3614 PP.getHeaderSearchInfo().SetExternalSource(this); 3615 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3616 PP.getHeaderSearchInfo().SetExternalLookup(this); 3617 } 3618 break; 3619 3620 case FP_PRAGMA_OPTIONS: 3621 // Later tables overwrite earlier ones. 3622 FPPragmaOptions.swap(Record); 3623 break; 3624 3625 case OPENCL_EXTENSIONS: 3626 for (unsigned I = 0, E = Record.size(); I != E; ) { 3627 auto Name = ReadString(Record, I); 3628 auto &OptInfo = OpenCLExtensions.OptMap[Name]; 3629 OptInfo.Supported = Record[I++] != 0; 3630 OptInfo.Enabled = Record[I++] != 0; 3631 OptInfo.WithPragma = Record[I++] != 0; 3632 OptInfo.Avail = Record[I++]; 3633 OptInfo.Core = Record[I++]; 3634 OptInfo.Opt = Record[I++]; 3635 } 3636 break; 3637 3638 case OPENCL_EXTENSION_TYPES: 3639 for (unsigned I = 0, E = Record.size(); I != E;) { 3640 auto TypeID = static_cast<::TypeID>(Record[I++]); 3641 auto *Type = GetType(TypeID).getTypePtr(); 3642 auto NumExt = static_cast<unsigned>(Record[I++]); 3643 for (unsigned II = 0; II != NumExt; ++II) { 3644 auto Ext = ReadString(Record, I); 3645 OpenCLTypeExtMap[Type].insert(Ext); 3646 } 3647 } 3648 break; 3649 3650 case OPENCL_EXTENSION_DECLS: 3651 for (unsigned I = 0, E = Record.size(); I != E;) { 3652 auto DeclID = static_cast<::DeclID>(Record[I++]); 3653 auto *Decl = GetDecl(DeclID); 3654 auto NumExt = static_cast<unsigned>(Record[I++]); 3655 for (unsigned II = 0; II != NumExt; ++II) { 3656 auto Ext = ReadString(Record, I); 3657 OpenCLDeclExtMap[Decl].insert(Ext); 3658 } 3659 } 3660 break; 3661 3662 case TENTATIVE_DEFINITIONS: 3663 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3664 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3665 break; 3666 3667 case KNOWN_NAMESPACES: 3668 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3669 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3670 break; 3671 3672 case UNDEFINED_BUT_USED: 3673 if (UndefinedButUsed.size() % 2 != 0) { 3674 Error("Invalid existing UndefinedButUsed"); 3675 return Failure; 3676 } 3677 3678 if (Record.size() % 2 != 0) { 3679 Error("invalid undefined-but-used record"); 3680 return Failure; 3681 } 3682 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3683 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3684 UndefinedButUsed.push_back( 3685 ReadSourceLocation(F, Record, I).getRawEncoding()); 3686 } 3687 break; 3688 3689 case DELETE_EXPRS_TO_ANALYZE: 3690 for (unsigned I = 0, N = Record.size(); I != N;) { 3691 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3692 const uint64_t Count = Record[I++]; 3693 DelayedDeleteExprs.push_back(Count); 3694 for (uint64_t C = 0; C < Count; ++C) { 3695 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3696 bool IsArrayForm = Record[I++] == 1; 3697 DelayedDeleteExprs.push_back(IsArrayForm); 3698 } 3699 } 3700 break; 3701 3702 case IMPORTED_MODULES: 3703 if (!F.isModule()) { 3704 // If we aren't loading a module (which has its own exports), make 3705 // all of the imported modules visible. 3706 // FIXME: Deal with macros-only imports. 3707 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3708 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3709 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3710 if (GlobalID) { 3711 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3712 if (DeserializationListener) 3713 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3714 } 3715 } 3716 } 3717 break; 3718 3719 case MACRO_OFFSET: { 3720 if (F.LocalNumMacros != 0) { 3721 Error("duplicate MACRO_OFFSET record in AST file"); 3722 return Failure; 3723 } 3724 F.MacroOffsets = (const uint32_t *)Blob.data(); 3725 F.LocalNumMacros = Record[0]; 3726 unsigned LocalBaseMacroID = Record[1]; 3727 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset; 3728 F.BaseMacroID = getTotalNumMacros(); 3729 3730 if (F.LocalNumMacros > 0) { 3731 // Introduce the global -> local mapping for macros within this module. 3732 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3733 3734 // Introduce the local -> global mapping for macros within this module. 3735 F.MacroRemap.insertOrReplace( 3736 std::make_pair(LocalBaseMacroID, 3737 F.BaseMacroID - LocalBaseMacroID)); 3738 3739 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3740 } 3741 break; 3742 } 3743 3744 case LATE_PARSED_TEMPLATE: 3745 LateParsedTemplates.emplace_back( 3746 std::piecewise_construct, std::forward_as_tuple(&F), 3747 std::forward_as_tuple(Record.begin(), Record.end())); 3748 break; 3749 3750 case OPTIMIZE_PRAGMA_OPTIONS: 3751 if (Record.size() != 1) { 3752 Error("invalid pragma optimize record"); 3753 return Failure; 3754 } 3755 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3756 break; 3757 3758 case MSSTRUCT_PRAGMA_OPTIONS: 3759 if (Record.size() != 1) { 3760 Error("invalid pragma ms_struct record"); 3761 return Failure; 3762 } 3763 PragmaMSStructState = Record[0]; 3764 break; 3765 3766 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3767 if (Record.size() != 2) { 3768 Error("invalid pragma ms_struct record"); 3769 return Failure; 3770 } 3771 PragmaMSPointersToMembersState = Record[0]; 3772 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3773 break; 3774 3775 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3776 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3777 UnusedLocalTypedefNameCandidates.push_back( 3778 getGlobalDeclID(F, Record[I])); 3779 break; 3780 3781 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3782 if (Record.size() != 1) { 3783 Error("invalid cuda pragma options record"); 3784 return Failure; 3785 } 3786 ForceCUDAHostDeviceDepth = Record[0]; 3787 break; 3788 3789 case ALIGN_PACK_PRAGMA_OPTIONS: { 3790 if (Record.size() < 3) { 3791 Error("invalid pragma pack record"); 3792 return Failure; 3793 } 3794 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]); 3795 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3796 unsigned NumStackEntries = Record[2]; 3797 unsigned Idx = 3; 3798 // Reset the stack when importing a new module. 3799 PragmaAlignPackStack.clear(); 3800 for (unsigned I = 0; I < NumStackEntries; ++I) { 3801 PragmaAlignPackStackEntry Entry; 3802 Entry.Value = ReadAlignPackInfo(Record[Idx++]); 3803 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3804 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3805 PragmaAlignPackStrings.push_back(ReadString(Record, Idx)); 3806 Entry.SlotLabel = PragmaAlignPackStrings.back(); 3807 PragmaAlignPackStack.push_back(Entry); 3808 } 3809 break; 3810 } 3811 3812 case FLOAT_CONTROL_PRAGMA_OPTIONS: { 3813 if (Record.size() < 3) { 3814 Error("invalid pragma pack record"); 3815 return Failure; 3816 } 3817 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]); 3818 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3819 unsigned NumStackEntries = Record[2]; 3820 unsigned Idx = 3; 3821 // Reset the stack when importing a new module. 3822 FpPragmaStack.clear(); 3823 for (unsigned I = 0; I < NumStackEntries; ++I) { 3824 FpPragmaStackEntry Entry; 3825 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]); 3826 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3827 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3828 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3829 Entry.SlotLabel = FpPragmaStrings.back(); 3830 FpPragmaStack.push_back(Entry); 3831 } 3832 break; 3833 } 3834 3835 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3836 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3837 DeclsToCheckForDeferredDiags.push_back(getGlobalDeclID(F, Record[I])); 3838 break; 3839 } 3840 } 3841 } 3842 3843 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3844 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3845 3846 // Additional remapping information. 3847 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3848 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3849 F.ModuleOffsetMap = StringRef(); 3850 3851 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3852 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3853 F.SLocRemap.insert(std::make_pair(0U, 0)); 3854 F.SLocRemap.insert(std::make_pair(2U, 1)); 3855 } 3856 3857 // Continuous range maps we may be updating in our module. 3858 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3859 RemapBuilder SLocRemap(F.SLocRemap); 3860 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3861 RemapBuilder MacroRemap(F.MacroRemap); 3862 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3863 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3864 RemapBuilder SelectorRemap(F.SelectorRemap); 3865 RemapBuilder DeclRemap(F.DeclRemap); 3866 RemapBuilder TypeRemap(F.TypeRemap); 3867 3868 while (Data < DataEnd) { 3869 // FIXME: Looking up dependency modules by filename is horrible. Let's 3870 // start fixing this with prebuilt, explicit and implicit modules and see 3871 // how it goes... 3872 using namespace llvm::support; 3873 ModuleKind Kind = static_cast<ModuleKind>( 3874 endian::readNext<uint8_t, little, unaligned>(Data)); 3875 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3876 StringRef Name = StringRef((const char*)Data, Len); 3877 Data += Len; 3878 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule || 3879 Kind == MK_ImplicitModule 3880 ? ModuleMgr.lookupByModuleName(Name) 3881 : ModuleMgr.lookupByFileName(Name)); 3882 if (!OM) { 3883 std::string Msg = 3884 "SourceLocation remap refers to unknown module, cannot find "; 3885 Msg.append(std::string(Name)); 3886 Error(Msg); 3887 return; 3888 } 3889 3890 uint32_t SLocOffset = 3891 endian::readNext<uint32_t, little, unaligned>(Data); 3892 uint32_t IdentifierIDOffset = 3893 endian::readNext<uint32_t, little, unaligned>(Data); 3894 uint32_t MacroIDOffset = 3895 endian::readNext<uint32_t, little, unaligned>(Data); 3896 uint32_t PreprocessedEntityIDOffset = 3897 endian::readNext<uint32_t, little, unaligned>(Data); 3898 uint32_t SubmoduleIDOffset = 3899 endian::readNext<uint32_t, little, unaligned>(Data); 3900 uint32_t SelectorIDOffset = 3901 endian::readNext<uint32_t, little, unaligned>(Data); 3902 uint32_t DeclIDOffset = 3903 endian::readNext<uint32_t, little, unaligned>(Data); 3904 uint32_t TypeIndexOffset = 3905 endian::readNext<uint32_t, little, unaligned>(Data); 3906 3907 uint32_t None = std::numeric_limits<uint32_t>::max(); 3908 3909 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3910 RemapBuilder &Remap) { 3911 if (Offset != None) 3912 Remap.insert(std::make_pair(Offset, 3913 static_cast<int>(BaseOffset - Offset))); 3914 }; 3915 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap); 3916 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3917 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3918 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3919 PreprocessedEntityRemap); 3920 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3921 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3922 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3923 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3924 3925 // Global -> local mappings. 3926 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3927 } 3928 } 3929 3930 ASTReader::ASTReadResult 3931 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3932 const ModuleFile *ImportedBy, 3933 unsigned ClientLoadCapabilities) { 3934 unsigned Idx = 0; 3935 F.ModuleMapPath = ReadPath(F, Record, Idx); 3936 3937 // Try to resolve ModuleName in the current header search context and 3938 // verify that it is found in the same module map file as we saved. If the 3939 // top-level AST file is a main file, skip this check because there is no 3940 // usable header search context. 3941 assert(!F.ModuleName.empty() && 3942 "MODULE_NAME should come before MODULE_MAP_FILE"); 3943 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3944 // An implicitly-loaded module file should have its module listed in some 3945 // module map file that we've already loaded. 3946 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3947 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3948 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3949 // Don't emit module relocation error if we have -fno-validate-pch 3950 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 3951 DisableValidationForModuleKind::Module) && 3952 !ModMap) { 3953 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3954 if (auto ASTFE = M ? M->getASTFile() : None) { 3955 // This module was defined by an imported (explicit) module. 3956 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3957 << ASTFE->getName(); 3958 } else { 3959 // This module was built with a different module map. 3960 Diag(diag::err_imported_module_not_found) 3961 << F.ModuleName << F.FileName 3962 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3963 << !ImportedBy; 3964 // In case it was imported by a PCH, there's a chance the user is 3965 // just missing to include the search path to the directory containing 3966 // the modulemap. 3967 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3968 Diag(diag::note_imported_by_pch_module_not_found) 3969 << llvm::sys::path::parent_path(F.ModuleMapPath); 3970 } 3971 } 3972 return OutOfDate; 3973 } 3974 3975 assert(M && M->Name == F.ModuleName && "found module with different name"); 3976 3977 // Check the primary module map file. 3978 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3979 if (!StoredModMap || *StoredModMap != ModMap) { 3980 assert(ModMap && "found module is missing module map file"); 3981 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3982 "top-level import should be verified"); 3983 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3984 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3985 Diag(diag::err_imported_module_modmap_changed) 3986 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3987 << ModMap->getName() << F.ModuleMapPath << NotImported; 3988 return OutOfDate; 3989 } 3990 3991 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3992 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3993 // FIXME: we should use input files rather than storing names. 3994 std::string Filename = ReadPath(F, Record, Idx); 3995 auto F = FileMgr.getFile(Filename, false, false); 3996 if (!F) { 3997 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3998 Error("could not find file '" + Filename +"' referenced by AST file"); 3999 return OutOfDate; 4000 } 4001 AdditionalStoredMaps.insert(*F); 4002 } 4003 4004 // Check any additional module map files (e.g. module.private.modulemap) 4005 // that are not in the pcm. 4006 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 4007 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 4008 // Remove files that match 4009 // Note: SmallPtrSet::erase is really remove 4010 if (!AdditionalStoredMaps.erase(ModMap)) { 4011 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4012 Diag(diag::err_module_different_modmap) 4013 << F.ModuleName << /*new*/0 << ModMap->getName(); 4014 return OutOfDate; 4015 } 4016 } 4017 } 4018 4019 // Check any additional module map files that are in the pcm, but not 4020 // found in header search. Cases that match are already removed. 4021 for (const FileEntry *ModMap : AdditionalStoredMaps) { 4022 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4023 Diag(diag::err_module_different_modmap) 4024 << F.ModuleName << /*not new*/1 << ModMap->getName(); 4025 return OutOfDate; 4026 } 4027 } 4028 4029 if (Listener) 4030 Listener->ReadModuleMapFile(F.ModuleMapPath); 4031 return Success; 4032 } 4033 4034 /// Move the given method to the back of the global list of methods. 4035 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4036 // Find the entry for this selector in the method pool. 4037 Sema::GlobalMethodPool::iterator Known 4038 = S.MethodPool.find(Method->getSelector()); 4039 if (Known == S.MethodPool.end()) 4040 return; 4041 4042 // Retrieve the appropriate method list. 4043 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4044 : Known->second.second; 4045 bool Found = false; 4046 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4047 if (!Found) { 4048 if (List->getMethod() == Method) { 4049 Found = true; 4050 } else { 4051 // Keep searching. 4052 continue; 4053 } 4054 } 4055 4056 if (List->getNext()) 4057 List->setMethod(List->getNext()->getMethod()); 4058 else 4059 List->setMethod(Method); 4060 } 4061 } 4062 4063 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4064 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4065 for (Decl *D : Names) { 4066 bool wasHidden = !D->isUnconditionallyVisible(); 4067 D->setVisibleDespiteOwningModule(); 4068 4069 if (wasHidden && SemaObj) { 4070 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4071 moveMethodToBackOfGlobalList(*SemaObj, Method); 4072 } 4073 } 4074 } 4075 } 4076 4077 void ASTReader::makeModuleVisible(Module *Mod, 4078 Module::NameVisibilityKind NameVisibility, 4079 SourceLocation ImportLoc) { 4080 llvm::SmallPtrSet<Module *, 4> Visited; 4081 SmallVector<Module *, 4> Stack; 4082 Stack.push_back(Mod); 4083 while (!Stack.empty()) { 4084 Mod = Stack.pop_back_val(); 4085 4086 if (NameVisibility <= Mod->NameVisibility) { 4087 // This module already has this level of visibility (or greater), so 4088 // there is nothing more to do. 4089 continue; 4090 } 4091 4092 if (Mod->isUnimportable()) { 4093 // Modules that aren't importable cannot be made visible. 4094 continue; 4095 } 4096 4097 // Update the module's name visibility. 4098 Mod->NameVisibility = NameVisibility; 4099 4100 // If we've already deserialized any names from this module, 4101 // mark them as visible. 4102 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4103 if (Hidden != HiddenNamesMap.end()) { 4104 auto HiddenNames = std::move(*Hidden); 4105 HiddenNamesMap.erase(Hidden); 4106 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4107 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4108 "making names visible added hidden names"); 4109 } 4110 4111 // Push any exported modules onto the stack to be marked as visible. 4112 SmallVector<Module *, 16> Exports; 4113 Mod->getExportedModules(Exports); 4114 for (SmallVectorImpl<Module *>::iterator 4115 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4116 Module *Exported = *I; 4117 if (Visited.insert(Exported).second) 4118 Stack.push_back(Exported); 4119 } 4120 } 4121 } 4122 4123 /// We've merged the definition \p MergedDef into the existing definition 4124 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4125 /// visible. 4126 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4127 NamedDecl *MergedDef) { 4128 if (!Def->isUnconditionallyVisible()) { 4129 // If MergedDef is visible or becomes visible, make the definition visible. 4130 if (MergedDef->isUnconditionallyVisible()) 4131 Def->setVisibleDespiteOwningModule(); 4132 else { 4133 getContext().mergeDefinitionIntoModule( 4134 Def, MergedDef->getImportedOwningModule(), 4135 /*NotifyListeners*/ false); 4136 PendingMergedDefinitionsToDeduplicate.insert(Def); 4137 } 4138 } 4139 } 4140 4141 bool ASTReader::loadGlobalIndex() { 4142 if (GlobalIndex) 4143 return false; 4144 4145 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4146 !PP.getLangOpts().Modules) 4147 return true; 4148 4149 // Try to load the global index. 4150 TriedLoadingGlobalIndex = true; 4151 StringRef ModuleCachePath 4152 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4153 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4154 GlobalModuleIndex::readIndex(ModuleCachePath); 4155 if (llvm::Error Err = std::move(Result.second)) { 4156 assert(!Result.first); 4157 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4158 return true; 4159 } 4160 4161 GlobalIndex.reset(Result.first); 4162 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4163 return false; 4164 } 4165 4166 bool ASTReader::isGlobalIndexUnavailable() const { 4167 return PP.getLangOpts().Modules && UseGlobalIndex && 4168 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4169 } 4170 4171 static void updateModuleTimestamp(ModuleFile &MF) { 4172 // Overwrite the timestamp file contents so that file's mtime changes. 4173 std::string TimestampFilename = MF.getTimestampFilename(); 4174 std::error_code EC; 4175 llvm::raw_fd_ostream OS(TimestampFilename, EC, 4176 llvm::sys::fs::OF_TextWithCRLF); 4177 if (EC) 4178 return; 4179 OS << "Timestamp file\n"; 4180 OS.close(); 4181 OS.clear_error(); // Avoid triggering a fatal error. 4182 } 4183 4184 /// Given a cursor at the start of an AST file, scan ahead and drop the 4185 /// cursor into the start of the given block ID, returning false on success and 4186 /// true on failure. 4187 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4188 while (true) { 4189 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4190 if (!MaybeEntry) { 4191 // FIXME this drops errors on the floor. 4192 consumeError(MaybeEntry.takeError()); 4193 return true; 4194 } 4195 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4196 4197 switch (Entry.Kind) { 4198 case llvm::BitstreamEntry::Error: 4199 case llvm::BitstreamEntry::EndBlock: 4200 return true; 4201 4202 case llvm::BitstreamEntry::Record: 4203 // Ignore top-level records. 4204 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4205 break; 4206 else { 4207 // FIXME this drops errors on the floor. 4208 consumeError(Skipped.takeError()); 4209 return true; 4210 } 4211 4212 case llvm::BitstreamEntry::SubBlock: 4213 if (Entry.ID == BlockID) { 4214 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4215 // FIXME this drops the error on the floor. 4216 consumeError(std::move(Err)); 4217 return true; 4218 } 4219 // Found it! 4220 return false; 4221 } 4222 4223 if (llvm::Error Err = Cursor.SkipBlock()) { 4224 // FIXME this drops the error on the floor. 4225 consumeError(std::move(Err)); 4226 return true; 4227 } 4228 } 4229 } 4230 } 4231 4232 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4233 ModuleKind Type, 4234 SourceLocation ImportLoc, 4235 unsigned ClientLoadCapabilities, 4236 SmallVectorImpl<ImportedSubmodule> *Imported) { 4237 llvm::SaveAndRestore<SourceLocation> 4238 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4239 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII( 4240 CurrentDeserializingModuleKind, Type); 4241 4242 // Defer any pending actions until we get to the end of reading the AST file. 4243 Deserializing AnASTFile(this); 4244 4245 // Bump the generation number. 4246 unsigned PreviousGeneration = 0; 4247 if (ContextObj) 4248 PreviousGeneration = incrementGeneration(*ContextObj); 4249 4250 unsigned NumModules = ModuleMgr.size(); 4251 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) { 4252 assert(ReadResult && "expected to return error"); 4253 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4254 PP.getLangOpts().Modules 4255 ? &PP.getHeaderSearchInfo().getModuleMap() 4256 : nullptr); 4257 4258 // If we find that any modules are unusable, the global index is going 4259 // to be out-of-date. Just remove it. 4260 GlobalIndex.reset(); 4261 ModuleMgr.setGlobalIndex(nullptr); 4262 return ReadResult; 4263 }; 4264 4265 SmallVector<ImportedModule, 4> Loaded; 4266 switch (ASTReadResult ReadResult = 4267 ReadASTCore(FileName, Type, ImportLoc, 4268 /*ImportedBy=*/nullptr, Loaded, 0, 0, 4269 ASTFileSignature(), ClientLoadCapabilities)) { 4270 case Failure: 4271 case Missing: 4272 case OutOfDate: 4273 case VersionMismatch: 4274 case ConfigurationMismatch: 4275 case HadErrors: 4276 return removeModulesAndReturn(ReadResult); 4277 case Success: 4278 break; 4279 } 4280 4281 // Here comes stuff that we only do once the entire chain is loaded. 4282 4283 // Load the AST blocks of all of the modules that we loaded. We can still 4284 // hit errors parsing the ASTs at this point. 4285 for (ImportedModule &M : Loaded) { 4286 ModuleFile &F = *M.Mod; 4287 4288 // Read the AST block. 4289 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 4290 return removeModulesAndReturn(Result); 4291 4292 // The AST block should always have a definition for the main module. 4293 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4294 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4295 return removeModulesAndReturn(Failure); 4296 } 4297 4298 // Read the extension blocks. 4299 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4300 if (ASTReadResult Result = ReadExtensionBlock(F)) 4301 return removeModulesAndReturn(Result); 4302 } 4303 4304 // Once read, set the ModuleFile bit base offset and update the size in 4305 // bits of all files we've seen. 4306 F.GlobalBitOffset = TotalModulesSizeInBits; 4307 TotalModulesSizeInBits += F.SizeInBits; 4308 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4309 } 4310 4311 // Preload source locations and interesting indentifiers. 4312 for (ImportedModule &M : Loaded) { 4313 ModuleFile &F = *M.Mod; 4314 4315 // Preload SLocEntries. 4316 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4317 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4318 // Load it through the SourceManager and don't call ReadSLocEntry() 4319 // directly because the entry may have already been loaded in which case 4320 // calling ReadSLocEntry() directly would trigger an assertion in 4321 // SourceManager. 4322 SourceMgr.getLoadedSLocEntryByID(Index); 4323 } 4324 4325 // Map the original source file ID into the ID space of the current 4326 // compilation. 4327 if (F.OriginalSourceFileID.isValid()) { 4328 F.OriginalSourceFileID = FileID::get( 4329 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4330 } 4331 4332 // Preload all the pending interesting identifiers by marking them out of 4333 // date. 4334 for (auto Offset : F.PreloadIdentifierOffsets) { 4335 const unsigned char *Data = F.IdentifierTableData + Offset; 4336 4337 ASTIdentifierLookupTrait Trait(*this, F); 4338 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4339 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4340 auto &II = PP.getIdentifierTable().getOwn(Key); 4341 II.setOutOfDate(true); 4342 4343 // Mark this identifier as being from an AST file so that we can track 4344 // whether we need to serialize it. 4345 markIdentifierFromAST(*this, II); 4346 4347 // Associate the ID with the identifier so that the writer can reuse it. 4348 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4349 SetIdentifierInfo(ID, &II); 4350 } 4351 } 4352 4353 // Setup the import locations and notify the module manager that we've 4354 // committed to these module files. 4355 for (ImportedModule &M : Loaded) { 4356 ModuleFile &F = *M.Mod; 4357 4358 ModuleMgr.moduleFileAccepted(&F); 4359 4360 // Set the import location. 4361 F.DirectImportLoc = ImportLoc; 4362 // FIXME: We assume that locations from PCH / preamble do not need 4363 // any translation. 4364 if (!M.ImportedBy) 4365 F.ImportLoc = M.ImportLoc; 4366 else 4367 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4368 } 4369 4370 if (!PP.getLangOpts().CPlusPlus || 4371 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4372 Type != MK_PrebuiltModule)) { 4373 // Mark all of the identifiers in the identifier table as being out of date, 4374 // so that various accessors know to check the loaded modules when the 4375 // identifier is used. 4376 // 4377 // For C++ modules, we don't need information on many identifiers (just 4378 // those that provide macros or are poisoned), so we mark all of 4379 // the interesting ones via PreloadIdentifierOffsets. 4380 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4381 IdEnd = PP.getIdentifierTable().end(); 4382 Id != IdEnd; ++Id) 4383 Id->second->setOutOfDate(true); 4384 } 4385 // Mark selectors as out of date. 4386 for (auto Sel : SelectorGeneration) 4387 SelectorOutOfDate[Sel.first] = true; 4388 4389 // Resolve any unresolved module exports. 4390 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4391 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4392 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4393 Module *ResolvedMod = getSubmodule(GlobalID); 4394 4395 switch (Unresolved.Kind) { 4396 case UnresolvedModuleRef::Conflict: 4397 if (ResolvedMod) { 4398 Module::Conflict Conflict; 4399 Conflict.Other = ResolvedMod; 4400 Conflict.Message = Unresolved.String.str(); 4401 Unresolved.Mod->Conflicts.push_back(Conflict); 4402 } 4403 continue; 4404 4405 case UnresolvedModuleRef::Import: 4406 if (ResolvedMod) 4407 Unresolved.Mod->Imports.insert(ResolvedMod); 4408 continue; 4409 4410 case UnresolvedModuleRef::Export: 4411 if (ResolvedMod || Unresolved.IsWildcard) 4412 Unresolved.Mod->Exports.push_back( 4413 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4414 continue; 4415 } 4416 } 4417 UnresolvedModuleRefs.clear(); 4418 4419 if (Imported) 4420 Imported->append(ImportedModules.begin(), 4421 ImportedModules.end()); 4422 4423 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4424 // Might be unnecessary as use declarations are only used to build the 4425 // module itself. 4426 4427 if (ContextObj) 4428 InitializeContext(); 4429 4430 if (SemaObj) 4431 UpdateSema(); 4432 4433 if (DeserializationListener) 4434 DeserializationListener->ReaderInitialized(this); 4435 4436 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4437 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4438 // If this AST file is a precompiled preamble, then set the 4439 // preamble file ID of the source manager to the file source file 4440 // from which the preamble was built. 4441 if (Type == MK_Preamble) { 4442 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4443 } else if (Type == MK_MainFile) { 4444 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4445 } 4446 } 4447 4448 // For any Objective-C class definitions we have already loaded, make sure 4449 // that we load any additional categories. 4450 if (ContextObj) { 4451 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4452 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4453 ObjCClassesLoaded[I], 4454 PreviousGeneration); 4455 } 4456 } 4457 4458 if (PP.getHeaderSearchInfo() 4459 .getHeaderSearchOpts() 4460 .ModulesValidateOncePerBuildSession) { 4461 // Now we are certain that the module and all modules it depends on are 4462 // up to date. Create or update timestamp files for modules that are 4463 // located in the module cache (not for PCH files that could be anywhere 4464 // in the filesystem). 4465 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4466 ImportedModule &M = Loaded[I]; 4467 if (M.Mod->Kind == MK_ImplicitModule) { 4468 updateModuleTimestamp(*M.Mod); 4469 } 4470 } 4471 } 4472 4473 return Success; 4474 } 4475 4476 static ASTFileSignature readASTFileSignature(StringRef PCH); 4477 4478 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4479 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4480 // FIXME checking magic headers is done in other places such as 4481 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4482 // always done the same. Unify it all with a helper. 4483 if (!Stream.canSkipToPos(4)) 4484 return llvm::createStringError(std::errc::illegal_byte_sequence, 4485 "file too small to contain AST file magic"); 4486 for (unsigned C : {'C', 'P', 'C', 'H'}) 4487 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4488 if (Res.get() != C) 4489 return llvm::createStringError( 4490 std::errc::illegal_byte_sequence, 4491 "file doesn't start with AST file magic"); 4492 } else 4493 return Res.takeError(); 4494 return llvm::Error::success(); 4495 } 4496 4497 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4498 switch (Kind) { 4499 case MK_PCH: 4500 return 0; // PCH 4501 case MK_ImplicitModule: 4502 case MK_ExplicitModule: 4503 case MK_PrebuiltModule: 4504 return 1; // module 4505 case MK_MainFile: 4506 case MK_Preamble: 4507 return 2; // main source file 4508 } 4509 llvm_unreachable("unknown module kind"); 4510 } 4511 4512 ASTReader::ASTReadResult 4513 ASTReader::ReadASTCore(StringRef FileName, 4514 ModuleKind Type, 4515 SourceLocation ImportLoc, 4516 ModuleFile *ImportedBy, 4517 SmallVectorImpl<ImportedModule> &Loaded, 4518 off_t ExpectedSize, time_t ExpectedModTime, 4519 ASTFileSignature ExpectedSignature, 4520 unsigned ClientLoadCapabilities) { 4521 ModuleFile *M; 4522 std::string ErrorStr; 4523 ModuleManager::AddModuleResult AddResult 4524 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4525 getGeneration(), ExpectedSize, ExpectedModTime, 4526 ExpectedSignature, readASTFileSignature, 4527 M, ErrorStr); 4528 4529 switch (AddResult) { 4530 case ModuleManager::AlreadyLoaded: 4531 Diag(diag::remark_module_import) 4532 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4533 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4534 return Success; 4535 4536 case ModuleManager::NewlyLoaded: 4537 // Load module file below. 4538 break; 4539 4540 case ModuleManager::Missing: 4541 // The module file was missing; if the client can handle that, return 4542 // it. 4543 if (ClientLoadCapabilities & ARR_Missing) 4544 return Missing; 4545 4546 // Otherwise, return an error. 4547 Diag(diag::err_ast_file_not_found) 4548 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4549 << ErrorStr; 4550 return Failure; 4551 4552 case ModuleManager::OutOfDate: 4553 // We couldn't load the module file because it is out-of-date. If the 4554 // client can handle out-of-date, return it. 4555 if (ClientLoadCapabilities & ARR_OutOfDate) 4556 return OutOfDate; 4557 4558 // Otherwise, return an error. 4559 Diag(diag::err_ast_file_out_of_date) 4560 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4561 << ErrorStr; 4562 return Failure; 4563 } 4564 4565 assert(M && "Missing module file"); 4566 4567 bool ShouldFinalizePCM = false; 4568 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4569 auto &MC = getModuleManager().getModuleCache(); 4570 if (ShouldFinalizePCM) 4571 MC.finalizePCM(FileName); 4572 else 4573 MC.tryToDropPCM(FileName); 4574 }); 4575 ModuleFile &F = *M; 4576 BitstreamCursor &Stream = F.Stream; 4577 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4578 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4579 4580 // Sniff for the signature. 4581 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4582 Diag(diag::err_ast_file_invalid) 4583 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4584 return Failure; 4585 } 4586 4587 // This is used for compatibility with older PCH formats. 4588 bool HaveReadControlBlock = false; 4589 while (true) { 4590 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4591 if (!MaybeEntry) { 4592 Error(MaybeEntry.takeError()); 4593 return Failure; 4594 } 4595 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4596 4597 switch (Entry.Kind) { 4598 case llvm::BitstreamEntry::Error: 4599 case llvm::BitstreamEntry::Record: 4600 case llvm::BitstreamEntry::EndBlock: 4601 Error("invalid record at top-level of AST file"); 4602 return Failure; 4603 4604 case llvm::BitstreamEntry::SubBlock: 4605 break; 4606 } 4607 4608 switch (Entry.ID) { 4609 case CONTROL_BLOCK_ID: 4610 HaveReadControlBlock = true; 4611 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4612 case Success: 4613 // Check that we didn't try to load a non-module AST file as a module. 4614 // 4615 // FIXME: Should we also perform the converse check? Loading a module as 4616 // a PCH file sort of works, but it's a bit wonky. 4617 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4618 Type == MK_PrebuiltModule) && 4619 F.ModuleName.empty()) { 4620 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4621 if (Result != OutOfDate || 4622 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4623 Diag(diag::err_module_file_not_module) << FileName; 4624 return Result; 4625 } 4626 break; 4627 4628 case Failure: return Failure; 4629 case Missing: return Missing; 4630 case OutOfDate: return OutOfDate; 4631 case VersionMismatch: return VersionMismatch; 4632 case ConfigurationMismatch: return ConfigurationMismatch; 4633 case HadErrors: return HadErrors; 4634 } 4635 break; 4636 4637 case AST_BLOCK_ID: 4638 if (!HaveReadControlBlock) { 4639 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4640 Diag(diag::err_pch_version_too_old); 4641 return VersionMismatch; 4642 } 4643 4644 // Record that we've loaded this module. 4645 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4646 ShouldFinalizePCM = true; 4647 return Success; 4648 4649 case UNHASHED_CONTROL_BLOCK_ID: 4650 // This block is handled using look-ahead during ReadControlBlock. We 4651 // shouldn't get here! 4652 Error("malformed block record in AST file"); 4653 return Failure; 4654 4655 default: 4656 if (llvm::Error Err = Stream.SkipBlock()) { 4657 Error(std::move(Err)); 4658 return Failure; 4659 } 4660 break; 4661 } 4662 } 4663 4664 llvm_unreachable("unexpected break; expected return"); 4665 } 4666 4667 ASTReader::ASTReadResult 4668 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4669 unsigned ClientLoadCapabilities) { 4670 const HeaderSearchOptions &HSOpts = 4671 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4672 bool AllowCompatibleConfigurationMismatch = 4673 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4674 bool DisableValidation = shouldDisableValidationForFile(F); 4675 4676 ASTReadResult Result = readUnhashedControlBlockImpl( 4677 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4678 Listener.get(), 4679 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4680 4681 // If F was directly imported by another module, it's implicitly validated by 4682 // the importing module. 4683 if (DisableValidation || WasImportedBy || 4684 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4685 return Success; 4686 4687 if (Result == Failure) { 4688 Error("malformed block record in AST file"); 4689 return Failure; 4690 } 4691 4692 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4693 // If this module has already been finalized in the ModuleCache, we're stuck 4694 // with it; we can only load a single version of each module. 4695 // 4696 // This can happen when a module is imported in two contexts: in one, as a 4697 // user module; in another, as a system module (due to an import from 4698 // another module marked with the [system] flag). It usually indicates a 4699 // bug in the module map: this module should also be marked with [system]. 4700 // 4701 // If -Wno-system-headers (the default), and the first import is as a 4702 // system module, then validation will fail during the as-user import, 4703 // since -Werror flags won't have been validated. However, it's reasonable 4704 // to treat this consistently as a system module. 4705 // 4706 // If -Wsystem-headers, the PCM on disk was built with 4707 // -Wno-system-headers, and the first import is as a user module, then 4708 // validation will fail during the as-system import since the PCM on disk 4709 // doesn't guarantee that -Werror was respected. However, the -Werror 4710 // flags were checked during the initial as-user import. 4711 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4712 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4713 return Success; 4714 } 4715 } 4716 4717 return Result; 4718 } 4719 4720 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4721 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4722 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4723 bool ValidateDiagnosticOptions) { 4724 // Initialize a stream. 4725 BitstreamCursor Stream(StreamData); 4726 4727 // Sniff for the signature. 4728 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4729 // FIXME this drops the error on the floor. 4730 consumeError(std::move(Err)); 4731 return Failure; 4732 } 4733 4734 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4735 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4736 return Failure; 4737 4738 // Read all of the records in the options block. 4739 RecordData Record; 4740 ASTReadResult Result = Success; 4741 while (true) { 4742 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4743 if (!MaybeEntry) { 4744 // FIXME this drops the error on the floor. 4745 consumeError(MaybeEntry.takeError()); 4746 return Failure; 4747 } 4748 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4749 4750 switch (Entry.Kind) { 4751 case llvm::BitstreamEntry::Error: 4752 case llvm::BitstreamEntry::SubBlock: 4753 return Failure; 4754 4755 case llvm::BitstreamEntry::EndBlock: 4756 return Result; 4757 4758 case llvm::BitstreamEntry::Record: 4759 // The interesting case. 4760 break; 4761 } 4762 4763 // Read and process a record. 4764 Record.clear(); 4765 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4766 if (!MaybeRecordType) { 4767 // FIXME this drops the error. 4768 return Failure; 4769 } 4770 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4771 case SIGNATURE: 4772 if (F) 4773 F->Signature = ASTFileSignature::create(Record.begin(), Record.end()); 4774 break; 4775 case AST_BLOCK_HASH: 4776 if (F) 4777 F->ASTBlockHash = 4778 ASTFileSignature::create(Record.begin(), Record.end()); 4779 break; 4780 case DIAGNOSTIC_OPTIONS: { 4781 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4782 if (Listener && ValidateDiagnosticOptions && 4783 !AllowCompatibleConfigurationMismatch && 4784 ParseDiagnosticOptions(Record, Complain, *Listener)) 4785 Result = OutOfDate; // Don't return early. Read the signature. 4786 break; 4787 } 4788 case DIAG_PRAGMA_MAPPINGS: 4789 if (!F) 4790 break; 4791 if (F->PragmaDiagMappings.empty()) 4792 F->PragmaDiagMappings.swap(Record); 4793 else 4794 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4795 Record.begin(), Record.end()); 4796 break; 4797 } 4798 } 4799 } 4800 4801 /// Parse a record and blob containing module file extension metadata. 4802 static bool parseModuleFileExtensionMetadata( 4803 const SmallVectorImpl<uint64_t> &Record, 4804 StringRef Blob, 4805 ModuleFileExtensionMetadata &Metadata) { 4806 if (Record.size() < 4) return true; 4807 4808 Metadata.MajorVersion = Record[0]; 4809 Metadata.MinorVersion = Record[1]; 4810 4811 unsigned BlockNameLen = Record[2]; 4812 unsigned UserInfoLen = Record[3]; 4813 4814 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4815 4816 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4817 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4818 Blob.data() + BlockNameLen + UserInfoLen); 4819 return false; 4820 } 4821 4822 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4823 BitstreamCursor &Stream = F.Stream; 4824 4825 RecordData Record; 4826 while (true) { 4827 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4828 if (!MaybeEntry) { 4829 Error(MaybeEntry.takeError()); 4830 return Failure; 4831 } 4832 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4833 4834 switch (Entry.Kind) { 4835 case llvm::BitstreamEntry::SubBlock: 4836 if (llvm::Error Err = Stream.SkipBlock()) { 4837 Error(std::move(Err)); 4838 return Failure; 4839 } 4840 continue; 4841 4842 case llvm::BitstreamEntry::EndBlock: 4843 return Success; 4844 4845 case llvm::BitstreamEntry::Error: 4846 return HadErrors; 4847 4848 case llvm::BitstreamEntry::Record: 4849 break; 4850 } 4851 4852 Record.clear(); 4853 StringRef Blob; 4854 Expected<unsigned> MaybeRecCode = 4855 Stream.readRecord(Entry.ID, Record, &Blob); 4856 if (!MaybeRecCode) { 4857 Error(MaybeRecCode.takeError()); 4858 return Failure; 4859 } 4860 switch (MaybeRecCode.get()) { 4861 case EXTENSION_METADATA: { 4862 ModuleFileExtensionMetadata Metadata; 4863 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) { 4864 Error("malformed EXTENSION_METADATA in AST file"); 4865 return Failure; 4866 } 4867 4868 // Find a module file extension with this block name. 4869 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4870 if (Known == ModuleFileExtensions.end()) break; 4871 4872 // Form a reader. 4873 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4874 F, Stream)) { 4875 F.ExtensionReaders.push_back(std::move(Reader)); 4876 } 4877 4878 break; 4879 } 4880 } 4881 } 4882 4883 return Success; 4884 } 4885 4886 void ASTReader::InitializeContext() { 4887 assert(ContextObj && "no context to initialize"); 4888 ASTContext &Context = *ContextObj; 4889 4890 // If there's a listener, notify them that we "read" the translation unit. 4891 if (DeserializationListener) 4892 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4893 Context.getTranslationUnitDecl()); 4894 4895 // FIXME: Find a better way to deal with collisions between these 4896 // built-in types. Right now, we just ignore the problem. 4897 4898 // Load the special types. 4899 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4900 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4901 if (!Context.CFConstantStringTypeDecl) 4902 Context.setCFConstantStringType(GetType(String)); 4903 } 4904 4905 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4906 QualType FileType = GetType(File); 4907 if (FileType.isNull()) { 4908 Error("FILE type is NULL"); 4909 return; 4910 } 4911 4912 if (!Context.FILEDecl) { 4913 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4914 Context.setFILEDecl(Typedef->getDecl()); 4915 else { 4916 const TagType *Tag = FileType->getAs<TagType>(); 4917 if (!Tag) { 4918 Error("Invalid FILE type in AST file"); 4919 return; 4920 } 4921 Context.setFILEDecl(Tag->getDecl()); 4922 } 4923 } 4924 } 4925 4926 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4927 QualType Jmp_bufType = GetType(Jmp_buf); 4928 if (Jmp_bufType.isNull()) { 4929 Error("jmp_buf type is NULL"); 4930 return; 4931 } 4932 4933 if (!Context.jmp_bufDecl) { 4934 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4935 Context.setjmp_bufDecl(Typedef->getDecl()); 4936 else { 4937 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4938 if (!Tag) { 4939 Error("Invalid jmp_buf type in AST file"); 4940 return; 4941 } 4942 Context.setjmp_bufDecl(Tag->getDecl()); 4943 } 4944 } 4945 } 4946 4947 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4948 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4949 if (Sigjmp_bufType.isNull()) { 4950 Error("sigjmp_buf type is NULL"); 4951 return; 4952 } 4953 4954 if (!Context.sigjmp_bufDecl) { 4955 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4956 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4957 else { 4958 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4959 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4960 Context.setsigjmp_bufDecl(Tag->getDecl()); 4961 } 4962 } 4963 } 4964 4965 if (unsigned ObjCIdRedef 4966 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4967 if (Context.ObjCIdRedefinitionType.isNull()) 4968 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4969 } 4970 4971 if (unsigned ObjCClassRedef 4972 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4973 if (Context.ObjCClassRedefinitionType.isNull()) 4974 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4975 } 4976 4977 if (unsigned ObjCSelRedef 4978 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4979 if (Context.ObjCSelRedefinitionType.isNull()) 4980 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4981 } 4982 4983 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4984 QualType Ucontext_tType = GetType(Ucontext_t); 4985 if (Ucontext_tType.isNull()) { 4986 Error("ucontext_t type is NULL"); 4987 return; 4988 } 4989 4990 if (!Context.ucontext_tDecl) { 4991 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4992 Context.setucontext_tDecl(Typedef->getDecl()); 4993 else { 4994 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4995 assert(Tag && "Invalid ucontext_t type in AST file"); 4996 Context.setucontext_tDecl(Tag->getDecl()); 4997 } 4998 } 4999 } 5000 } 5001 5002 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 5003 5004 // If there were any CUDA special declarations, deserialize them. 5005 if (!CUDASpecialDeclRefs.empty()) { 5006 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 5007 Context.setcudaConfigureCallDecl( 5008 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 5009 } 5010 5011 // Re-export any modules that were imported by a non-module AST file. 5012 // FIXME: This does not make macro-only imports visible again. 5013 for (auto &Import : ImportedModules) { 5014 if (Module *Imported = getSubmodule(Import.ID)) { 5015 makeModuleVisible(Imported, Module::AllVisible, 5016 /*ImportLoc=*/Import.ImportLoc); 5017 if (Import.ImportLoc.isValid()) 5018 PP.makeModuleVisible(Imported, Import.ImportLoc); 5019 // This updates visibility for Preprocessor only. For Sema, which can be 5020 // nullptr here, we do the same later, in UpdateSema(). 5021 } 5022 } 5023 } 5024 5025 void ASTReader::finalizeForWriting() { 5026 // Nothing to do for now. 5027 } 5028 5029 /// Reads and return the signature record from \p PCH's control block, or 5030 /// else returns 0. 5031 static ASTFileSignature readASTFileSignature(StringRef PCH) { 5032 BitstreamCursor Stream(PCH); 5033 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5034 // FIXME this drops the error on the floor. 5035 consumeError(std::move(Err)); 5036 return ASTFileSignature(); 5037 } 5038 5039 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5040 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 5041 return ASTFileSignature(); 5042 5043 // Scan for SIGNATURE inside the diagnostic options block. 5044 ASTReader::RecordData Record; 5045 while (true) { 5046 Expected<llvm::BitstreamEntry> MaybeEntry = 5047 Stream.advanceSkippingSubblocks(); 5048 if (!MaybeEntry) { 5049 // FIXME this drops the error on the floor. 5050 consumeError(MaybeEntry.takeError()); 5051 return ASTFileSignature(); 5052 } 5053 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5054 5055 if (Entry.Kind != llvm::BitstreamEntry::Record) 5056 return ASTFileSignature(); 5057 5058 Record.clear(); 5059 StringRef Blob; 5060 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5061 if (!MaybeRecord) { 5062 // FIXME this drops the error on the floor. 5063 consumeError(MaybeRecord.takeError()); 5064 return ASTFileSignature(); 5065 } 5066 if (SIGNATURE == MaybeRecord.get()) 5067 return ASTFileSignature::create(Record.begin(), 5068 Record.begin() + ASTFileSignature::size); 5069 } 5070 } 5071 5072 /// Retrieve the name of the original source file name 5073 /// directly from the AST file, without actually loading the AST 5074 /// file. 5075 std::string ASTReader::getOriginalSourceFile( 5076 const std::string &ASTFileName, FileManager &FileMgr, 5077 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5078 // Open the AST file. 5079 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5080 if (!Buffer) { 5081 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5082 << ASTFileName << Buffer.getError().message(); 5083 return std::string(); 5084 } 5085 5086 // Initialize the stream 5087 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5088 5089 // Sniff for the signature. 5090 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5091 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5092 return std::string(); 5093 } 5094 5095 // Scan for the CONTROL_BLOCK_ID block. 5096 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5097 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5098 return std::string(); 5099 } 5100 5101 // Scan for ORIGINAL_FILE inside the control block. 5102 RecordData Record; 5103 while (true) { 5104 Expected<llvm::BitstreamEntry> MaybeEntry = 5105 Stream.advanceSkippingSubblocks(); 5106 if (!MaybeEntry) { 5107 // FIXME this drops errors on the floor. 5108 consumeError(MaybeEntry.takeError()); 5109 return std::string(); 5110 } 5111 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5112 5113 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5114 return std::string(); 5115 5116 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5117 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5118 return std::string(); 5119 } 5120 5121 Record.clear(); 5122 StringRef Blob; 5123 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5124 if (!MaybeRecord) { 5125 // FIXME this drops the errors on the floor. 5126 consumeError(MaybeRecord.takeError()); 5127 return std::string(); 5128 } 5129 if (ORIGINAL_FILE == MaybeRecord.get()) 5130 return Blob.str(); 5131 } 5132 } 5133 5134 namespace { 5135 5136 class SimplePCHValidator : public ASTReaderListener { 5137 const LangOptions &ExistingLangOpts; 5138 const TargetOptions &ExistingTargetOpts; 5139 const PreprocessorOptions &ExistingPPOpts; 5140 std::string ExistingModuleCachePath; 5141 FileManager &FileMgr; 5142 5143 public: 5144 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5145 const TargetOptions &ExistingTargetOpts, 5146 const PreprocessorOptions &ExistingPPOpts, 5147 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5148 : ExistingLangOpts(ExistingLangOpts), 5149 ExistingTargetOpts(ExistingTargetOpts), 5150 ExistingPPOpts(ExistingPPOpts), 5151 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5152 5153 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5154 bool AllowCompatibleDifferences) override { 5155 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5156 AllowCompatibleDifferences); 5157 } 5158 5159 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5160 bool AllowCompatibleDifferences) override { 5161 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5162 AllowCompatibleDifferences); 5163 } 5164 5165 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5166 StringRef SpecificModuleCachePath, 5167 bool Complain) override { 5168 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5169 ExistingModuleCachePath, 5170 nullptr, ExistingLangOpts); 5171 } 5172 5173 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5174 bool Complain, 5175 std::string &SuggestedPredefines) override { 5176 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5177 SuggestedPredefines, ExistingLangOpts); 5178 } 5179 }; 5180 5181 } // namespace 5182 5183 bool ASTReader::readASTFileControlBlock( 5184 StringRef Filename, FileManager &FileMgr, 5185 const PCHContainerReader &PCHContainerRdr, 5186 bool FindModuleFileExtensions, 5187 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5188 // Open the AST file. 5189 // FIXME: This allows use of the VFS; we do not allow use of the 5190 // VFS when actually loading a module. 5191 auto Buffer = FileMgr.getBufferForFile(Filename); 5192 if (!Buffer) { 5193 return true; 5194 } 5195 5196 // Initialize the stream 5197 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5198 BitstreamCursor Stream(Bytes); 5199 5200 // Sniff for the signature. 5201 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5202 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5203 return true; 5204 } 5205 5206 // Scan for the CONTROL_BLOCK_ID block. 5207 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5208 return true; 5209 5210 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5211 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5212 bool NeedsImports = Listener.needsImportVisitation(); 5213 BitstreamCursor InputFilesCursor; 5214 5215 RecordData Record; 5216 std::string ModuleDir; 5217 bool DoneWithControlBlock = false; 5218 while (!DoneWithControlBlock) { 5219 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5220 if (!MaybeEntry) { 5221 // FIXME this drops the error on the floor. 5222 consumeError(MaybeEntry.takeError()); 5223 return true; 5224 } 5225 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5226 5227 switch (Entry.Kind) { 5228 case llvm::BitstreamEntry::SubBlock: { 5229 switch (Entry.ID) { 5230 case OPTIONS_BLOCK_ID: { 5231 std::string IgnoredSuggestedPredefines; 5232 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5233 /*AllowCompatibleConfigurationMismatch*/ false, 5234 Listener, IgnoredSuggestedPredefines) != Success) 5235 return true; 5236 break; 5237 } 5238 5239 case INPUT_FILES_BLOCK_ID: 5240 InputFilesCursor = Stream; 5241 if (llvm::Error Err = Stream.SkipBlock()) { 5242 // FIXME this drops the error on the floor. 5243 consumeError(std::move(Err)); 5244 return true; 5245 } 5246 if (NeedsInputFiles && 5247 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5248 return true; 5249 break; 5250 5251 default: 5252 if (llvm::Error Err = Stream.SkipBlock()) { 5253 // FIXME this drops the error on the floor. 5254 consumeError(std::move(Err)); 5255 return true; 5256 } 5257 break; 5258 } 5259 5260 continue; 5261 } 5262 5263 case llvm::BitstreamEntry::EndBlock: 5264 DoneWithControlBlock = true; 5265 break; 5266 5267 case llvm::BitstreamEntry::Error: 5268 return true; 5269 5270 case llvm::BitstreamEntry::Record: 5271 break; 5272 } 5273 5274 if (DoneWithControlBlock) break; 5275 5276 Record.clear(); 5277 StringRef Blob; 5278 Expected<unsigned> MaybeRecCode = 5279 Stream.readRecord(Entry.ID, Record, &Blob); 5280 if (!MaybeRecCode) { 5281 // FIXME this drops the error. 5282 return Failure; 5283 } 5284 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5285 case METADATA: 5286 if (Record[0] != VERSION_MAJOR) 5287 return true; 5288 if (Listener.ReadFullVersionInformation(Blob)) 5289 return true; 5290 break; 5291 case MODULE_NAME: 5292 Listener.ReadModuleName(Blob); 5293 break; 5294 case MODULE_DIRECTORY: 5295 ModuleDir = std::string(Blob); 5296 break; 5297 case MODULE_MAP_FILE: { 5298 unsigned Idx = 0; 5299 auto Path = ReadString(Record, Idx); 5300 ResolveImportedPath(Path, ModuleDir); 5301 Listener.ReadModuleMapFile(Path); 5302 break; 5303 } 5304 case INPUT_FILE_OFFSETS: { 5305 if (!NeedsInputFiles) 5306 break; 5307 5308 unsigned NumInputFiles = Record[0]; 5309 unsigned NumUserFiles = Record[1]; 5310 const llvm::support::unaligned_uint64_t *InputFileOffs = 5311 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5312 for (unsigned I = 0; I != NumInputFiles; ++I) { 5313 // Go find this input file. 5314 bool isSystemFile = I >= NumUserFiles; 5315 5316 if (isSystemFile && !NeedsSystemInputFiles) 5317 break; // the rest are system input files 5318 5319 BitstreamCursor &Cursor = InputFilesCursor; 5320 SavedStreamPosition SavedPosition(Cursor); 5321 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5322 // FIXME this drops errors on the floor. 5323 consumeError(std::move(Err)); 5324 } 5325 5326 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5327 if (!MaybeCode) { 5328 // FIXME this drops errors on the floor. 5329 consumeError(MaybeCode.takeError()); 5330 } 5331 unsigned Code = MaybeCode.get(); 5332 5333 RecordData Record; 5334 StringRef Blob; 5335 bool shouldContinue = false; 5336 Expected<unsigned> MaybeRecordType = 5337 Cursor.readRecord(Code, Record, &Blob); 5338 if (!MaybeRecordType) { 5339 // FIXME this drops errors on the floor. 5340 consumeError(MaybeRecordType.takeError()); 5341 } 5342 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5343 case INPUT_FILE_HASH: 5344 break; 5345 case INPUT_FILE: 5346 bool Overridden = static_cast<bool>(Record[3]); 5347 std::string Filename = std::string(Blob); 5348 ResolveImportedPath(Filename, ModuleDir); 5349 shouldContinue = Listener.visitInputFile( 5350 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5351 break; 5352 } 5353 if (!shouldContinue) 5354 break; 5355 } 5356 break; 5357 } 5358 5359 case IMPORTS: { 5360 if (!NeedsImports) 5361 break; 5362 5363 unsigned Idx = 0, N = Record.size(); 5364 while (Idx < N) { 5365 // Read information about the AST file. 5366 Idx += 5367 1 + 1 + 1 + 1 + 5368 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature 5369 std::string ModuleName = ReadString(Record, Idx); 5370 std::string Filename = ReadString(Record, Idx); 5371 ResolveImportedPath(Filename, ModuleDir); 5372 Listener.visitImport(ModuleName, Filename); 5373 } 5374 break; 5375 } 5376 5377 default: 5378 // No other validation to perform. 5379 break; 5380 } 5381 } 5382 5383 // Look for module file extension blocks, if requested. 5384 if (FindModuleFileExtensions) { 5385 BitstreamCursor SavedStream = Stream; 5386 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5387 bool DoneWithExtensionBlock = false; 5388 while (!DoneWithExtensionBlock) { 5389 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5390 if (!MaybeEntry) { 5391 // FIXME this drops the error. 5392 return true; 5393 } 5394 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5395 5396 switch (Entry.Kind) { 5397 case llvm::BitstreamEntry::SubBlock: 5398 if (llvm::Error Err = Stream.SkipBlock()) { 5399 // FIXME this drops the error on the floor. 5400 consumeError(std::move(Err)); 5401 return true; 5402 } 5403 continue; 5404 5405 case llvm::BitstreamEntry::EndBlock: 5406 DoneWithExtensionBlock = true; 5407 continue; 5408 5409 case llvm::BitstreamEntry::Error: 5410 return true; 5411 5412 case llvm::BitstreamEntry::Record: 5413 break; 5414 } 5415 5416 Record.clear(); 5417 StringRef Blob; 5418 Expected<unsigned> MaybeRecCode = 5419 Stream.readRecord(Entry.ID, Record, &Blob); 5420 if (!MaybeRecCode) { 5421 // FIXME this drops the error. 5422 return true; 5423 } 5424 switch (MaybeRecCode.get()) { 5425 case EXTENSION_METADATA: { 5426 ModuleFileExtensionMetadata Metadata; 5427 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5428 return true; 5429 5430 Listener.readModuleFileExtension(Metadata); 5431 break; 5432 } 5433 } 5434 } 5435 } 5436 Stream = SavedStream; 5437 } 5438 5439 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5440 if (readUnhashedControlBlockImpl( 5441 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5442 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5443 ValidateDiagnosticOptions) != Success) 5444 return true; 5445 5446 return false; 5447 } 5448 5449 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5450 const PCHContainerReader &PCHContainerRdr, 5451 const LangOptions &LangOpts, 5452 const TargetOptions &TargetOpts, 5453 const PreprocessorOptions &PPOpts, 5454 StringRef ExistingModuleCachePath) { 5455 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5456 ExistingModuleCachePath, FileMgr); 5457 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5458 /*FindModuleFileExtensions=*/false, 5459 validator, 5460 /*ValidateDiagnosticOptions=*/true); 5461 } 5462 5463 ASTReader::ASTReadResult 5464 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 5465 // Enter the submodule block. 5466 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 5467 Error(std::move(Err)); 5468 return Failure; 5469 } 5470 5471 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5472 bool First = true; 5473 Module *CurrentModule = nullptr; 5474 RecordData Record; 5475 while (true) { 5476 Expected<llvm::BitstreamEntry> MaybeEntry = 5477 F.Stream.advanceSkippingSubblocks(); 5478 if (!MaybeEntry) { 5479 Error(MaybeEntry.takeError()); 5480 return Failure; 5481 } 5482 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5483 5484 switch (Entry.Kind) { 5485 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5486 case llvm::BitstreamEntry::Error: 5487 Error("malformed block record in AST file"); 5488 return Failure; 5489 case llvm::BitstreamEntry::EndBlock: 5490 return Success; 5491 case llvm::BitstreamEntry::Record: 5492 // The interesting case. 5493 break; 5494 } 5495 5496 // Read a record. 5497 StringRef Blob; 5498 Record.clear(); 5499 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5500 if (!MaybeKind) { 5501 Error(MaybeKind.takeError()); 5502 return Failure; 5503 } 5504 unsigned Kind = MaybeKind.get(); 5505 5506 if ((Kind == SUBMODULE_METADATA) != First) { 5507 Error("submodule metadata record should be at beginning of block"); 5508 return Failure; 5509 } 5510 First = false; 5511 5512 // Submodule information is only valid if we have a current module. 5513 // FIXME: Should we error on these cases? 5514 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5515 Kind != SUBMODULE_DEFINITION) 5516 continue; 5517 5518 switch (Kind) { 5519 default: // Default behavior: ignore. 5520 break; 5521 5522 case SUBMODULE_DEFINITION: { 5523 if (Record.size() < 12) { 5524 Error("malformed module definition"); 5525 return Failure; 5526 } 5527 5528 StringRef Name = Blob; 5529 unsigned Idx = 0; 5530 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5531 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5532 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5533 bool IsFramework = Record[Idx++]; 5534 bool IsExplicit = Record[Idx++]; 5535 bool IsSystem = Record[Idx++]; 5536 bool IsExternC = Record[Idx++]; 5537 bool InferSubmodules = Record[Idx++]; 5538 bool InferExplicitSubmodules = Record[Idx++]; 5539 bool InferExportWildcard = Record[Idx++]; 5540 bool ConfigMacrosExhaustive = Record[Idx++]; 5541 bool ModuleMapIsPrivate = Record[Idx++]; 5542 5543 Module *ParentModule = nullptr; 5544 if (Parent) 5545 ParentModule = getSubmodule(Parent); 5546 5547 // Retrieve this (sub)module from the module map, creating it if 5548 // necessary. 5549 CurrentModule = 5550 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5551 .first; 5552 5553 // FIXME: set the definition loc for CurrentModule, or call 5554 // ModMap.setInferredModuleAllowedBy() 5555 5556 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5557 if (GlobalIndex >= SubmodulesLoaded.size() || 5558 SubmodulesLoaded[GlobalIndex]) { 5559 Error("too many submodules"); 5560 return Failure; 5561 } 5562 5563 if (!ParentModule) { 5564 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5565 // Don't emit module relocation error if we have -fno-validate-pch 5566 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 5567 DisableValidationForModuleKind::Module) && 5568 CurFile != F.File) { 5569 Error(diag::err_module_file_conflict, 5570 CurrentModule->getTopLevelModuleName(), CurFile->getName(), 5571 F.File->getName()); 5572 return Failure; 5573 } 5574 } 5575 5576 F.DidReadTopLevelSubmodule = true; 5577 CurrentModule->setASTFile(F.File); 5578 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5579 } 5580 5581 CurrentModule->Kind = Kind; 5582 CurrentModule->Signature = F.Signature; 5583 CurrentModule->IsFromModuleFile = true; 5584 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5585 CurrentModule->IsExternC = IsExternC; 5586 CurrentModule->InferSubmodules = InferSubmodules; 5587 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5588 CurrentModule->InferExportWildcard = InferExportWildcard; 5589 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5590 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5591 if (DeserializationListener) 5592 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5593 5594 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5595 5596 // Clear out data that will be replaced by what is in the module file. 5597 CurrentModule->LinkLibraries.clear(); 5598 CurrentModule->ConfigMacros.clear(); 5599 CurrentModule->UnresolvedConflicts.clear(); 5600 CurrentModule->Conflicts.clear(); 5601 5602 // The module is available unless it's missing a requirement; relevant 5603 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5604 // Missing headers that were present when the module was built do not 5605 // make it unavailable -- if we got this far, this must be an explicitly 5606 // imported module file. 5607 CurrentModule->Requirements.clear(); 5608 CurrentModule->MissingHeaders.clear(); 5609 CurrentModule->IsUnimportable = 5610 ParentModule && ParentModule->IsUnimportable; 5611 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable; 5612 break; 5613 } 5614 5615 case SUBMODULE_UMBRELLA_HEADER: { 5616 std::string Filename = std::string(Blob); 5617 ResolveImportedPath(F, Filename); 5618 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5619 if (!CurrentModule->getUmbrellaHeader()) 5620 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob); 5621 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) { 5622 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5623 Error("mismatched umbrella headers in submodule"); 5624 return OutOfDate; 5625 } 5626 } 5627 break; 5628 } 5629 5630 case SUBMODULE_HEADER: 5631 case SUBMODULE_EXCLUDED_HEADER: 5632 case SUBMODULE_PRIVATE_HEADER: 5633 // We lazily associate headers with their modules via the HeaderInfo table. 5634 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5635 // of complete filenames or remove it entirely. 5636 break; 5637 5638 case SUBMODULE_TEXTUAL_HEADER: 5639 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5640 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5641 // them here. 5642 break; 5643 5644 case SUBMODULE_TOPHEADER: 5645 CurrentModule->addTopHeaderFilename(Blob); 5646 break; 5647 5648 case SUBMODULE_UMBRELLA_DIR: { 5649 std::string Dirname = std::string(Blob); 5650 ResolveImportedPath(F, Dirname); 5651 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5652 if (!CurrentModule->getUmbrellaDir()) 5653 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob); 5654 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) { 5655 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5656 Error("mismatched umbrella directories in submodule"); 5657 return OutOfDate; 5658 } 5659 } 5660 break; 5661 } 5662 5663 case SUBMODULE_METADATA: { 5664 F.BaseSubmoduleID = getTotalNumSubmodules(); 5665 F.LocalNumSubmodules = Record[0]; 5666 unsigned LocalBaseSubmoduleID = Record[1]; 5667 if (F.LocalNumSubmodules > 0) { 5668 // Introduce the global -> local mapping for submodules within this 5669 // module. 5670 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5671 5672 // Introduce the local -> global mapping for submodules within this 5673 // module. 5674 F.SubmoduleRemap.insertOrReplace( 5675 std::make_pair(LocalBaseSubmoduleID, 5676 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5677 5678 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5679 } 5680 break; 5681 } 5682 5683 case SUBMODULE_IMPORTS: 5684 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5685 UnresolvedModuleRef Unresolved; 5686 Unresolved.File = &F; 5687 Unresolved.Mod = CurrentModule; 5688 Unresolved.ID = Record[Idx]; 5689 Unresolved.Kind = UnresolvedModuleRef::Import; 5690 Unresolved.IsWildcard = false; 5691 UnresolvedModuleRefs.push_back(Unresolved); 5692 } 5693 break; 5694 5695 case SUBMODULE_EXPORTS: 5696 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5697 UnresolvedModuleRef Unresolved; 5698 Unresolved.File = &F; 5699 Unresolved.Mod = CurrentModule; 5700 Unresolved.ID = Record[Idx]; 5701 Unresolved.Kind = UnresolvedModuleRef::Export; 5702 Unresolved.IsWildcard = Record[Idx + 1]; 5703 UnresolvedModuleRefs.push_back(Unresolved); 5704 } 5705 5706 // Once we've loaded the set of exports, there's no reason to keep 5707 // the parsed, unresolved exports around. 5708 CurrentModule->UnresolvedExports.clear(); 5709 break; 5710 5711 case SUBMODULE_REQUIRES: 5712 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5713 PP.getTargetInfo()); 5714 break; 5715 5716 case SUBMODULE_LINK_LIBRARY: 5717 ModMap.resolveLinkAsDependencies(CurrentModule); 5718 CurrentModule->LinkLibraries.push_back( 5719 Module::LinkLibrary(std::string(Blob), Record[0])); 5720 break; 5721 5722 case SUBMODULE_CONFIG_MACRO: 5723 CurrentModule->ConfigMacros.push_back(Blob.str()); 5724 break; 5725 5726 case SUBMODULE_CONFLICT: { 5727 UnresolvedModuleRef Unresolved; 5728 Unresolved.File = &F; 5729 Unresolved.Mod = CurrentModule; 5730 Unresolved.ID = Record[0]; 5731 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5732 Unresolved.IsWildcard = false; 5733 Unresolved.String = Blob; 5734 UnresolvedModuleRefs.push_back(Unresolved); 5735 break; 5736 } 5737 5738 case SUBMODULE_INITIALIZERS: { 5739 if (!ContextObj) 5740 break; 5741 SmallVector<uint32_t, 16> Inits; 5742 for (auto &ID : Record) 5743 Inits.push_back(getGlobalDeclID(F, ID)); 5744 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5745 break; 5746 } 5747 5748 case SUBMODULE_EXPORT_AS: 5749 CurrentModule->ExportAsModule = Blob.str(); 5750 ModMap.addLinkAsDependency(CurrentModule); 5751 break; 5752 } 5753 } 5754 } 5755 5756 /// Parse the record that corresponds to a LangOptions data 5757 /// structure. 5758 /// 5759 /// This routine parses the language options from the AST file and then gives 5760 /// them to the AST listener if one is set. 5761 /// 5762 /// \returns true if the listener deems the file unacceptable, false otherwise. 5763 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5764 bool Complain, 5765 ASTReaderListener &Listener, 5766 bool AllowCompatibleDifferences) { 5767 LangOptions LangOpts; 5768 unsigned Idx = 0; 5769 #define LANGOPT(Name, Bits, Default, Description) \ 5770 LangOpts.Name = Record[Idx++]; 5771 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5772 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5773 #include "clang/Basic/LangOptions.def" 5774 #define SANITIZER(NAME, ID) \ 5775 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5776 #include "clang/Basic/Sanitizers.def" 5777 5778 for (unsigned N = Record[Idx++]; N; --N) 5779 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5780 5781 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5782 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5783 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5784 5785 LangOpts.CurrentModule = ReadString(Record, Idx); 5786 5787 // Comment options. 5788 for (unsigned N = Record[Idx++]; N; --N) { 5789 LangOpts.CommentOpts.BlockCommandNames.push_back( 5790 ReadString(Record, Idx)); 5791 } 5792 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5793 5794 // OpenMP offloading options. 5795 for (unsigned N = Record[Idx++]; N; --N) { 5796 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5797 } 5798 5799 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5800 5801 return Listener.ReadLanguageOptions(LangOpts, Complain, 5802 AllowCompatibleDifferences); 5803 } 5804 5805 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5806 ASTReaderListener &Listener, 5807 bool AllowCompatibleDifferences) { 5808 unsigned Idx = 0; 5809 TargetOptions TargetOpts; 5810 TargetOpts.Triple = ReadString(Record, Idx); 5811 TargetOpts.CPU = ReadString(Record, Idx); 5812 TargetOpts.TuneCPU = ReadString(Record, Idx); 5813 TargetOpts.ABI = ReadString(Record, Idx); 5814 for (unsigned N = Record[Idx++]; N; --N) { 5815 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5816 } 5817 for (unsigned N = Record[Idx++]; N; --N) { 5818 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5819 } 5820 5821 return Listener.ReadTargetOptions(TargetOpts, Complain, 5822 AllowCompatibleDifferences); 5823 } 5824 5825 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5826 ASTReaderListener &Listener) { 5827 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5828 unsigned Idx = 0; 5829 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5830 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5831 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5832 #include "clang/Basic/DiagnosticOptions.def" 5833 5834 for (unsigned N = Record[Idx++]; N; --N) 5835 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5836 for (unsigned N = Record[Idx++]; N; --N) 5837 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5838 5839 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5840 } 5841 5842 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5843 ASTReaderListener &Listener) { 5844 FileSystemOptions FSOpts; 5845 unsigned Idx = 0; 5846 FSOpts.WorkingDir = ReadString(Record, Idx); 5847 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5848 } 5849 5850 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5851 bool Complain, 5852 ASTReaderListener &Listener) { 5853 HeaderSearchOptions HSOpts; 5854 unsigned Idx = 0; 5855 HSOpts.Sysroot = ReadString(Record, Idx); 5856 5857 // Include entries. 5858 for (unsigned N = Record[Idx++]; N; --N) { 5859 std::string Path = ReadString(Record, Idx); 5860 frontend::IncludeDirGroup Group 5861 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5862 bool IsFramework = Record[Idx++]; 5863 bool IgnoreSysRoot = Record[Idx++]; 5864 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5865 IgnoreSysRoot); 5866 } 5867 5868 // System header prefixes. 5869 for (unsigned N = Record[Idx++]; N; --N) { 5870 std::string Prefix = ReadString(Record, Idx); 5871 bool IsSystemHeader = Record[Idx++]; 5872 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5873 } 5874 5875 HSOpts.ResourceDir = ReadString(Record, Idx); 5876 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5877 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5878 HSOpts.DisableModuleHash = Record[Idx++]; 5879 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5880 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5881 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++]; 5882 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5883 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5884 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5885 HSOpts.UseLibcxx = Record[Idx++]; 5886 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5887 5888 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5889 Complain); 5890 } 5891 5892 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5893 bool Complain, 5894 ASTReaderListener &Listener, 5895 std::string &SuggestedPredefines) { 5896 PreprocessorOptions PPOpts; 5897 unsigned Idx = 0; 5898 5899 // Macro definitions/undefs 5900 for (unsigned N = Record[Idx++]; N; --N) { 5901 std::string Macro = ReadString(Record, Idx); 5902 bool IsUndef = Record[Idx++]; 5903 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5904 } 5905 5906 // Includes 5907 for (unsigned N = Record[Idx++]; N; --N) { 5908 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5909 } 5910 5911 // Macro Includes 5912 for (unsigned N = Record[Idx++]; N; --N) { 5913 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5914 } 5915 5916 PPOpts.UsePredefines = Record[Idx++]; 5917 PPOpts.DetailedRecord = Record[Idx++]; 5918 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5919 PPOpts.ObjCXXARCStandardLibrary = 5920 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5921 SuggestedPredefines.clear(); 5922 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5923 SuggestedPredefines); 5924 } 5925 5926 std::pair<ModuleFile *, unsigned> 5927 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5928 GlobalPreprocessedEntityMapType::iterator 5929 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5930 assert(I != GlobalPreprocessedEntityMap.end() && 5931 "Corrupted global preprocessed entity map"); 5932 ModuleFile *M = I->second; 5933 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5934 return std::make_pair(M, LocalIndex); 5935 } 5936 5937 llvm::iterator_range<PreprocessingRecord::iterator> 5938 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5939 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5940 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5941 Mod.NumPreprocessedEntities); 5942 5943 return llvm::make_range(PreprocessingRecord::iterator(), 5944 PreprocessingRecord::iterator()); 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 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7200 7201 // If this is a named declaration, complete it by looking it up 7202 // within its context. 7203 // 7204 // FIXME: Merging a function definition should merge 7205 // all mergeable entities within it. 7206 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7207 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7208 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7209 if (!getContext().getLangOpts().CPlusPlus && 7210 isa<TranslationUnitDecl>(DC)) { 7211 // Outside of C++, we don't have a lookup table for the TU, so update 7212 // the identifier instead. (For C++ modules, we don't store decls 7213 // in the serialized identifier table, so we do the lookup in the TU.) 7214 auto *II = Name.getAsIdentifierInfo(); 7215 assert(II && "non-identifier name in C?"); 7216 if (II->isOutOfDate()) 7217 updateOutOfDateIdentifier(*II); 7218 } else 7219 DC->lookup(Name); 7220 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7221 // Find all declarations of this kind from the relevant context. 7222 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7223 auto *DC = cast<DeclContext>(DCDecl); 7224 SmallVector<Decl*, 8> Decls; 7225 FindExternalLexicalDecls( 7226 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7227 } 7228 } 7229 } 7230 7231 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7232 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7233 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7234 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7235 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7236 if (auto *Template = FD->getPrimaryTemplate()) 7237 Template->LoadLazySpecializations(); 7238 } 7239 } 7240 7241 CXXCtorInitializer ** 7242 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7243 RecordLocation Loc = getLocalBitOffset(Offset); 7244 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7245 SavedStreamPosition SavedPosition(Cursor); 7246 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7247 Error(std::move(Err)); 7248 return nullptr; 7249 } 7250 ReadingKindTracker ReadingKind(Read_Decl, *this); 7251 7252 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7253 if (!MaybeCode) { 7254 Error(MaybeCode.takeError()); 7255 return nullptr; 7256 } 7257 unsigned Code = MaybeCode.get(); 7258 7259 ASTRecordReader Record(*this, *Loc.F); 7260 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7261 if (!MaybeRecCode) { 7262 Error(MaybeRecCode.takeError()); 7263 return nullptr; 7264 } 7265 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7266 Error("malformed AST file: missing C++ ctor initializers"); 7267 return nullptr; 7268 } 7269 7270 return Record.readCXXCtorInitializers(); 7271 } 7272 7273 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7274 assert(ContextObj && "reading base specifiers with no AST context"); 7275 ASTContext &Context = *ContextObj; 7276 7277 RecordLocation Loc = getLocalBitOffset(Offset); 7278 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7279 SavedStreamPosition SavedPosition(Cursor); 7280 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7281 Error(std::move(Err)); 7282 return nullptr; 7283 } 7284 ReadingKindTracker ReadingKind(Read_Decl, *this); 7285 7286 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7287 if (!MaybeCode) { 7288 Error(MaybeCode.takeError()); 7289 return nullptr; 7290 } 7291 unsigned Code = MaybeCode.get(); 7292 7293 ASTRecordReader Record(*this, *Loc.F); 7294 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7295 if (!MaybeRecCode) { 7296 Error(MaybeCode.takeError()); 7297 return nullptr; 7298 } 7299 unsigned RecCode = MaybeRecCode.get(); 7300 7301 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7302 Error("malformed AST file: missing C++ base specifiers"); 7303 return nullptr; 7304 } 7305 7306 unsigned NumBases = Record.readInt(); 7307 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7308 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7309 for (unsigned I = 0; I != NumBases; ++I) 7310 Bases[I] = Record.readCXXBaseSpecifier(); 7311 return Bases; 7312 } 7313 7314 serialization::DeclID 7315 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7316 if (LocalID < NUM_PREDEF_DECL_IDS) 7317 return LocalID; 7318 7319 if (!F.ModuleOffsetMap.empty()) 7320 ReadModuleOffsetMap(F); 7321 7322 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7323 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7324 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7325 7326 return LocalID + I->second; 7327 } 7328 7329 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7330 ModuleFile &M) const { 7331 // Predefined decls aren't from any module. 7332 if (ID < NUM_PREDEF_DECL_IDS) 7333 return false; 7334 7335 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7336 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7337 } 7338 7339 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7340 if (!D->isFromASTFile()) 7341 return nullptr; 7342 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7343 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7344 return I->second; 7345 } 7346 7347 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7348 if (ID < NUM_PREDEF_DECL_IDS) 7349 return SourceLocation(); 7350 7351 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7352 7353 if (Index > DeclsLoaded.size()) { 7354 Error("declaration ID out-of-range for AST file"); 7355 return SourceLocation(); 7356 } 7357 7358 if (Decl *D = DeclsLoaded[Index]) 7359 return D->getLocation(); 7360 7361 SourceLocation Loc; 7362 DeclCursorForID(ID, Loc); 7363 return Loc; 7364 } 7365 7366 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7367 switch (ID) { 7368 case PREDEF_DECL_NULL_ID: 7369 return nullptr; 7370 7371 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7372 return Context.getTranslationUnitDecl(); 7373 7374 case PREDEF_DECL_OBJC_ID_ID: 7375 return Context.getObjCIdDecl(); 7376 7377 case PREDEF_DECL_OBJC_SEL_ID: 7378 return Context.getObjCSelDecl(); 7379 7380 case PREDEF_DECL_OBJC_CLASS_ID: 7381 return Context.getObjCClassDecl(); 7382 7383 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7384 return Context.getObjCProtocolDecl(); 7385 7386 case PREDEF_DECL_INT_128_ID: 7387 return Context.getInt128Decl(); 7388 7389 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7390 return Context.getUInt128Decl(); 7391 7392 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7393 return Context.getObjCInstanceTypeDecl(); 7394 7395 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7396 return Context.getBuiltinVaListDecl(); 7397 7398 case PREDEF_DECL_VA_LIST_TAG: 7399 return Context.getVaListTagDecl(); 7400 7401 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7402 return Context.getBuiltinMSVaListDecl(); 7403 7404 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7405 return Context.getMSGuidTagDecl(); 7406 7407 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7408 return Context.getExternCContextDecl(); 7409 7410 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7411 return Context.getMakeIntegerSeqDecl(); 7412 7413 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7414 return Context.getCFConstantStringDecl(); 7415 7416 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7417 return Context.getCFConstantStringTagDecl(); 7418 7419 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7420 return Context.getTypePackElementDecl(); 7421 } 7422 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7423 } 7424 7425 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7426 assert(ContextObj && "reading decl with no AST context"); 7427 if (ID < NUM_PREDEF_DECL_IDS) { 7428 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7429 if (D) { 7430 // Track that we have merged the declaration with ID \p ID into the 7431 // pre-existing predefined declaration \p D. 7432 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7433 if (Merged.empty()) 7434 Merged.push_back(ID); 7435 } 7436 return D; 7437 } 7438 7439 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7440 7441 if (Index >= DeclsLoaded.size()) { 7442 assert(0 && "declaration ID out-of-range for AST file"); 7443 Error("declaration ID out-of-range for AST file"); 7444 return nullptr; 7445 } 7446 7447 return DeclsLoaded[Index]; 7448 } 7449 7450 Decl *ASTReader::GetDecl(DeclID ID) { 7451 if (ID < NUM_PREDEF_DECL_IDS) 7452 return GetExistingDecl(ID); 7453 7454 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7455 7456 if (Index >= DeclsLoaded.size()) { 7457 assert(0 && "declaration ID out-of-range for AST file"); 7458 Error("declaration ID out-of-range for AST file"); 7459 return nullptr; 7460 } 7461 7462 if (!DeclsLoaded[Index]) { 7463 ReadDeclRecord(ID); 7464 if (DeserializationListener) 7465 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7466 } 7467 7468 return DeclsLoaded[Index]; 7469 } 7470 7471 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7472 DeclID GlobalID) { 7473 if (GlobalID < NUM_PREDEF_DECL_IDS) 7474 return GlobalID; 7475 7476 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7477 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7478 ModuleFile *Owner = I->second; 7479 7480 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7481 = M.GlobalToLocalDeclIDs.find(Owner); 7482 if (Pos == M.GlobalToLocalDeclIDs.end()) 7483 return 0; 7484 7485 return GlobalID - Owner->BaseDeclID + Pos->second; 7486 } 7487 7488 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7489 const RecordData &Record, 7490 unsigned &Idx) { 7491 if (Idx >= Record.size()) { 7492 Error("Corrupted AST file"); 7493 return 0; 7494 } 7495 7496 return getGlobalDeclID(F, Record[Idx++]); 7497 } 7498 7499 /// Resolve the offset of a statement into a statement. 7500 /// 7501 /// This operation will read a new statement from the external 7502 /// source each time it is called, and is meant to be used via a 7503 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7504 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7505 // Switch case IDs are per Decl. 7506 ClearSwitchCaseIDs(); 7507 7508 // Offset here is a global offset across the entire chain. 7509 RecordLocation Loc = getLocalBitOffset(Offset); 7510 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7511 Error(std::move(Err)); 7512 return nullptr; 7513 } 7514 assert(NumCurrentElementsDeserializing == 0 && 7515 "should not be called while already deserializing"); 7516 Deserializing D(this); 7517 return ReadStmtFromStream(*Loc.F); 7518 } 7519 7520 void ASTReader::FindExternalLexicalDecls( 7521 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7522 SmallVectorImpl<Decl *> &Decls) { 7523 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7524 7525 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7526 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7527 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7528 auto K = (Decl::Kind)+LexicalDecls[I]; 7529 if (!IsKindWeWant(K)) 7530 continue; 7531 7532 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7533 7534 // Don't add predefined declarations to the lexical context more 7535 // than once. 7536 if (ID < NUM_PREDEF_DECL_IDS) { 7537 if (PredefsVisited[ID]) 7538 continue; 7539 7540 PredefsVisited[ID] = true; 7541 } 7542 7543 if (Decl *D = GetLocalDecl(*M, ID)) { 7544 assert(D->getKind() == K && "wrong kind for lexical decl"); 7545 if (!DC->isDeclInLexicalTraversal(D)) 7546 Decls.push_back(D); 7547 } 7548 } 7549 }; 7550 7551 if (isa<TranslationUnitDecl>(DC)) { 7552 for (auto Lexical : TULexicalDecls) 7553 Visit(Lexical.first, Lexical.second); 7554 } else { 7555 auto I = LexicalDecls.find(DC); 7556 if (I != LexicalDecls.end()) 7557 Visit(I->second.first, I->second.second); 7558 } 7559 7560 ++NumLexicalDeclContextsRead; 7561 } 7562 7563 namespace { 7564 7565 class DeclIDComp { 7566 ASTReader &Reader; 7567 ModuleFile &Mod; 7568 7569 public: 7570 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7571 7572 bool operator()(LocalDeclID L, LocalDeclID R) const { 7573 SourceLocation LHS = getLocation(L); 7574 SourceLocation RHS = getLocation(R); 7575 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7576 } 7577 7578 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7579 SourceLocation RHS = getLocation(R); 7580 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7581 } 7582 7583 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7584 SourceLocation LHS = getLocation(L); 7585 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7586 } 7587 7588 SourceLocation getLocation(LocalDeclID ID) const { 7589 return Reader.getSourceManager().getFileLoc( 7590 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7591 } 7592 }; 7593 7594 } // namespace 7595 7596 void ASTReader::FindFileRegionDecls(FileID File, 7597 unsigned Offset, unsigned Length, 7598 SmallVectorImpl<Decl *> &Decls) { 7599 SourceManager &SM = getSourceManager(); 7600 7601 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7602 if (I == FileDeclIDs.end()) 7603 return; 7604 7605 FileDeclsInfo &DInfo = I->second; 7606 if (DInfo.Decls.empty()) 7607 return; 7608 7609 SourceLocation 7610 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7611 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7612 7613 DeclIDComp DIDComp(*this, *DInfo.Mod); 7614 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7615 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7616 if (BeginIt != DInfo.Decls.begin()) 7617 --BeginIt; 7618 7619 // If we are pointing at a top-level decl inside an objc container, we need 7620 // to backtrack until we find it otherwise we will fail to report that the 7621 // region overlaps with an objc container. 7622 while (BeginIt != DInfo.Decls.begin() && 7623 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7624 ->isTopLevelDeclInObjCContainer()) 7625 --BeginIt; 7626 7627 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7628 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7629 if (EndIt != DInfo.Decls.end()) 7630 ++EndIt; 7631 7632 for (ArrayRef<serialization::LocalDeclID>::iterator 7633 DIt = BeginIt; DIt != EndIt; ++DIt) 7634 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7635 } 7636 7637 bool 7638 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7639 DeclarationName Name) { 7640 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7641 "DeclContext has no visible decls in storage"); 7642 if (!Name) 7643 return false; 7644 7645 auto It = Lookups.find(DC); 7646 if (It == Lookups.end()) 7647 return false; 7648 7649 Deserializing LookupResults(this); 7650 7651 // Load the list of declarations. 7652 SmallVector<NamedDecl *, 64> Decls; 7653 llvm::SmallPtrSet<NamedDecl *, 8> Found; 7654 for (DeclID ID : It->second.Table.find(Name)) { 7655 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7656 if (ND->getDeclName() == Name && Found.insert(ND).second) 7657 Decls.push_back(ND); 7658 } 7659 7660 ++NumVisibleDeclContextsRead; 7661 SetExternalVisibleDeclsForName(DC, Name, Decls); 7662 return !Decls.empty(); 7663 } 7664 7665 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7666 if (!DC->hasExternalVisibleStorage()) 7667 return; 7668 7669 auto It = Lookups.find(DC); 7670 assert(It != Lookups.end() && 7671 "have external visible storage but no lookup tables"); 7672 7673 DeclsMap Decls; 7674 7675 for (DeclID ID : It->second.Table.findAll()) { 7676 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7677 Decls[ND->getDeclName()].push_back(ND); 7678 } 7679 7680 ++NumVisibleDeclContextsRead; 7681 7682 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7683 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7684 } 7685 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7686 } 7687 7688 const serialization::reader::DeclContextLookupTable * 7689 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7690 auto I = Lookups.find(Primary); 7691 return I == Lookups.end() ? nullptr : &I->second; 7692 } 7693 7694 /// Under non-PCH compilation the consumer receives the objc methods 7695 /// before receiving the implementation, and codegen depends on this. 7696 /// We simulate this by deserializing and passing to consumer the methods of the 7697 /// implementation before passing the deserialized implementation decl. 7698 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7699 ASTConsumer *Consumer) { 7700 assert(ImplD && Consumer); 7701 7702 for (auto *I : ImplD->methods()) 7703 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7704 7705 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7706 } 7707 7708 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7709 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7710 PassObjCImplDeclToConsumer(ImplD, Consumer); 7711 else 7712 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7713 } 7714 7715 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7716 this->Consumer = Consumer; 7717 7718 if (Consumer) 7719 PassInterestingDeclsToConsumer(); 7720 7721 if (DeserializationListener) 7722 DeserializationListener->ReaderInitialized(this); 7723 } 7724 7725 void ASTReader::PrintStats() { 7726 std::fprintf(stderr, "*** AST File Statistics:\n"); 7727 7728 unsigned NumTypesLoaded 7729 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7730 QualType()); 7731 unsigned NumDeclsLoaded 7732 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7733 (Decl *)nullptr); 7734 unsigned NumIdentifiersLoaded 7735 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7736 IdentifiersLoaded.end(), 7737 (IdentifierInfo *)nullptr); 7738 unsigned NumMacrosLoaded 7739 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7740 MacrosLoaded.end(), 7741 (MacroInfo *)nullptr); 7742 unsigned NumSelectorsLoaded 7743 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7744 SelectorsLoaded.end(), 7745 Selector()); 7746 7747 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7748 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7749 NumSLocEntriesRead, TotalNumSLocEntries, 7750 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7751 if (!TypesLoaded.empty()) 7752 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7753 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7754 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7755 if (!DeclsLoaded.empty()) 7756 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7757 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7758 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7759 if (!IdentifiersLoaded.empty()) 7760 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7761 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7762 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7763 if (!MacrosLoaded.empty()) 7764 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7765 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7766 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7767 if (!SelectorsLoaded.empty()) 7768 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7769 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7770 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7771 if (TotalNumStatements) 7772 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7773 NumStatementsRead, TotalNumStatements, 7774 ((float)NumStatementsRead/TotalNumStatements * 100)); 7775 if (TotalNumMacros) 7776 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7777 NumMacrosRead, TotalNumMacros, 7778 ((float)NumMacrosRead/TotalNumMacros * 100)); 7779 if (TotalLexicalDeclContexts) 7780 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7781 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7782 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7783 * 100)); 7784 if (TotalVisibleDeclContexts) 7785 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7786 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7787 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7788 * 100)); 7789 if (TotalNumMethodPoolEntries) 7790 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7791 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7792 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7793 * 100)); 7794 if (NumMethodPoolLookups) 7795 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7796 NumMethodPoolHits, NumMethodPoolLookups, 7797 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7798 if (NumMethodPoolTableLookups) 7799 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7800 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7801 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7802 * 100.0)); 7803 if (NumIdentifierLookupHits) 7804 std::fprintf(stderr, 7805 " %u / %u identifier table lookups succeeded (%f%%)\n", 7806 NumIdentifierLookupHits, NumIdentifierLookups, 7807 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7808 7809 if (GlobalIndex) { 7810 std::fprintf(stderr, "\n"); 7811 GlobalIndex->printStats(); 7812 } 7813 7814 std::fprintf(stderr, "\n"); 7815 dump(); 7816 std::fprintf(stderr, "\n"); 7817 } 7818 7819 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7820 LLVM_DUMP_METHOD static void 7821 dumpModuleIDMap(StringRef Name, 7822 const ContinuousRangeMap<Key, ModuleFile *, 7823 InitialCapacity> &Map) { 7824 if (Map.begin() == Map.end()) 7825 return; 7826 7827 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7828 7829 llvm::errs() << Name << ":\n"; 7830 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7831 I != IEnd; ++I) { 7832 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7833 << "\n"; 7834 } 7835 } 7836 7837 LLVM_DUMP_METHOD void ASTReader::dump() { 7838 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7839 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7840 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7841 dumpModuleIDMap("Global type map", GlobalTypeMap); 7842 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7843 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7844 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7845 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7846 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7847 dumpModuleIDMap("Global preprocessed entity map", 7848 GlobalPreprocessedEntityMap); 7849 7850 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7851 for (ModuleFile &M : ModuleMgr) 7852 M.dump(); 7853 } 7854 7855 /// Return the amount of memory used by memory buffers, breaking down 7856 /// by heap-backed versus mmap'ed memory. 7857 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7858 for (ModuleFile &I : ModuleMgr) { 7859 if (llvm::MemoryBuffer *buf = I.Buffer) { 7860 size_t bytes = buf->getBufferSize(); 7861 switch (buf->getBufferKind()) { 7862 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7863 sizes.malloc_bytes += bytes; 7864 break; 7865 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7866 sizes.mmap_bytes += bytes; 7867 break; 7868 } 7869 } 7870 } 7871 } 7872 7873 void ASTReader::InitializeSema(Sema &S) { 7874 SemaObj = &S; 7875 S.addExternalSource(this); 7876 7877 // Makes sure any declarations that were deserialized "too early" 7878 // still get added to the identifier's declaration chains. 7879 for (uint64_t ID : PreloadedDeclIDs) { 7880 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7881 pushExternalDeclIntoScope(D, D->getDeclName()); 7882 } 7883 PreloadedDeclIDs.clear(); 7884 7885 // FIXME: What happens if these are changed by a module import? 7886 if (!FPPragmaOptions.empty()) { 7887 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7888 FPOptionsOverride NewOverrides = 7889 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]); 7890 SemaObj->CurFPFeatures = 7891 NewOverrides.applyOverrides(SemaObj->getLangOpts()); 7892 } 7893 7894 SemaObj->OpenCLFeatures = OpenCLExtensions; 7895 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap; 7896 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap; 7897 7898 UpdateSema(); 7899 } 7900 7901 void ASTReader::UpdateSema() { 7902 assert(SemaObj && "no Sema to update"); 7903 7904 // Load the offsets of the declarations that Sema references. 7905 // They will be lazily deserialized when needed. 7906 if (!SemaDeclRefs.empty()) { 7907 assert(SemaDeclRefs.size() % 3 == 0); 7908 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7909 if (!SemaObj->StdNamespace) 7910 SemaObj->StdNamespace = SemaDeclRefs[I]; 7911 if (!SemaObj->StdBadAlloc) 7912 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7913 if (!SemaObj->StdAlignValT) 7914 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7915 } 7916 SemaDeclRefs.clear(); 7917 } 7918 7919 // Update the state of pragmas. Use the same API as if we had encountered the 7920 // pragma in the source. 7921 if(OptimizeOffPragmaLocation.isValid()) 7922 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7923 if (PragmaMSStructState != -1) 7924 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7925 if (PointersToMembersPragmaLocation.isValid()) { 7926 SemaObj->ActOnPragmaMSPointersToMembers( 7927 (LangOptions::PragmaMSPointersToMembersKind) 7928 PragmaMSPointersToMembersState, 7929 PointersToMembersPragmaLocation); 7930 } 7931 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7932 7933 if (PragmaAlignPackCurrentValue) { 7934 // The bottom of the stack might have a default value. It must be adjusted 7935 // to the current value to ensure that the packing state is preserved after 7936 // popping entries that were included/imported from a PCH/module. 7937 bool DropFirst = false; 7938 if (!PragmaAlignPackStack.empty() && 7939 PragmaAlignPackStack.front().Location.isInvalid()) { 7940 assert(PragmaAlignPackStack.front().Value == 7941 SemaObj->AlignPackStack.DefaultValue && 7942 "Expected a default alignment value"); 7943 SemaObj->AlignPackStack.Stack.emplace_back( 7944 PragmaAlignPackStack.front().SlotLabel, 7945 SemaObj->AlignPackStack.CurrentValue, 7946 SemaObj->AlignPackStack.CurrentPragmaLocation, 7947 PragmaAlignPackStack.front().PushLocation); 7948 DropFirst = true; 7949 } 7950 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack) 7951 .drop_front(DropFirst ? 1 : 0)) { 7952 SemaObj->AlignPackStack.Stack.emplace_back( 7953 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7954 } 7955 if (PragmaAlignPackCurrentLocation.isInvalid()) { 7956 assert(*PragmaAlignPackCurrentValue == 7957 SemaObj->AlignPackStack.DefaultValue && 7958 "Expected a default align and pack value"); 7959 // Keep the current values. 7960 } else { 7961 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue; 7962 SemaObj->AlignPackStack.CurrentPragmaLocation = 7963 PragmaAlignPackCurrentLocation; 7964 } 7965 } 7966 if (FpPragmaCurrentValue) { 7967 // The bottom of the stack might have a default value. It must be adjusted 7968 // to the current value to ensure that fp-pragma state is preserved after 7969 // popping entries that were included/imported from a PCH/module. 7970 bool DropFirst = false; 7971 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7972 assert(FpPragmaStack.front().Value == 7973 SemaObj->FpPragmaStack.DefaultValue && 7974 "Expected a default pragma float_control value"); 7975 SemaObj->FpPragmaStack.Stack.emplace_back( 7976 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7977 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7978 FpPragmaStack.front().PushLocation); 7979 DropFirst = true; 7980 } 7981 for (const auto &Entry : 7982 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7983 SemaObj->FpPragmaStack.Stack.emplace_back( 7984 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7985 if (FpPragmaCurrentLocation.isInvalid()) { 7986 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 7987 "Expected a default pragma float_control value"); 7988 // Keep the current values. 7989 } else { 7990 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 7991 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 7992 } 7993 } 7994 7995 // For non-modular AST files, restore visiblity of modules. 7996 for (auto &Import : ImportedModules) { 7997 if (Import.ImportLoc.isInvalid()) 7998 continue; 7999 if (Module *Imported = getSubmodule(Import.ID)) { 8000 SemaObj->makeModuleVisible(Imported, Import.ImportLoc); 8001 } 8002 } 8003 } 8004 8005 IdentifierInfo *ASTReader::get(StringRef Name) { 8006 // Note that we are loading an identifier. 8007 Deserializing AnIdentifier(this); 8008 8009 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 8010 NumIdentifierLookups, 8011 NumIdentifierLookupHits); 8012 8013 // We don't need to do identifier table lookups in C++ modules (we preload 8014 // all interesting declarations, and don't need to use the scope for name 8015 // lookups). Perform the lookup in PCH files, though, since we don't build 8016 // a complete initial identifier table if we're carrying on from a PCH. 8017 if (PP.getLangOpts().CPlusPlus) { 8018 for (auto F : ModuleMgr.pch_modules()) 8019 if (Visitor(*F)) 8020 break; 8021 } else { 8022 // If there is a global index, look there first to determine which modules 8023 // provably do not have any results for this identifier. 8024 GlobalModuleIndex::HitSet Hits; 8025 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 8026 if (!loadGlobalIndex()) { 8027 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 8028 HitsPtr = &Hits; 8029 } 8030 } 8031 8032 ModuleMgr.visit(Visitor, HitsPtr); 8033 } 8034 8035 IdentifierInfo *II = Visitor.getIdentifierInfo(); 8036 markIdentifierUpToDate(II); 8037 return II; 8038 } 8039 8040 namespace clang { 8041 8042 /// An identifier-lookup iterator that enumerates all of the 8043 /// identifiers stored within a set of AST files. 8044 class ASTIdentifierIterator : public IdentifierIterator { 8045 /// The AST reader whose identifiers are being enumerated. 8046 const ASTReader &Reader; 8047 8048 /// The current index into the chain of AST files stored in 8049 /// the AST reader. 8050 unsigned Index; 8051 8052 /// The current position within the identifier lookup table 8053 /// of the current AST file. 8054 ASTIdentifierLookupTable::key_iterator Current; 8055 8056 /// The end position within the identifier lookup table of 8057 /// the current AST file. 8058 ASTIdentifierLookupTable::key_iterator End; 8059 8060 /// Whether to skip any modules in the ASTReader. 8061 bool SkipModules; 8062 8063 public: 8064 explicit ASTIdentifierIterator(const ASTReader &Reader, 8065 bool SkipModules = false); 8066 8067 StringRef Next() override; 8068 }; 8069 8070 } // namespace clang 8071 8072 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 8073 bool SkipModules) 8074 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8075 } 8076 8077 StringRef ASTIdentifierIterator::Next() { 8078 while (Current == End) { 8079 // If we have exhausted all of our AST files, we're done. 8080 if (Index == 0) 8081 return StringRef(); 8082 8083 --Index; 8084 ModuleFile &F = Reader.ModuleMgr[Index]; 8085 if (SkipModules && F.isModule()) 8086 continue; 8087 8088 ASTIdentifierLookupTable *IdTable = 8089 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8090 Current = IdTable->key_begin(); 8091 End = IdTable->key_end(); 8092 } 8093 8094 // We have any identifiers remaining in the current AST file; return 8095 // the next one. 8096 StringRef Result = *Current; 8097 ++Current; 8098 return Result; 8099 } 8100 8101 namespace { 8102 8103 /// A utility for appending two IdentifierIterators. 8104 class ChainedIdentifierIterator : public IdentifierIterator { 8105 std::unique_ptr<IdentifierIterator> Current; 8106 std::unique_ptr<IdentifierIterator> Queued; 8107 8108 public: 8109 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8110 std::unique_ptr<IdentifierIterator> Second) 8111 : Current(std::move(First)), Queued(std::move(Second)) {} 8112 8113 StringRef Next() override { 8114 if (!Current) 8115 return StringRef(); 8116 8117 StringRef result = Current->Next(); 8118 if (!result.empty()) 8119 return result; 8120 8121 // Try the queued iterator, which may itself be empty. 8122 Current.reset(); 8123 std::swap(Current, Queued); 8124 return Next(); 8125 } 8126 }; 8127 8128 } // namespace 8129 8130 IdentifierIterator *ASTReader::getIdentifiers() { 8131 if (!loadGlobalIndex()) { 8132 std::unique_ptr<IdentifierIterator> ReaderIter( 8133 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8134 std::unique_ptr<IdentifierIterator> ModulesIter( 8135 GlobalIndex->createIdentifierIterator()); 8136 return new ChainedIdentifierIterator(std::move(ReaderIter), 8137 std::move(ModulesIter)); 8138 } 8139 8140 return new ASTIdentifierIterator(*this); 8141 } 8142 8143 namespace clang { 8144 namespace serialization { 8145 8146 class ReadMethodPoolVisitor { 8147 ASTReader &Reader; 8148 Selector Sel; 8149 unsigned PriorGeneration; 8150 unsigned InstanceBits = 0; 8151 unsigned FactoryBits = 0; 8152 bool InstanceHasMoreThanOneDecl = false; 8153 bool FactoryHasMoreThanOneDecl = false; 8154 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8155 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8156 8157 public: 8158 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8159 unsigned PriorGeneration) 8160 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8161 8162 bool operator()(ModuleFile &M) { 8163 if (!M.SelectorLookupTable) 8164 return false; 8165 8166 // If we've already searched this module file, skip it now. 8167 if (M.Generation <= PriorGeneration) 8168 return true; 8169 8170 ++Reader.NumMethodPoolTableLookups; 8171 ASTSelectorLookupTable *PoolTable 8172 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8173 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8174 if (Pos == PoolTable->end()) 8175 return false; 8176 8177 ++Reader.NumMethodPoolTableHits; 8178 ++Reader.NumSelectorsRead; 8179 // FIXME: Not quite happy with the statistics here. We probably should 8180 // disable this tracking when called via LoadSelector. 8181 // Also, should entries without methods count as misses? 8182 ++Reader.NumMethodPoolEntriesRead; 8183 ASTSelectorLookupTrait::data_type Data = *Pos; 8184 if (Reader.DeserializationListener) 8185 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8186 8187 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8188 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8189 InstanceBits = Data.InstanceBits; 8190 FactoryBits = Data.FactoryBits; 8191 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8192 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8193 return true; 8194 } 8195 8196 /// Retrieve the instance methods found by this visitor. 8197 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8198 return InstanceMethods; 8199 } 8200 8201 /// Retrieve the instance methods found by this visitor. 8202 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8203 return FactoryMethods; 8204 } 8205 8206 unsigned getInstanceBits() const { return InstanceBits; } 8207 unsigned getFactoryBits() const { return FactoryBits; } 8208 8209 bool instanceHasMoreThanOneDecl() const { 8210 return InstanceHasMoreThanOneDecl; 8211 } 8212 8213 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8214 }; 8215 8216 } // namespace serialization 8217 } // namespace clang 8218 8219 /// Add the given set of methods to the method list. 8220 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8221 ObjCMethodList &List) { 8222 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8223 S.addMethodToGlobalList(&List, Methods[I]); 8224 } 8225 } 8226 8227 void ASTReader::ReadMethodPool(Selector Sel) { 8228 // Get the selector generation and update it to the current generation. 8229 unsigned &Generation = SelectorGeneration[Sel]; 8230 unsigned PriorGeneration = Generation; 8231 Generation = getGeneration(); 8232 SelectorOutOfDate[Sel] = false; 8233 8234 // Search for methods defined with this selector. 8235 ++NumMethodPoolLookups; 8236 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8237 ModuleMgr.visit(Visitor); 8238 8239 if (Visitor.getInstanceMethods().empty() && 8240 Visitor.getFactoryMethods().empty()) 8241 return; 8242 8243 ++NumMethodPoolHits; 8244 8245 if (!getSema()) 8246 return; 8247 8248 Sema &S = *getSema(); 8249 Sema::GlobalMethodPool::iterator Pos 8250 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 8251 8252 Pos->second.first.setBits(Visitor.getInstanceBits()); 8253 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8254 Pos->second.second.setBits(Visitor.getFactoryBits()); 8255 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8256 8257 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8258 // when building a module we keep every method individually and may need to 8259 // update hasMoreThanOneDecl as we add the methods. 8260 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8261 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8262 } 8263 8264 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8265 if (SelectorOutOfDate[Sel]) 8266 ReadMethodPool(Sel); 8267 } 8268 8269 void ASTReader::ReadKnownNamespaces( 8270 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8271 Namespaces.clear(); 8272 8273 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8274 if (NamespaceDecl *Namespace 8275 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8276 Namespaces.push_back(Namespace); 8277 } 8278 } 8279 8280 void ASTReader::ReadUndefinedButUsed( 8281 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8282 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8283 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8284 SourceLocation Loc = 8285 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8286 Undefined.insert(std::make_pair(D, Loc)); 8287 } 8288 } 8289 8290 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8291 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8292 Exprs) { 8293 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8294 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8295 uint64_t Count = DelayedDeleteExprs[Idx++]; 8296 for (uint64_t C = 0; C < Count; ++C) { 8297 SourceLocation DeleteLoc = 8298 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8299 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8300 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8301 } 8302 } 8303 } 8304 8305 void ASTReader::ReadTentativeDefinitions( 8306 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8307 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8308 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8309 if (Var) 8310 TentativeDefs.push_back(Var); 8311 } 8312 TentativeDefinitions.clear(); 8313 } 8314 8315 void ASTReader::ReadUnusedFileScopedDecls( 8316 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8317 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8318 DeclaratorDecl *D 8319 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8320 if (D) 8321 Decls.push_back(D); 8322 } 8323 UnusedFileScopedDecls.clear(); 8324 } 8325 8326 void ASTReader::ReadDelegatingConstructors( 8327 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8328 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8329 CXXConstructorDecl *D 8330 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8331 if (D) 8332 Decls.push_back(D); 8333 } 8334 DelegatingCtorDecls.clear(); 8335 } 8336 8337 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8338 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8339 TypedefNameDecl *D 8340 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8341 if (D) 8342 Decls.push_back(D); 8343 } 8344 ExtVectorDecls.clear(); 8345 } 8346 8347 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8348 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8349 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8350 ++I) { 8351 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8352 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8353 if (D) 8354 Decls.insert(D); 8355 } 8356 UnusedLocalTypedefNameCandidates.clear(); 8357 } 8358 8359 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8360 llvm::SmallVector<Decl *, 4> &Decls) { 8361 for (unsigned I = 0, N = DeclsToCheckForDeferredDiags.size(); I != N; 8362 ++I) { 8363 auto *D = dyn_cast_or_null<Decl>( 8364 GetDecl(DeclsToCheckForDeferredDiags[I])); 8365 if (D) 8366 Decls.push_back(D); 8367 } 8368 DeclsToCheckForDeferredDiags.clear(); 8369 } 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_allocator: 11751 C = new (Context) OMPAllocatorClause(); 11752 break; 11753 case llvm::omp::OMPC_collapse: 11754 C = new (Context) OMPCollapseClause(); 11755 break; 11756 case llvm::omp::OMPC_default: 11757 C = new (Context) OMPDefaultClause(); 11758 break; 11759 case llvm::omp::OMPC_proc_bind: 11760 C = new (Context) OMPProcBindClause(); 11761 break; 11762 case llvm::omp::OMPC_schedule: 11763 C = new (Context) OMPScheduleClause(); 11764 break; 11765 case llvm::omp::OMPC_ordered: 11766 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11767 break; 11768 case llvm::omp::OMPC_nowait: 11769 C = new (Context) OMPNowaitClause(); 11770 break; 11771 case llvm::omp::OMPC_untied: 11772 C = new (Context) OMPUntiedClause(); 11773 break; 11774 case llvm::omp::OMPC_mergeable: 11775 C = new (Context) OMPMergeableClause(); 11776 break; 11777 case llvm::omp::OMPC_read: 11778 C = new (Context) OMPReadClause(); 11779 break; 11780 case llvm::omp::OMPC_write: 11781 C = new (Context) OMPWriteClause(); 11782 break; 11783 case llvm::omp::OMPC_update: 11784 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11785 break; 11786 case llvm::omp::OMPC_capture: 11787 C = new (Context) OMPCaptureClause(); 11788 break; 11789 case llvm::omp::OMPC_seq_cst: 11790 C = new (Context) OMPSeqCstClause(); 11791 break; 11792 case llvm::omp::OMPC_acq_rel: 11793 C = new (Context) OMPAcqRelClause(); 11794 break; 11795 case llvm::omp::OMPC_acquire: 11796 C = new (Context) OMPAcquireClause(); 11797 break; 11798 case llvm::omp::OMPC_release: 11799 C = new (Context) OMPReleaseClause(); 11800 break; 11801 case llvm::omp::OMPC_relaxed: 11802 C = new (Context) OMPRelaxedClause(); 11803 break; 11804 case llvm::omp::OMPC_threads: 11805 C = new (Context) OMPThreadsClause(); 11806 break; 11807 case llvm::omp::OMPC_simd: 11808 C = new (Context) OMPSIMDClause(); 11809 break; 11810 case llvm::omp::OMPC_nogroup: 11811 C = new (Context) OMPNogroupClause(); 11812 break; 11813 case llvm::omp::OMPC_unified_address: 11814 C = new (Context) OMPUnifiedAddressClause(); 11815 break; 11816 case llvm::omp::OMPC_unified_shared_memory: 11817 C = new (Context) OMPUnifiedSharedMemoryClause(); 11818 break; 11819 case llvm::omp::OMPC_reverse_offload: 11820 C = new (Context) OMPReverseOffloadClause(); 11821 break; 11822 case llvm::omp::OMPC_dynamic_allocators: 11823 C = new (Context) OMPDynamicAllocatorsClause(); 11824 break; 11825 case llvm::omp::OMPC_atomic_default_mem_order: 11826 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11827 break; 11828 case llvm::omp::OMPC_private: 11829 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11830 break; 11831 case llvm::omp::OMPC_firstprivate: 11832 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11833 break; 11834 case llvm::omp::OMPC_lastprivate: 11835 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11836 break; 11837 case llvm::omp::OMPC_shared: 11838 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11839 break; 11840 case llvm::omp::OMPC_reduction: { 11841 unsigned N = Record.readInt(); 11842 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11843 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11844 break; 11845 } 11846 case llvm::omp::OMPC_task_reduction: 11847 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11848 break; 11849 case llvm::omp::OMPC_in_reduction: 11850 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11851 break; 11852 case llvm::omp::OMPC_linear: 11853 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11854 break; 11855 case llvm::omp::OMPC_aligned: 11856 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11857 break; 11858 case llvm::omp::OMPC_copyin: 11859 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11860 break; 11861 case llvm::omp::OMPC_copyprivate: 11862 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11863 break; 11864 case llvm::omp::OMPC_flush: 11865 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11866 break; 11867 case llvm::omp::OMPC_depobj: 11868 C = OMPDepobjClause::CreateEmpty(Context); 11869 break; 11870 case llvm::omp::OMPC_depend: { 11871 unsigned NumVars = Record.readInt(); 11872 unsigned NumLoops = Record.readInt(); 11873 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11874 break; 11875 } 11876 case llvm::omp::OMPC_device: 11877 C = new (Context) OMPDeviceClause(); 11878 break; 11879 case llvm::omp::OMPC_map: { 11880 OMPMappableExprListSizeTy Sizes; 11881 Sizes.NumVars = Record.readInt(); 11882 Sizes.NumUniqueDeclarations = Record.readInt(); 11883 Sizes.NumComponentLists = Record.readInt(); 11884 Sizes.NumComponents = Record.readInt(); 11885 C = OMPMapClause::CreateEmpty(Context, Sizes); 11886 break; 11887 } 11888 case llvm::omp::OMPC_num_teams: 11889 C = new (Context) OMPNumTeamsClause(); 11890 break; 11891 case llvm::omp::OMPC_thread_limit: 11892 C = new (Context) OMPThreadLimitClause(); 11893 break; 11894 case llvm::omp::OMPC_priority: 11895 C = new (Context) OMPPriorityClause(); 11896 break; 11897 case llvm::omp::OMPC_grainsize: 11898 C = new (Context) OMPGrainsizeClause(); 11899 break; 11900 case llvm::omp::OMPC_num_tasks: 11901 C = new (Context) OMPNumTasksClause(); 11902 break; 11903 case llvm::omp::OMPC_hint: 11904 C = new (Context) OMPHintClause(); 11905 break; 11906 case llvm::omp::OMPC_dist_schedule: 11907 C = new (Context) OMPDistScheduleClause(); 11908 break; 11909 case llvm::omp::OMPC_defaultmap: 11910 C = new (Context) OMPDefaultmapClause(); 11911 break; 11912 case llvm::omp::OMPC_to: { 11913 OMPMappableExprListSizeTy Sizes; 11914 Sizes.NumVars = Record.readInt(); 11915 Sizes.NumUniqueDeclarations = Record.readInt(); 11916 Sizes.NumComponentLists = Record.readInt(); 11917 Sizes.NumComponents = Record.readInt(); 11918 C = OMPToClause::CreateEmpty(Context, Sizes); 11919 break; 11920 } 11921 case llvm::omp::OMPC_from: { 11922 OMPMappableExprListSizeTy Sizes; 11923 Sizes.NumVars = Record.readInt(); 11924 Sizes.NumUniqueDeclarations = Record.readInt(); 11925 Sizes.NumComponentLists = Record.readInt(); 11926 Sizes.NumComponents = Record.readInt(); 11927 C = OMPFromClause::CreateEmpty(Context, Sizes); 11928 break; 11929 } 11930 case llvm::omp::OMPC_use_device_ptr: { 11931 OMPMappableExprListSizeTy Sizes; 11932 Sizes.NumVars = Record.readInt(); 11933 Sizes.NumUniqueDeclarations = Record.readInt(); 11934 Sizes.NumComponentLists = Record.readInt(); 11935 Sizes.NumComponents = Record.readInt(); 11936 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11937 break; 11938 } 11939 case llvm::omp::OMPC_use_device_addr: { 11940 OMPMappableExprListSizeTy Sizes; 11941 Sizes.NumVars = Record.readInt(); 11942 Sizes.NumUniqueDeclarations = Record.readInt(); 11943 Sizes.NumComponentLists = Record.readInt(); 11944 Sizes.NumComponents = Record.readInt(); 11945 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11946 break; 11947 } 11948 case llvm::omp::OMPC_is_device_ptr: { 11949 OMPMappableExprListSizeTy Sizes; 11950 Sizes.NumVars = Record.readInt(); 11951 Sizes.NumUniqueDeclarations = Record.readInt(); 11952 Sizes.NumComponentLists = Record.readInt(); 11953 Sizes.NumComponents = Record.readInt(); 11954 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11955 break; 11956 } 11957 case llvm::omp::OMPC_allocate: 11958 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11959 break; 11960 case llvm::omp::OMPC_nontemporal: 11961 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11962 break; 11963 case llvm::omp::OMPC_inclusive: 11964 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11965 break; 11966 case llvm::omp::OMPC_exclusive: 11967 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11968 break; 11969 case llvm::omp::OMPC_order: 11970 C = new (Context) OMPOrderClause(); 11971 break; 11972 case llvm::omp::OMPC_init: 11973 C = OMPInitClause::CreateEmpty(Context, Record.readInt()); 11974 break; 11975 case llvm::omp::OMPC_use: 11976 C = new (Context) OMPUseClause(); 11977 break; 11978 case llvm::omp::OMPC_destroy: 11979 C = new (Context) OMPDestroyClause(); 11980 break; 11981 case llvm::omp::OMPC_novariants: 11982 C = new (Context) OMPNovariantsClause(); 11983 break; 11984 case llvm::omp::OMPC_nocontext: 11985 C = new (Context) OMPNocontextClause(); 11986 break; 11987 case llvm::omp::OMPC_detach: 11988 C = new (Context) OMPDetachClause(); 11989 break; 11990 case llvm::omp::OMPC_uses_allocators: 11991 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11992 break; 11993 case llvm::omp::OMPC_affinity: 11994 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 11995 break; 11996 case llvm::omp::OMPC_filter: 11997 C = new (Context) OMPFilterClause(); 11998 break; 11999 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 12000 case llvm::omp::Enum: \ 12001 break; 12002 #include "llvm/Frontend/OpenMP/OMPKinds.def" 12003 default: 12004 break; 12005 } 12006 assert(C && "Unknown OMPClause type"); 12007 12008 Visit(C); 12009 C->setLocStart(Record.readSourceLocation()); 12010 C->setLocEnd(Record.readSourceLocation()); 12011 12012 return C; 12013 } 12014 12015 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 12016 C->setPreInitStmt(Record.readSubStmt(), 12017 static_cast<OpenMPDirectiveKind>(Record.readInt())); 12018 } 12019 12020 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 12021 VisitOMPClauseWithPreInit(C); 12022 C->setPostUpdateExpr(Record.readSubExpr()); 12023 } 12024 12025 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 12026 VisitOMPClauseWithPreInit(C); 12027 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 12028 C->setNameModifierLoc(Record.readSourceLocation()); 12029 C->setColonLoc(Record.readSourceLocation()); 12030 C->setCondition(Record.readSubExpr()); 12031 C->setLParenLoc(Record.readSourceLocation()); 12032 } 12033 12034 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12035 VisitOMPClauseWithPreInit(C); 12036 C->setCondition(Record.readSubExpr()); 12037 C->setLParenLoc(Record.readSourceLocation()); 12038 } 12039 12040 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12041 VisitOMPClauseWithPreInit(C); 12042 C->setNumThreads(Record.readSubExpr()); 12043 C->setLParenLoc(Record.readSourceLocation()); 12044 } 12045 12046 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12047 C->setSafelen(Record.readSubExpr()); 12048 C->setLParenLoc(Record.readSourceLocation()); 12049 } 12050 12051 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12052 C->setSimdlen(Record.readSubExpr()); 12053 C->setLParenLoc(Record.readSourceLocation()); 12054 } 12055 12056 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) { 12057 for (Expr *&E : C->getSizesRefs()) 12058 E = Record.readSubExpr(); 12059 C->setLParenLoc(Record.readSourceLocation()); 12060 } 12061 12062 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12063 C->setAllocator(Record.readExpr()); 12064 C->setLParenLoc(Record.readSourceLocation()); 12065 } 12066 12067 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12068 C->setNumForLoops(Record.readSubExpr()); 12069 C->setLParenLoc(Record.readSourceLocation()); 12070 } 12071 12072 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12073 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12074 C->setLParenLoc(Record.readSourceLocation()); 12075 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12076 } 12077 12078 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12079 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12080 C->setLParenLoc(Record.readSourceLocation()); 12081 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12082 } 12083 12084 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12085 VisitOMPClauseWithPreInit(C); 12086 C->setScheduleKind( 12087 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12088 C->setFirstScheduleModifier( 12089 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12090 C->setSecondScheduleModifier( 12091 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12092 C->setChunkSize(Record.readSubExpr()); 12093 C->setLParenLoc(Record.readSourceLocation()); 12094 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12095 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12096 C->setScheduleKindLoc(Record.readSourceLocation()); 12097 C->setCommaLoc(Record.readSourceLocation()); 12098 } 12099 12100 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12101 C->setNumForLoops(Record.readSubExpr()); 12102 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12103 C->setLoopNumIterations(I, Record.readSubExpr()); 12104 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12105 C->setLoopCounter(I, Record.readSubExpr()); 12106 C->setLParenLoc(Record.readSourceLocation()); 12107 } 12108 12109 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12110 C->setEventHandler(Record.readSubExpr()); 12111 C->setLParenLoc(Record.readSourceLocation()); 12112 } 12113 12114 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12115 12116 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12117 12118 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12119 12120 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12121 12122 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12123 12124 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12125 if (C->isExtended()) { 12126 C->setLParenLoc(Record.readSourceLocation()); 12127 C->setArgumentLoc(Record.readSourceLocation()); 12128 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12129 } 12130 } 12131 12132 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12133 12134 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12135 12136 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12137 12138 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12139 12140 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12141 12142 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12143 12144 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12145 12146 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12147 12148 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12149 12150 void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) { 12151 unsigned NumVars = C->varlist_size(); 12152 SmallVector<Expr *, 16> Vars; 12153 Vars.reserve(NumVars); 12154 for (unsigned I = 0; I != NumVars; ++I) 12155 Vars.push_back(Record.readSubExpr()); 12156 C->setVarRefs(Vars); 12157 C->setIsTarget(Record.readBool()); 12158 C->setIsTargetSync(Record.readBool()); 12159 C->setLParenLoc(Record.readSourceLocation()); 12160 C->setVarLoc(Record.readSourceLocation()); 12161 } 12162 12163 void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) { 12164 C->setInteropVar(Record.readSubExpr()); 12165 C->setLParenLoc(Record.readSourceLocation()); 12166 C->setVarLoc(Record.readSourceLocation()); 12167 } 12168 12169 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) { 12170 C->setInteropVar(Record.readSubExpr()); 12171 C->setLParenLoc(Record.readSourceLocation()); 12172 C->setVarLoc(Record.readSourceLocation()); 12173 } 12174 12175 void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) { 12176 VisitOMPClauseWithPreInit(C); 12177 C->setCondition(Record.readSubExpr()); 12178 C->setLParenLoc(Record.readSourceLocation()); 12179 } 12180 12181 void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) { 12182 VisitOMPClauseWithPreInit(C); 12183 C->setCondition(Record.readSubExpr()); 12184 C->setLParenLoc(Record.readSourceLocation()); 12185 } 12186 12187 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12188 12189 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12190 OMPUnifiedSharedMemoryClause *) {} 12191 12192 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12193 12194 void 12195 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12196 } 12197 12198 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12199 OMPAtomicDefaultMemOrderClause *C) { 12200 C->setAtomicDefaultMemOrderKind( 12201 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12202 C->setLParenLoc(Record.readSourceLocation()); 12203 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12204 } 12205 12206 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12207 C->setLParenLoc(Record.readSourceLocation()); 12208 unsigned NumVars = C->varlist_size(); 12209 SmallVector<Expr *, 16> Vars; 12210 Vars.reserve(NumVars); 12211 for (unsigned i = 0; i != NumVars; ++i) 12212 Vars.push_back(Record.readSubExpr()); 12213 C->setVarRefs(Vars); 12214 Vars.clear(); 12215 for (unsigned i = 0; i != NumVars; ++i) 12216 Vars.push_back(Record.readSubExpr()); 12217 C->setPrivateCopies(Vars); 12218 } 12219 12220 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12221 VisitOMPClauseWithPreInit(C); 12222 C->setLParenLoc(Record.readSourceLocation()); 12223 unsigned NumVars = C->varlist_size(); 12224 SmallVector<Expr *, 16> Vars; 12225 Vars.reserve(NumVars); 12226 for (unsigned i = 0; i != NumVars; ++i) 12227 Vars.push_back(Record.readSubExpr()); 12228 C->setVarRefs(Vars); 12229 Vars.clear(); 12230 for (unsigned i = 0; i != NumVars; ++i) 12231 Vars.push_back(Record.readSubExpr()); 12232 C->setPrivateCopies(Vars); 12233 Vars.clear(); 12234 for (unsigned i = 0; i != NumVars; ++i) 12235 Vars.push_back(Record.readSubExpr()); 12236 C->setInits(Vars); 12237 } 12238 12239 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12240 VisitOMPClauseWithPostUpdate(C); 12241 C->setLParenLoc(Record.readSourceLocation()); 12242 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12243 C->setKindLoc(Record.readSourceLocation()); 12244 C->setColonLoc(Record.readSourceLocation()); 12245 unsigned NumVars = C->varlist_size(); 12246 SmallVector<Expr *, 16> Vars; 12247 Vars.reserve(NumVars); 12248 for (unsigned i = 0; i != NumVars; ++i) 12249 Vars.push_back(Record.readSubExpr()); 12250 C->setVarRefs(Vars); 12251 Vars.clear(); 12252 for (unsigned i = 0; i != NumVars; ++i) 12253 Vars.push_back(Record.readSubExpr()); 12254 C->setPrivateCopies(Vars); 12255 Vars.clear(); 12256 for (unsigned i = 0; i != NumVars; ++i) 12257 Vars.push_back(Record.readSubExpr()); 12258 C->setSourceExprs(Vars); 12259 Vars.clear(); 12260 for (unsigned i = 0; i != NumVars; ++i) 12261 Vars.push_back(Record.readSubExpr()); 12262 C->setDestinationExprs(Vars); 12263 Vars.clear(); 12264 for (unsigned i = 0; i != NumVars; ++i) 12265 Vars.push_back(Record.readSubExpr()); 12266 C->setAssignmentOps(Vars); 12267 } 12268 12269 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12270 C->setLParenLoc(Record.readSourceLocation()); 12271 unsigned NumVars = C->varlist_size(); 12272 SmallVector<Expr *, 16> Vars; 12273 Vars.reserve(NumVars); 12274 for (unsigned i = 0; i != NumVars; ++i) 12275 Vars.push_back(Record.readSubExpr()); 12276 C->setVarRefs(Vars); 12277 } 12278 12279 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12280 VisitOMPClauseWithPostUpdate(C); 12281 C->setLParenLoc(Record.readSourceLocation()); 12282 C->setModifierLoc(Record.readSourceLocation()); 12283 C->setColonLoc(Record.readSourceLocation()); 12284 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12285 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12286 C->setQualifierLoc(NNSL); 12287 C->setNameInfo(DNI); 12288 12289 unsigned NumVars = C->varlist_size(); 12290 SmallVector<Expr *, 16> Vars; 12291 Vars.reserve(NumVars); 12292 for (unsigned i = 0; i != NumVars; ++i) 12293 Vars.push_back(Record.readSubExpr()); 12294 C->setVarRefs(Vars); 12295 Vars.clear(); 12296 for (unsigned i = 0; i != NumVars; ++i) 12297 Vars.push_back(Record.readSubExpr()); 12298 C->setPrivates(Vars); 12299 Vars.clear(); 12300 for (unsigned i = 0; i != NumVars; ++i) 12301 Vars.push_back(Record.readSubExpr()); 12302 C->setLHSExprs(Vars); 12303 Vars.clear(); 12304 for (unsigned i = 0; i != NumVars; ++i) 12305 Vars.push_back(Record.readSubExpr()); 12306 C->setRHSExprs(Vars); 12307 Vars.clear(); 12308 for (unsigned i = 0; i != NumVars; ++i) 12309 Vars.push_back(Record.readSubExpr()); 12310 C->setReductionOps(Vars); 12311 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12312 Vars.clear(); 12313 for (unsigned i = 0; i != NumVars; ++i) 12314 Vars.push_back(Record.readSubExpr()); 12315 C->setInscanCopyOps(Vars); 12316 Vars.clear(); 12317 for (unsigned i = 0; i != NumVars; ++i) 12318 Vars.push_back(Record.readSubExpr()); 12319 C->setInscanCopyArrayTemps(Vars); 12320 Vars.clear(); 12321 for (unsigned i = 0; i != NumVars; ++i) 12322 Vars.push_back(Record.readSubExpr()); 12323 C->setInscanCopyArrayElems(Vars); 12324 } 12325 } 12326 12327 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12328 VisitOMPClauseWithPostUpdate(C); 12329 C->setLParenLoc(Record.readSourceLocation()); 12330 C->setColonLoc(Record.readSourceLocation()); 12331 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12332 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12333 C->setQualifierLoc(NNSL); 12334 C->setNameInfo(DNI); 12335 12336 unsigned NumVars = C->varlist_size(); 12337 SmallVector<Expr *, 16> Vars; 12338 Vars.reserve(NumVars); 12339 for (unsigned I = 0; I != NumVars; ++I) 12340 Vars.push_back(Record.readSubExpr()); 12341 C->setVarRefs(Vars); 12342 Vars.clear(); 12343 for (unsigned I = 0; I != NumVars; ++I) 12344 Vars.push_back(Record.readSubExpr()); 12345 C->setPrivates(Vars); 12346 Vars.clear(); 12347 for (unsigned I = 0; I != NumVars; ++I) 12348 Vars.push_back(Record.readSubExpr()); 12349 C->setLHSExprs(Vars); 12350 Vars.clear(); 12351 for (unsigned I = 0; I != NumVars; ++I) 12352 Vars.push_back(Record.readSubExpr()); 12353 C->setRHSExprs(Vars); 12354 Vars.clear(); 12355 for (unsigned I = 0; I != NumVars; ++I) 12356 Vars.push_back(Record.readSubExpr()); 12357 C->setReductionOps(Vars); 12358 } 12359 12360 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12361 VisitOMPClauseWithPostUpdate(C); 12362 C->setLParenLoc(Record.readSourceLocation()); 12363 C->setColonLoc(Record.readSourceLocation()); 12364 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12365 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12366 C->setQualifierLoc(NNSL); 12367 C->setNameInfo(DNI); 12368 12369 unsigned NumVars = C->varlist_size(); 12370 SmallVector<Expr *, 16> Vars; 12371 Vars.reserve(NumVars); 12372 for (unsigned I = 0; I != NumVars; ++I) 12373 Vars.push_back(Record.readSubExpr()); 12374 C->setVarRefs(Vars); 12375 Vars.clear(); 12376 for (unsigned I = 0; I != NumVars; ++I) 12377 Vars.push_back(Record.readSubExpr()); 12378 C->setPrivates(Vars); 12379 Vars.clear(); 12380 for (unsigned I = 0; I != NumVars; ++I) 12381 Vars.push_back(Record.readSubExpr()); 12382 C->setLHSExprs(Vars); 12383 Vars.clear(); 12384 for (unsigned I = 0; I != NumVars; ++I) 12385 Vars.push_back(Record.readSubExpr()); 12386 C->setRHSExprs(Vars); 12387 Vars.clear(); 12388 for (unsigned I = 0; I != NumVars; ++I) 12389 Vars.push_back(Record.readSubExpr()); 12390 C->setReductionOps(Vars); 12391 Vars.clear(); 12392 for (unsigned I = 0; I != NumVars; ++I) 12393 Vars.push_back(Record.readSubExpr()); 12394 C->setTaskgroupDescriptors(Vars); 12395 } 12396 12397 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12398 VisitOMPClauseWithPostUpdate(C); 12399 C->setLParenLoc(Record.readSourceLocation()); 12400 C->setColonLoc(Record.readSourceLocation()); 12401 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12402 C->setModifierLoc(Record.readSourceLocation()); 12403 unsigned NumVars = C->varlist_size(); 12404 SmallVector<Expr *, 16> Vars; 12405 Vars.reserve(NumVars); 12406 for (unsigned i = 0; i != NumVars; ++i) 12407 Vars.push_back(Record.readSubExpr()); 12408 C->setVarRefs(Vars); 12409 Vars.clear(); 12410 for (unsigned i = 0; i != NumVars; ++i) 12411 Vars.push_back(Record.readSubExpr()); 12412 C->setPrivates(Vars); 12413 Vars.clear(); 12414 for (unsigned i = 0; i != NumVars; ++i) 12415 Vars.push_back(Record.readSubExpr()); 12416 C->setInits(Vars); 12417 Vars.clear(); 12418 for (unsigned i = 0; i != NumVars; ++i) 12419 Vars.push_back(Record.readSubExpr()); 12420 C->setUpdates(Vars); 12421 Vars.clear(); 12422 for (unsigned i = 0; i != NumVars; ++i) 12423 Vars.push_back(Record.readSubExpr()); 12424 C->setFinals(Vars); 12425 C->setStep(Record.readSubExpr()); 12426 C->setCalcStep(Record.readSubExpr()); 12427 Vars.clear(); 12428 for (unsigned I = 0; I != NumVars + 1; ++I) 12429 Vars.push_back(Record.readSubExpr()); 12430 C->setUsedExprs(Vars); 12431 } 12432 12433 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12434 C->setLParenLoc(Record.readSourceLocation()); 12435 C->setColonLoc(Record.readSourceLocation()); 12436 unsigned NumVars = C->varlist_size(); 12437 SmallVector<Expr *, 16> Vars; 12438 Vars.reserve(NumVars); 12439 for (unsigned i = 0; i != NumVars; ++i) 12440 Vars.push_back(Record.readSubExpr()); 12441 C->setVarRefs(Vars); 12442 C->setAlignment(Record.readSubExpr()); 12443 } 12444 12445 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12446 C->setLParenLoc(Record.readSourceLocation()); 12447 unsigned NumVars = C->varlist_size(); 12448 SmallVector<Expr *, 16> Exprs; 12449 Exprs.reserve(NumVars); 12450 for (unsigned i = 0; i != NumVars; ++i) 12451 Exprs.push_back(Record.readSubExpr()); 12452 C->setVarRefs(Exprs); 12453 Exprs.clear(); 12454 for (unsigned i = 0; i != NumVars; ++i) 12455 Exprs.push_back(Record.readSubExpr()); 12456 C->setSourceExprs(Exprs); 12457 Exprs.clear(); 12458 for (unsigned i = 0; i != NumVars; ++i) 12459 Exprs.push_back(Record.readSubExpr()); 12460 C->setDestinationExprs(Exprs); 12461 Exprs.clear(); 12462 for (unsigned i = 0; i != NumVars; ++i) 12463 Exprs.push_back(Record.readSubExpr()); 12464 C->setAssignmentOps(Exprs); 12465 } 12466 12467 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12468 C->setLParenLoc(Record.readSourceLocation()); 12469 unsigned NumVars = C->varlist_size(); 12470 SmallVector<Expr *, 16> Exprs; 12471 Exprs.reserve(NumVars); 12472 for (unsigned i = 0; i != NumVars; ++i) 12473 Exprs.push_back(Record.readSubExpr()); 12474 C->setVarRefs(Exprs); 12475 Exprs.clear(); 12476 for (unsigned i = 0; i != NumVars; ++i) 12477 Exprs.push_back(Record.readSubExpr()); 12478 C->setSourceExprs(Exprs); 12479 Exprs.clear(); 12480 for (unsigned i = 0; i != NumVars; ++i) 12481 Exprs.push_back(Record.readSubExpr()); 12482 C->setDestinationExprs(Exprs); 12483 Exprs.clear(); 12484 for (unsigned i = 0; i != NumVars; ++i) 12485 Exprs.push_back(Record.readSubExpr()); 12486 C->setAssignmentOps(Exprs); 12487 } 12488 12489 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12490 C->setLParenLoc(Record.readSourceLocation()); 12491 unsigned NumVars = C->varlist_size(); 12492 SmallVector<Expr *, 16> Vars; 12493 Vars.reserve(NumVars); 12494 for (unsigned i = 0; i != NumVars; ++i) 12495 Vars.push_back(Record.readSubExpr()); 12496 C->setVarRefs(Vars); 12497 } 12498 12499 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12500 C->setDepobj(Record.readSubExpr()); 12501 C->setLParenLoc(Record.readSourceLocation()); 12502 } 12503 12504 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12505 C->setLParenLoc(Record.readSourceLocation()); 12506 C->setModifier(Record.readSubExpr()); 12507 C->setDependencyKind( 12508 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12509 C->setDependencyLoc(Record.readSourceLocation()); 12510 C->setColonLoc(Record.readSourceLocation()); 12511 unsigned NumVars = C->varlist_size(); 12512 SmallVector<Expr *, 16> Vars; 12513 Vars.reserve(NumVars); 12514 for (unsigned I = 0; I != NumVars; ++I) 12515 Vars.push_back(Record.readSubExpr()); 12516 C->setVarRefs(Vars); 12517 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12518 C->setLoopData(I, Record.readSubExpr()); 12519 } 12520 12521 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12522 VisitOMPClauseWithPreInit(C); 12523 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12524 C->setDevice(Record.readSubExpr()); 12525 C->setModifierLoc(Record.readSourceLocation()); 12526 C->setLParenLoc(Record.readSourceLocation()); 12527 } 12528 12529 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12530 C->setLParenLoc(Record.readSourceLocation()); 12531 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12532 C->setMapTypeModifier( 12533 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12534 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12535 } 12536 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12537 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12538 C->setMapType( 12539 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12540 C->setMapLoc(Record.readSourceLocation()); 12541 C->setColonLoc(Record.readSourceLocation()); 12542 auto NumVars = C->varlist_size(); 12543 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12544 auto TotalLists = C->getTotalComponentListNum(); 12545 auto TotalComponents = C->getTotalComponentsNum(); 12546 12547 SmallVector<Expr *, 16> Vars; 12548 Vars.reserve(NumVars); 12549 for (unsigned i = 0; i != NumVars; ++i) 12550 Vars.push_back(Record.readExpr()); 12551 C->setVarRefs(Vars); 12552 12553 SmallVector<Expr *, 16> UDMappers; 12554 UDMappers.reserve(NumVars); 12555 for (unsigned I = 0; I < NumVars; ++I) 12556 UDMappers.push_back(Record.readExpr()); 12557 C->setUDMapperRefs(UDMappers); 12558 12559 SmallVector<ValueDecl *, 16> Decls; 12560 Decls.reserve(UniqueDecls); 12561 for (unsigned i = 0; i < UniqueDecls; ++i) 12562 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12563 C->setUniqueDecls(Decls); 12564 12565 SmallVector<unsigned, 16> ListsPerDecl; 12566 ListsPerDecl.reserve(UniqueDecls); 12567 for (unsigned i = 0; i < UniqueDecls; ++i) 12568 ListsPerDecl.push_back(Record.readInt()); 12569 C->setDeclNumLists(ListsPerDecl); 12570 12571 SmallVector<unsigned, 32> ListSizes; 12572 ListSizes.reserve(TotalLists); 12573 for (unsigned i = 0; i < TotalLists; ++i) 12574 ListSizes.push_back(Record.readInt()); 12575 C->setComponentListSizes(ListSizes); 12576 12577 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12578 Components.reserve(TotalComponents); 12579 for (unsigned i = 0; i < TotalComponents; ++i) { 12580 Expr *AssociatedExprPr = Record.readExpr(); 12581 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12582 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12583 /*IsNonContiguous=*/false); 12584 } 12585 C->setComponents(Components, ListSizes); 12586 } 12587 12588 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12589 C->setLParenLoc(Record.readSourceLocation()); 12590 C->setColonLoc(Record.readSourceLocation()); 12591 C->setAllocator(Record.readSubExpr()); 12592 unsigned NumVars = C->varlist_size(); 12593 SmallVector<Expr *, 16> Vars; 12594 Vars.reserve(NumVars); 12595 for (unsigned i = 0; i != NumVars; ++i) 12596 Vars.push_back(Record.readSubExpr()); 12597 C->setVarRefs(Vars); 12598 } 12599 12600 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12601 VisitOMPClauseWithPreInit(C); 12602 C->setNumTeams(Record.readSubExpr()); 12603 C->setLParenLoc(Record.readSourceLocation()); 12604 } 12605 12606 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12607 VisitOMPClauseWithPreInit(C); 12608 C->setThreadLimit(Record.readSubExpr()); 12609 C->setLParenLoc(Record.readSourceLocation()); 12610 } 12611 12612 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12613 VisitOMPClauseWithPreInit(C); 12614 C->setPriority(Record.readSubExpr()); 12615 C->setLParenLoc(Record.readSourceLocation()); 12616 } 12617 12618 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12619 VisitOMPClauseWithPreInit(C); 12620 C->setGrainsize(Record.readSubExpr()); 12621 C->setLParenLoc(Record.readSourceLocation()); 12622 } 12623 12624 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12625 VisitOMPClauseWithPreInit(C); 12626 C->setNumTasks(Record.readSubExpr()); 12627 C->setLParenLoc(Record.readSourceLocation()); 12628 } 12629 12630 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12631 C->setHint(Record.readSubExpr()); 12632 C->setLParenLoc(Record.readSourceLocation()); 12633 } 12634 12635 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12636 VisitOMPClauseWithPreInit(C); 12637 C->setDistScheduleKind( 12638 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12639 C->setChunkSize(Record.readSubExpr()); 12640 C->setLParenLoc(Record.readSourceLocation()); 12641 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12642 C->setCommaLoc(Record.readSourceLocation()); 12643 } 12644 12645 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12646 C->setDefaultmapKind( 12647 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12648 C->setDefaultmapModifier( 12649 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12650 C->setLParenLoc(Record.readSourceLocation()); 12651 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12652 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12653 } 12654 12655 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12656 C->setLParenLoc(Record.readSourceLocation()); 12657 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12658 C->setMotionModifier( 12659 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12660 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12661 } 12662 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12663 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12664 C->setColonLoc(Record.readSourceLocation()); 12665 auto NumVars = C->varlist_size(); 12666 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12667 auto TotalLists = C->getTotalComponentListNum(); 12668 auto TotalComponents = C->getTotalComponentsNum(); 12669 12670 SmallVector<Expr *, 16> Vars; 12671 Vars.reserve(NumVars); 12672 for (unsigned i = 0; i != NumVars; ++i) 12673 Vars.push_back(Record.readSubExpr()); 12674 C->setVarRefs(Vars); 12675 12676 SmallVector<Expr *, 16> UDMappers; 12677 UDMappers.reserve(NumVars); 12678 for (unsigned I = 0; I < NumVars; ++I) 12679 UDMappers.push_back(Record.readSubExpr()); 12680 C->setUDMapperRefs(UDMappers); 12681 12682 SmallVector<ValueDecl *, 16> Decls; 12683 Decls.reserve(UniqueDecls); 12684 for (unsigned i = 0; i < UniqueDecls; ++i) 12685 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12686 C->setUniqueDecls(Decls); 12687 12688 SmallVector<unsigned, 16> ListsPerDecl; 12689 ListsPerDecl.reserve(UniqueDecls); 12690 for (unsigned i = 0; i < UniqueDecls; ++i) 12691 ListsPerDecl.push_back(Record.readInt()); 12692 C->setDeclNumLists(ListsPerDecl); 12693 12694 SmallVector<unsigned, 32> ListSizes; 12695 ListSizes.reserve(TotalLists); 12696 for (unsigned i = 0; i < TotalLists; ++i) 12697 ListSizes.push_back(Record.readInt()); 12698 C->setComponentListSizes(ListSizes); 12699 12700 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12701 Components.reserve(TotalComponents); 12702 for (unsigned i = 0; i < TotalComponents; ++i) { 12703 Expr *AssociatedExprPr = Record.readSubExpr(); 12704 bool IsNonContiguous = Record.readBool(); 12705 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12706 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12707 } 12708 C->setComponents(Components, ListSizes); 12709 } 12710 12711 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12712 C->setLParenLoc(Record.readSourceLocation()); 12713 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12714 C->setMotionModifier( 12715 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12716 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12717 } 12718 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12719 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12720 C->setColonLoc(Record.readSourceLocation()); 12721 auto NumVars = C->varlist_size(); 12722 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12723 auto TotalLists = C->getTotalComponentListNum(); 12724 auto TotalComponents = C->getTotalComponentsNum(); 12725 12726 SmallVector<Expr *, 16> Vars; 12727 Vars.reserve(NumVars); 12728 for (unsigned i = 0; i != NumVars; ++i) 12729 Vars.push_back(Record.readSubExpr()); 12730 C->setVarRefs(Vars); 12731 12732 SmallVector<Expr *, 16> UDMappers; 12733 UDMappers.reserve(NumVars); 12734 for (unsigned I = 0; I < NumVars; ++I) 12735 UDMappers.push_back(Record.readSubExpr()); 12736 C->setUDMapperRefs(UDMappers); 12737 12738 SmallVector<ValueDecl *, 16> Decls; 12739 Decls.reserve(UniqueDecls); 12740 for (unsigned i = 0; i < UniqueDecls; ++i) 12741 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12742 C->setUniqueDecls(Decls); 12743 12744 SmallVector<unsigned, 16> ListsPerDecl; 12745 ListsPerDecl.reserve(UniqueDecls); 12746 for (unsigned i = 0; i < UniqueDecls; ++i) 12747 ListsPerDecl.push_back(Record.readInt()); 12748 C->setDeclNumLists(ListsPerDecl); 12749 12750 SmallVector<unsigned, 32> ListSizes; 12751 ListSizes.reserve(TotalLists); 12752 for (unsigned i = 0; i < TotalLists; ++i) 12753 ListSizes.push_back(Record.readInt()); 12754 C->setComponentListSizes(ListSizes); 12755 12756 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12757 Components.reserve(TotalComponents); 12758 for (unsigned i = 0; i < TotalComponents; ++i) { 12759 Expr *AssociatedExprPr = Record.readSubExpr(); 12760 bool IsNonContiguous = Record.readBool(); 12761 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12762 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12763 } 12764 C->setComponents(Components, ListSizes); 12765 } 12766 12767 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12768 C->setLParenLoc(Record.readSourceLocation()); 12769 auto NumVars = C->varlist_size(); 12770 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12771 auto TotalLists = C->getTotalComponentListNum(); 12772 auto TotalComponents = C->getTotalComponentsNum(); 12773 12774 SmallVector<Expr *, 16> Vars; 12775 Vars.reserve(NumVars); 12776 for (unsigned i = 0; i != NumVars; ++i) 12777 Vars.push_back(Record.readSubExpr()); 12778 C->setVarRefs(Vars); 12779 Vars.clear(); 12780 for (unsigned i = 0; i != NumVars; ++i) 12781 Vars.push_back(Record.readSubExpr()); 12782 C->setPrivateCopies(Vars); 12783 Vars.clear(); 12784 for (unsigned i = 0; i != NumVars; ++i) 12785 Vars.push_back(Record.readSubExpr()); 12786 C->setInits(Vars); 12787 12788 SmallVector<ValueDecl *, 16> Decls; 12789 Decls.reserve(UniqueDecls); 12790 for (unsigned i = 0; i < UniqueDecls; ++i) 12791 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12792 C->setUniqueDecls(Decls); 12793 12794 SmallVector<unsigned, 16> ListsPerDecl; 12795 ListsPerDecl.reserve(UniqueDecls); 12796 for (unsigned i = 0; i < UniqueDecls; ++i) 12797 ListsPerDecl.push_back(Record.readInt()); 12798 C->setDeclNumLists(ListsPerDecl); 12799 12800 SmallVector<unsigned, 32> ListSizes; 12801 ListSizes.reserve(TotalLists); 12802 for (unsigned i = 0; i < TotalLists; ++i) 12803 ListSizes.push_back(Record.readInt()); 12804 C->setComponentListSizes(ListSizes); 12805 12806 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12807 Components.reserve(TotalComponents); 12808 for (unsigned i = 0; i < TotalComponents; ++i) { 12809 auto *AssociatedExprPr = Record.readSubExpr(); 12810 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12811 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12812 /*IsNonContiguous=*/false); 12813 } 12814 C->setComponents(Components, ListSizes); 12815 } 12816 12817 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12818 C->setLParenLoc(Record.readSourceLocation()); 12819 auto NumVars = C->varlist_size(); 12820 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12821 auto TotalLists = C->getTotalComponentListNum(); 12822 auto TotalComponents = C->getTotalComponentsNum(); 12823 12824 SmallVector<Expr *, 16> Vars; 12825 Vars.reserve(NumVars); 12826 for (unsigned i = 0; i != NumVars; ++i) 12827 Vars.push_back(Record.readSubExpr()); 12828 C->setVarRefs(Vars); 12829 12830 SmallVector<ValueDecl *, 16> Decls; 12831 Decls.reserve(UniqueDecls); 12832 for (unsigned i = 0; i < UniqueDecls; ++i) 12833 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12834 C->setUniqueDecls(Decls); 12835 12836 SmallVector<unsigned, 16> ListsPerDecl; 12837 ListsPerDecl.reserve(UniqueDecls); 12838 for (unsigned i = 0; i < UniqueDecls; ++i) 12839 ListsPerDecl.push_back(Record.readInt()); 12840 C->setDeclNumLists(ListsPerDecl); 12841 12842 SmallVector<unsigned, 32> ListSizes; 12843 ListSizes.reserve(TotalLists); 12844 for (unsigned i = 0; i < TotalLists; ++i) 12845 ListSizes.push_back(Record.readInt()); 12846 C->setComponentListSizes(ListSizes); 12847 12848 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12849 Components.reserve(TotalComponents); 12850 for (unsigned i = 0; i < TotalComponents; ++i) { 12851 Expr *AssociatedExpr = Record.readSubExpr(); 12852 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12853 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12854 /*IsNonContiguous*/ false); 12855 } 12856 C->setComponents(Components, ListSizes); 12857 } 12858 12859 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12860 C->setLParenLoc(Record.readSourceLocation()); 12861 auto NumVars = C->varlist_size(); 12862 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12863 auto TotalLists = C->getTotalComponentListNum(); 12864 auto TotalComponents = C->getTotalComponentsNum(); 12865 12866 SmallVector<Expr *, 16> Vars; 12867 Vars.reserve(NumVars); 12868 for (unsigned i = 0; i != NumVars; ++i) 12869 Vars.push_back(Record.readSubExpr()); 12870 C->setVarRefs(Vars); 12871 Vars.clear(); 12872 12873 SmallVector<ValueDecl *, 16> Decls; 12874 Decls.reserve(UniqueDecls); 12875 for (unsigned i = 0; i < UniqueDecls; ++i) 12876 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12877 C->setUniqueDecls(Decls); 12878 12879 SmallVector<unsigned, 16> ListsPerDecl; 12880 ListsPerDecl.reserve(UniqueDecls); 12881 for (unsigned i = 0; i < UniqueDecls; ++i) 12882 ListsPerDecl.push_back(Record.readInt()); 12883 C->setDeclNumLists(ListsPerDecl); 12884 12885 SmallVector<unsigned, 32> ListSizes; 12886 ListSizes.reserve(TotalLists); 12887 for (unsigned i = 0; i < TotalLists; ++i) 12888 ListSizes.push_back(Record.readInt()); 12889 C->setComponentListSizes(ListSizes); 12890 12891 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12892 Components.reserve(TotalComponents); 12893 for (unsigned i = 0; i < TotalComponents; ++i) { 12894 Expr *AssociatedExpr = Record.readSubExpr(); 12895 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12896 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12897 /*IsNonContiguous=*/false); 12898 } 12899 C->setComponents(Components, ListSizes); 12900 } 12901 12902 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12903 C->setLParenLoc(Record.readSourceLocation()); 12904 unsigned NumVars = C->varlist_size(); 12905 SmallVector<Expr *, 16> Vars; 12906 Vars.reserve(NumVars); 12907 for (unsigned i = 0; i != NumVars; ++i) 12908 Vars.push_back(Record.readSubExpr()); 12909 C->setVarRefs(Vars); 12910 Vars.clear(); 12911 Vars.reserve(NumVars); 12912 for (unsigned i = 0; i != NumVars; ++i) 12913 Vars.push_back(Record.readSubExpr()); 12914 C->setPrivateRefs(Vars); 12915 } 12916 12917 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12918 C->setLParenLoc(Record.readSourceLocation()); 12919 unsigned NumVars = C->varlist_size(); 12920 SmallVector<Expr *, 16> Vars; 12921 Vars.reserve(NumVars); 12922 for (unsigned i = 0; i != NumVars; ++i) 12923 Vars.push_back(Record.readSubExpr()); 12924 C->setVarRefs(Vars); 12925 } 12926 12927 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12928 C->setLParenLoc(Record.readSourceLocation()); 12929 unsigned NumVars = C->varlist_size(); 12930 SmallVector<Expr *, 16> Vars; 12931 Vars.reserve(NumVars); 12932 for (unsigned i = 0; i != NumVars; ++i) 12933 Vars.push_back(Record.readSubExpr()); 12934 C->setVarRefs(Vars); 12935 } 12936 12937 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12938 C->setLParenLoc(Record.readSourceLocation()); 12939 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12940 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12941 Data.reserve(NumOfAllocators); 12942 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12943 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12944 D.Allocator = Record.readSubExpr(); 12945 D.AllocatorTraits = Record.readSubExpr(); 12946 D.LParenLoc = Record.readSourceLocation(); 12947 D.RParenLoc = Record.readSourceLocation(); 12948 } 12949 C->setAllocatorsData(Data); 12950 } 12951 12952 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12953 C->setLParenLoc(Record.readSourceLocation()); 12954 C->setModifier(Record.readSubExpr()); 12955 C->setColonLoc(Record.readSourceLocation()); 12956 unsigned NumOfLocators = C->varlist_size(); 12957 SmallVector<Expr *, 4> Locators; 12958 Locators.reserve(NumOfLocators); 12959 for (unsigned I = 0; I != NumOfLocators; ++I) 12960 Locators.push_back(Record.readSubExpr()); 12961 C->setVarRefs(Locators); 12962 } 12963 12964 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12965 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12966 C->setLParenLoc(Record.readSourceLocation()); 12967 C->setKindKwLoc(Record.readSourceLocation()); 12968 } 12969 12970 void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) { 12971 VisitOMPClauseWithPreInit(C); 12972 C->setThreadID(Record.readSubExpr()); 12973 C->setLParenLoc(Record.readSourceLocation()); 12974 } 12975 12976 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12977 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12978 TI.Sets.resize(readUInt32()); 12979 for (auto &Set : TI.Sets) { 12980 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12981 Set.Selectors.resize(readUInt32()); 12982 for (auto &Selector : Set.Selectors) { 12983 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12984 Selector.ScoreOrCondition = nullptr; 12985 if (readBool()) 12986 Selector.ScoreOrCondition = readExprRef(); 12987 Selector.Properties.resize(readUInt32()); 12988 for (auto &Property : Selector.Properties) 12989 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 12990 } 12991 } 12992 return &TI; 12993 } 12994 12995 void ASTRecordReader::readOMPChildren(OMPChildren *Data) { 12996 if (!Data) 12997 return; 12998 if (Reader->ReadingKind == ASTReader::Read_Stmt) { 12999 // Skip NumClauses, NumChildren and HasAssociatedStmt fields. 13000 skipInts(3); 13001 } 13002 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses()); 13003 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I) 13004 Clauses[I] = readOMPClause(); 13005 Data->setClauses(Clauses); 13006 if (Data->hasAssociatedStmt()) 13007 Data->setAssociatedStmt(readStmt()); 13008 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I) 13009 Data->getChildren()[I] = readStmt(); 13010 } 13011