1 //===- ASTReader.cpp - AST File Reader ------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the ASTReader class, which reads AST files. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "ASTCommon.h" 14 #include "ASTReaderInternals.h" 15 #include "clang/AST/ASTConsumer.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/ASTMutationListener.h" 18 #include "clang/AST/ASTUnresolvedSet.h" 19 #include "clang/AST/AbstractTypeReader.h" 20 #include "clang/AST/Decl.h" 21 #include "clang/AST/DeclBase.h" 22 #include "clang/AST/DeclCXX.h" 23 #include "clang/AST/DeclFriend.h" 24 #include "clang/AST/DeclGroup.h" 25 #include "clang/AST/DeclObjC.h" 26 #include "clang/AST/DeclTemplate.h" 27 #include "clang/AST/DeclarationName.h" 28 #include "clang/AST/Expr.h" 29 #include "clang/AST/ExprCXX.h" 30 #include "clang/AST/ExternalASTSource.h" 31 #include "clang/AST/NestedNameSpecifier.h" 32 #include "clang/AST/ODRHash.h" 33 #include "clang/AST/OpenMPClause.h" 34 #include "clang/AST/RawCommentList.h" 35 #include "clang/AST/TemplateBase.h" 36 #include "clang/AST/TemplateName.h" 37 #include "clang/AST/Type.h" 38 #include "clang/AST/TypeLoc.h" 39 #include "clang/AST/TypeLocVisitor.h" 40 #include "clang/AST/UnresolvedSet.h" 41 #include "clang/Basic/CommentOptions.h" 42 #include "clang/Basic/Diagnostic.h" 43 #include "clang/Basic/DiagnosticError.h" 44 #include "clang/Basic/DiagnosticOptions.h" 45 #include "clang/Basic/ExceptionSpecificationType.h" 46 #include "clang/Basic/FileManager.h" 47 #include "clang/Basic/FileSystemOptions.h" 48 #include "clang/Basic/IdentifierTable.h" 49 #include "clang/Basic/LLVM.h" 50 #include "clang/Basic/LangOptions.h" 51 #include "clang/Basic/Module.h" 52 #include "clang/Basic/ObjCRuntime.h" 53 #include "clang/Basic/OpenMPKinds.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/ASTRecordReader.h" 80 #include "clang/Serialization/ContinuousRangeMap.h" 81 #include "clang/Serialization/GlobalModuleIndex.h" 82 #include "clang/Serialization/InMemoryModuleCache.h" 83 #include "clang/Serialization/ModuleFile.h" 84 #include "clang/Serialization/ModuleFileExtension.h" 85 #include "clang/Serialization/ModuleManager.h" 86 #include "clang/Serialization/PCHContainerOperations.h" 87 #include "clang/Serialization/SerializationDiagnostic.h" 88 #include "llvm/ADT/APFloat.h" 89 #include "llvm/ADT/APInt.h" 90 #include "llvm/ADT/APSInt.h" 91 #include "llvm/ADT/ArrayRef.h" 92 #include "llvm/ADT/DenseMap.h" 93 #include "llvm/ADT/FloatingPointMode.h" 94 #include "llvm/ADT/FoldingSet.h" 95 #include "llvm/ADT/Hashing.h" 96 #include "llvm/ADT/IntrusiveRefCntPtr.h" 97 #include "llvm/ADT/None.h" 98 #include "llvm/ADT/Optional.h" 99 #include "llvm/ADT/STLExtras.h" 100 #include "llvm/ADT/ScopeExit.h" 101 #include "llvm/ADT/SmallPtrSet.h" 102 #include "llvm/ADT/SmallString.h" 103 #include "llvm/ADT/SmallVector.h" 104 #include "llvm/ADT/StringExtras.h" 105 #include "llvm/ADT/StringMap.h" 106 #include "llvm/ADT/StringRef.h" 107 #include "llvm/ADT/Triple.h" 108 #include "llvm/ADT/iterator_range.h" 109 #include "llvm/Bitstream/BitstreamReader.h" 110 #include "llvm/Support/Casting.h" 111 #include "llvm/Support/Compiler.h" 112 #include "llvm/Support/Compression.h" 113 #include "llvm/Support/DJB.h" 114 #include "llvm/Support/Endian.h" 115 #include "llvm/Support/Error.h" 116 #include "llvm/Support/ErrorHandling.h" 117 #include "llvm/Support/FileSystem.h" 118 #include "llvm/Support/LEB128.h" 119 #include "llvm/Support/MemoryBuffer.h" 120 #include "llvm/Support/Path.h" 121 #include "llvm/Support/SaveAndRestore.h" 122 #include "llvm/Support/Timer.h" 123 #include "llvm/Support/VersionTuple.h" 124 #include "llvm/Support/raw_ostream.h" 125 #include <algorithm> 126 #include <cassert> 127 #include <cstddef> 128 #include <cstdint> 129 #include <cstdio> 130 #include <ctime> 131 #include <iterator> 132 #include <limits> 133 #include <map> 134 #include <memory> 135 #include <string> 136 #include <system_error> 137 #include <tuple> 138 #include <utility> 139 #include <vector> 140 141 using namespace clang; 142 using namespace clang::serialization; 143 using namespace clang::serialization::reader; 144 using llvm::BitstreamCursor; 145 using llvm::RoundingMode; 146 147 //===----------------------------------------------------------------------===// 148 // ChainedASTReaderListener implementation 149 //===----------------------------------------------------------------------===// 150 151 bool 152 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 153 return First->ReadFullVersionInformation(FullVersion) || 154 Second->ReadFullVersionInformation(FullVersion); 155 } 156 157 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 158 First->ReadModuleName(ModuleName); 159 Second->ReadModuleName(ModuleName); 160 } 161 162 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 163 First->ReadModuleMapFile(ModuleMapPath); 164 Second->ReadModuleMapFile(ModuleMapPath); 165 } 166 167 bool 168 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 169 bool Complain, 170 bool AllowCompatibleDifferences) { 171 return First->ReadLanguageOptions(LangOpts, Complain, 172 AllowCompatibleDifferences) || 173 Second->ReadLanguageOptions(LangOpts, Complain, 174 AllowCompatibleDifferences); 175 } 176 177 bool ChainedASTReaderListener::ReadTargetOptions( 178 const TargetOptions &TargetOpts, bool Complain, 179 bool AllowCompatibleDifferences) { 180 return First->ReadTargetOptions(TargetOpts, Complain, 181 AllowCompatibleDifferences) || 182 Second->ReadTargetOptions(TargetOpts, Complain, 183 AllowCompatibleDifferences); 184 } 185 186 bool ChainedASTReaderListener::ReadDiagnosticOptions( 187 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 188 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 189 Second->ReadDiagnosticOptions(DiagOpts, Complain); 190 } 191 192 bool 193 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 194 bool Complain) { 195 return First->ReadFileSystemOptions(FSOpts, Complain) || 196 Second->ReadFileSystemOptions(FSOpts, Complain); 197 } 198 199 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 200 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 201 bool Complain) { 202 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 203 Complain) || 204 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 205 Complain); 206 } 207 208 bool ChainedASTReaderListener::ReadPreprocessorOptions( 209 const PreprocessorOptions &PPOpts, bool Complain, 210 std::string &SuggestedPredefines) { 211 return First->ReadPreprocessorOptions(PPOpts, Complain, 212 SuggestedPredefines) || 213 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 214 } 215 216 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 217 unsigned Value) { 218 First->ReadCounter(M, Value); 219 Second->ReadCounter(M, Value); 220 } 221 222 bool ChainedASTReaderListener::needsInputFileVisitation() { 223 return First->needsInputFileVisitation() || 224 Second->needsInputFileVisitation(); 225 } 226 227 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 228 return First->needsSystemInputFileVisitation() || 229 Second->needsSystemInputFileVisitation(); 230 } 231 232 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 233 ModuleKind Kind) { 234 First->visitModuleFile(Filename, Kind); 235 Second->visitModuleFile(Filename, Kind); 236 } 237 238 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 239 bool isSystem, 240 bool isOverridden, 241 bool isExplicitModule) { 242 bool Continue = false; 243 if (First->needsInputFileVisitation() && 244 (!isSystem || First->needsSystemInputFileVisitation())) 245 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 246 isExplicitModule); 247 if (Second->needsInputFileVisitation() && 248 (!isSystem || Second->needsSystemInputFileVisitation())) 249 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 250 isExplicitModule); 251 return Continue; 252 } 253 254 void ChainedASTReaderListener::readModuleFileExtension( 255 const ModuleFileExtensionMetadata &Metadata) { 256 First->readModuleFileExtension(Metadata); 257 Second->readModuleFileExtension(Metadata); 258 } 259 260 //===----------------------------------------------------------------------===// 261 // PCH validator implementation 262 //===----------------------------------------------------------------------===// 263 264 ASTReaderListener::~ASTReaderListener() = default; 265 266 /// Compare the given set of language options against an existing set of 267 /// language options. 268 /// 269 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 270 /// \param AllowCompatibleDifferences If true, differences between compatible 271 /// language options will be permitted. 272 /// 273 /// \returns true if the languagae options mis-match, false otherwise. 274 static bool checkLanguageOptions(const LangOptions &LangOpts, 275 const LangOptions &ExistingLangOpts, 276 DiagnosticsEngine *Diags, 277 bool AllowCompatibleDifferences = true) { 278 #define LANGOPT(Name, Bits, Default, Description) \ 279 if (ExistingLangOpts.Name != LangOpts.Name) { \ 280 if (Diags) \ 281 Diags->Report(diag::err_pch_langopt_mismatch) \ 282 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 283 return true; \ 284 } 285 286 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 287 if (ExistingLangOpts.Name != LangOpts.Name) { \ 288 if (Diags) \ 289 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 290 << Description; \ 291 return true; \ 292 } 293 294 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 295 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 296 if (Diags) \ 297 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 298 << Description; \ 299 return true; \ 300 } 301 302 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 303 if (!AllowCompatibleDifferences) \ 304 LANGOPT(Name, Bits, Default, Description) 305 306 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 307 if (!AllowCompatibleDifferences) \ 308 ENUM_LANGOPT(Name, Bits, Default, Description) 309 310 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 311 if (!AllowCompatibleDifferences) \ 312 VALUE_LANGOPT(Name, Bits, Default, Description) 313 314 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 315 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 316 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) 317 #include "clang/Basic/LangOptions.def" 318 319 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 320 if (Diags) 321 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 322 return true; 323 } 324 325 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 326 if (Diags) 327 Diags->Report(diag::err_pch_langopt_value_mismatch) 328 << "target Objective-C runtime"; 329 return true; 330 } 331 332 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 333 LangOpts.CommentOpts.BlockCommandNames) { 334 if (Diags) 335 Diags->Report(diag::err_pch_langopt_value_mismatch) 336 << "block command names"; 337 return true; 338 } 339 340 // Sanitizer feature mismatches are treated as compatible differences. If 341 // compatible differences aren't allowed, we still only want to check for 342 // mismatches of non-modular sanitizers (the only ones which can affect AST 343 // generation). 344 if (!AllowCompatibleDifferences) { 345 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 346 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 347 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 348 ExistingSanitizers.clear(ModularSanitizers); 349 ImportedSanitizers.clear(ModularSanitizers); 350 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 351 const std::string Flag = "-fsanitize="; 352 if (Diags) { 353 #define SANITIZER(NAME, ID) \ 354 { \ 355 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 356 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 357 if (InExistingModule != InImportedModule) \ 358 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 359 << InExistingModule << (Flag + NAME); \ 360 } 361 #include "clang/Basic/Sanitizers.def" 362 } 363 return true; 364 } 365 } 366 367 return false; 368 } 369 370 /// Compare the given set of target options against an existing set of 371 /// target options. 372 /// 373 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 374 /// 375 /// \returns true if the target options mis-match, false otherwise. 376 static bool checkTargetOptions(const TargetOptions &TargetOpts, 377 const TargetOptions &ExistingTargetOpts, 378 DiagnosticsEngine *Diags, 379 bool AllowCompatibleDifferences = true) { 380 #define CHECK_TARGET_OPT(Field, Name) \ 381 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 382 if (Diags) \ 383 Diags->Report(diag::err_pch_targetopt_mismatch) \ 384 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 385 return true; \ 386 } 387 388 // The triple and ABI must match exactly. 389 CHECK_TARGET_OPT(Triple, "target"); 390 CHECK_TARGET_OPT(ABI, "target ABI"); 391 392 // We can tolerate different CPUs in many cases, notably when one CPU 393 // supports a strict superset of another. When allowing compatible 394 // differences skip this check. 395 if (!AllowCompatibleDifferences) { 396 CHECK_TARGET_OPT(CPU, "target CPU"); 397 CHECK_TARGET_OPT(TuneCPU, "tune CPU"); 398 } 399 400 #undef CHECK_TARGET_OPT 401 402 // Compare feature sets. 403 SmallVector<StringRef, 4> ExistingFeatures( 404 ExistingTargetOpts.FeaturesAsWritten.begin(), 405 ExistingTargetOpts.FeaturesAsWritten.end()); 406 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 407 TargetOpts.FeaturesAsWritten.end()); 408 llvm::sort(ExistingFeatures); 409 llvm::sort(ReadFeatures); 410 411 // We compute the set difference in both directions explicitly so that we can 412 // diagnose the differences differently. 413 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 414 std::set_difference( 415 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 416 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 417 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 418 ExistingFeatures.begin(), ExistingFeatures.end(), 419 std::back_inserter(UnmatchedReadFeatures)); 420 421 // If we are allowing compatible differences and the read feature set is 422 // a strict subset of the existing feature set, there is nothing to diagnose. 423 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 424 return false; 425 426 if (Diags) { 427 for (StringRef Feature : UnmatchedReadFeatures) 428 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 429 << /* is-existing-feature */ false << Feature; 430 for (StringRef Feature : UnmatchedExistingFeatures) 431 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 432 << /* is-existing-feature */ true << Feature; 433 } 434 435 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 436 } 437 438 bool 439 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 440 bool Complain, 441 bool AllowCompatibleDifferences) { 442 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 443 return checkLanguageOptions(LangOpts, ExistingLangOpts, 444 Complain ? &Reader.Diags : nullptr, 445 AllowCompatibleDifferences); 446 } 447 448 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 449 bool Complain, 450 bool AllowCompatibleDifferences) { 451 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 452 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 453 Complain ? &Reader.Diags : nullptr, 454 AllowCompatibleDifferences); 455 } 456 457 namespace { 458 459 using MacroDefinitionsMap = 460 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 461 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 462 463 } // namespace 464 465 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 466 DiagnosticsEngine &Diags, 467 bool Complain) { 468 using Level = DiagnosticsEngine::Level; 469 470 // Check current mappings for new -Werror mappings, and the stored mappings 471 // for cases that were explicitly mapped to *not* be errors that are now 472 // errors because of options like -Werror. 473 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 474 475 for (DiagnosticsEngine *MappingSource : MappingSources) { 476 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 477 diag::kind DiagID = DiagIDMappingPair.first; 478 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 479 if (CurLevel < DiagnosticsEngine::Error) 480 continue; // not significant 481 Level StoredLevel = 482 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 483 if (StoredLevel < DiagnosticsEngine::Error) { 484 if (Complain) 485 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 486 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 487 return true; 488 } 489 } 490 } 491 492 return false; 493 } 494 495 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 496 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 497 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 498 return true; 499 return Ext >= diag::Severity::Error; 500 } 501 502 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 503 DiagnosticsEngine &Diags, 504 bool IsSystem, bool Complain) { 505 // Top-level options 506 if (IsSystem) { 507 if (Diags.getSuppressSystemWarnings()) 508 return false; 509 // If -Wsystem-headers was not enabled before, be conservative 510 if (StoredDiags.getSuppressSystemWarnings()) { 511 if (Complain) 512 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 513 return true; 514 } 515 } 516 517 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 518 if (Complain) 519 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 520 return true; 521 } 522 523 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 524 !StoredDiags.getEnableAllWarnings()) { 525 if (Complain) 526 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 527 return true; 528 } 529 530 if (isExtHandlingFromDiagsError(Diags) && 531 !isExtHandlingFromDiagsError(StoredDiags)) { 532 if (Complain) 533 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 534 return true; 535 } 536 537 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 538 } 539 540 /// Return the top import module if it is implicit, nullptr otherwise. 541 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 542 Preprocessor &PP) { 543 // If the original import came from a file explicitly generated by the user, 544 // don't check the diagnostic mappings. 545 // FIXME: currently this is approximated by checking whether this is not a 546 // module import of an implicitly-loaded module file. 547 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 548 // the transitive closure of its imports, since unrelated modules cannot be 549 // imported until after this module finishes validation. 550 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 551 while (!TopImport->ImportedBy.empty()) 552 TopImport = TopImport->ImportedBy[0]; 553 if (TopImport->Kind != MK_ImplicitModule) 554 return nullptr; 555 556 StringRef ModuleName = TopImport->ModuleName; 557 assert(!ModuleName.empty() && "diagnostic options read before module name"); 558 559 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName); 560 assert(M && "missing module"); 561 return M; 562 } 563 564 bool PCHValidator::ReadDiagnosticOptions( 565 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 566 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 567 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 568 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 569 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 570 // This should never fail, because we would have processed these options 571 // before writing them to an ASTFile. 572 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 573 574 ModuleManager &ModuleMgr = Reader.getModuleManager(); 575 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 576 577 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 578 if (!TopM) 579 return false; 580 581 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 582 // contains the union of their flags. 583 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 584 Complain); 585 } 586 587 /// Collect the macro definitions provided by the given preprocessor 588 /// options. 589 static void 590 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 591 MacroDefinitionsMap &Macros, 592 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 593 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 594 StringRef Macro = PPOpts.Macros[I].first; 595 bool IsUndef = PPOpts.Macros[I].second; 596 597 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 598 StringRef MacroName = MacroPair.first; 599 StringRef MacroBody = MacroPair.second; 600 601 // For an #undef'd macro, we only care about the name. 602 if (IsUndef) { 603 if (MacroNames && !Macros.count(MacroName)) 604 MacroNames->push_back(MacroName); 605 606 Macros[MacroName] = std::make_pair("", true); 607 continue; 608 } 609 610 // For a #define'd macro, figure out the actual definition. 611 if (MacroName.size() == Macro.size()) 612 MacroBody = "1"; 613 else { 614 // Note: GCC drops anything following an end-of-line character. 615 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 616 MacroBody = MacroBody.substr(0, End); 617 } 618 619 if (MacroNames && !Macros.count(MacroName)) 620 MacroNames->push_back(MacroName); 621 Macros[MacroName] = std::make_pair(MacroBody, false); 622 } 623 } 624 625 /// Check the preprocessor options deserialized from the control block 626 /// against the preprocessor options in an existing preprocessor. 627 /// 628 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 629 /// \param Validate If true, validate preprocessor options. If false, allow 630 /// macros defined by \p ExistingPPOpts to override those defined by 631 /// \p PPOpts in SuggestedPredefines. 632 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 633 const PreprocessorOptions &ExistingPPOpts, 634 DiagnosticsEngine *Diags, 635 FileManager &FileMgr, 636 std::string &SuggestedPredefines, 637 const LangOptions &LangOpts, 638 bool Validate = true) { 639 // Check macro definitions. 640 MacroDefinitionsMap ASTFileMacros; 641 collectMacroDefinitions(PPOpts, ASTFileMacros); 642 MacroDefinitionsMap ExistingMacros; 643 SmallVector<StringRef, 4> ExistingMacroNames; 644 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 645 646 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 647 // Dig out the macro definition in the existing preprocessor options. 648 StringRef MacroName = ExistingMacroNames[I]; 649 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 650 651 // Check whether we know anything about this macro name or not. 652 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 653 ASTFileMacros.find(MacroName); 654 if (!Validate || Known == ASTFileMacros.end()) { 655 // FIXME: Check whether this identifier was referenced anywhere in the 656 // AST file. If so, we should reject the AST file. Unfortunately, this 657 // information isn't in the control block. What shall we do about it? 658 659 if (Existing.second) { 660 SuggestedPredefines += "#undef "; 661 SuggestedPredefines += MacroName.str(); 662 SuggestedPredefines += '\n'; 663 } else { 664 SuggestedPredefines += "#define "; 665 SuggestedPredefines += MacroName.str(); 666 SuggestedPredefines += ' '; 667 SuggestedPredefines += Existing.first.str(); 668 SuggestedPredefines += '\n'; 669 } 670 continue; 671 } 672 673 // If the macro was defined in one but undef'd in the other, we have a 674 // conflict. 675 if (Existing.second != Known->second.second) { 676 if (Diags) { 677 Diags->Report(diag::err_pch_macro_def_undef) 678 << MacroName << Known->second.second; 679 } 680 return true; 681 } 682 683 // If the macro was #undef'd in both, or if the macro bodies are identical, 684 // it's fine. 685 if (Existing.second || Existing.first == Known->second.first) 686 continue; 687 688 // The macro bodies differ; complain. 689 if (Diags) { 690 Diags->Report(diag::err_pch_macro_def_conflict) 691 << MacroName << Known->second.first << Existing.first; 692 } 693 return true; 694 } 695 696 // Check whether we're using predefines. 697 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 698 if (Diags) { 699 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 700 } 701 return true; 702 } 703 704 // Detailed record is important since it is used for the module cache hash. 705 if (LangOpts.Modules && 706 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 707 if (Diags) { 708 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 709 } 710 return true; 711 } 712 713 // Compute the #include and #include_macros lines we need. 714 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 715 StringRef File = ExistingPPOpts.Includes[I]; 716 717 if (!ExistingPPOpts.ImplicitPCHInclude.empty() && 718 !ExistingPPOpts.PCHThroughHeader.empty()) { 719 // In case the through header is an include, we must add all the includes 720 // to the predefines so the start point can be determined. 721 SuggestedPredefines += "#include \""; 722 SuggestedPredefines += File; 723 SuggestedPredefines += "\"\n"; 724 continue; 725 } 726 727 if (File == ExistingPPOpts.ImplicitPCHInclude) 728 continue; 729 730 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 731 != PPOpts.Includes.end()) 732 continue; 733 734 SuggestedPredefines += "#include \""; 735 SuggestedPredefines += File; 736 SuggestedPredefines += "\"\n"; 737 } 738 739 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 740 StringRef File = ExistingPPOpts.MacroIncludes[I]; 741 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 742 File) 743 != PPOpts.MacroIncludes.end()) 744 continue; 745 746 SuggestedPredefines += "#__include_macros \""; 747 SuggestedPredefines += File; 748 SuggestedPredefines += "\"\n##\n"; 749 } 750 751 return false; 752 } 753 754 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 755 bool Complain, 756 std::string &SuggestedPredefines) { 757 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 758 759 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 760 Complain? &Reader.Diags : nullptr, 761 PP.getFileManager(), 762 SuggestedPredefines, 763 PP.getLangOpts()); 764 } 765 766 bool SimpleASTReaderListener::ReadPreprocessorOptions( 767 const PreprocessorOptions &PPOpts, 768 bool Complain, 769 std::string &SuggestedPredefines) { 770 return checkPreprocessorOptions(PPOpts, 771 PP.getPreprocessorOpts(), 772 nullptr, 773 PP.getFileManager(), 774 SuggestedPredefines, 775 PP.getLangOpts(), 776 false); 777 } 778 779 /// Check the header search options deserialized from the control block 780 /// against the header search options in an existing preprocessor. 781 /// 782 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 783 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 784 StringRef SpecificModuleCachePath, 785 StringRef ExistingModuleCachePath, 786 DiagnosticsEngine *Diags, 787 const LangOptions &LangOpts, 788 const PreprocessorOptions &PPOpts) { 789 if (LangOpts.Modules) { 790 if (SpecificModuleCachePath != ExistingModuleCachePath && 791 !PPOpts.AllowPCHWithDifferentModulesCachePath) { 792 if (Diags) 793 Diags->Report(diag::err_pch_modulecache_mismatch) 794 << SpecificModuleCachePath << ExistingModuleCachePath; 795 return true; 796 } 797 } 798 799 return false; 800 } 801 802 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 803 StringRef SpecificModuleCachePath, 804 bool Complain) { 805 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 806 PP.getHeaderSearchInfo().getModuleCachePath(), 807 Complain ? &Reader.Diags : nullptr, 808 PP.getLangOpts(), PP.getPreprocessorOpts()); 809 } 810 811 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 812 PP.setCounterValue(Value); 813 } 814 815 //===----------------------------------------------------------------------===// 816 // AST reader implementation 817 //===----------------------------------------------------------------------===// 818 819 static uint64_t readULEB(const unsigned char *&P) { 820 unsigned Length = 0; 821 const char *Error = nullptr; 822 823 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error); 824 if (Error) 825 llvm::report_fatal_error(Error); 826 P += Length; 827 return Val; 828 } 829 830 /// Read ULEB-encoded key length and data length. 831 static std::pair<unsigned, unsigned> 832 readULEBKeyDataLength(const unsigned char *&P) { 833 unsigned KeyLen = readULEB(P); 834 if ((unsigned)KeyLen != KeyLen) 835 llvm::report_fatal_error("key too large"); 836 837 unsigned DataLen = readULEB(P); 838 if ((unsigned)DataLen != DataLen) 839 llvm::report_fatal_error("data too large"); 840 841 return std::make_pair(KeyLen, DataLen); 842 } 843 844 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 845 bool TakeOwnership) { 846 DeserializationListener = Listener; 847 OwnsDeserializationListener = TakeOwnership; 848 } 849 850 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 851 return serialization::ComputeHash(Sel); 852 } 853 854 std::pair<unsigned, unsigned> 855 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 856 return readULEBKeyDataLength(d); 857 } 858 859 ASTSelectorLookupTrait::internal_key_type 860 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 861 using namespace llvm::support; 862 863 SelectorTable &SelTable = Reader.getContext().Selectors; 864 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 865 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 866 F, endian::readNext<uint32_t, little, unaligned>(d)); 867 if (N == 0) 868 return SelTable.getNullarySelector(FirstII); 869 else if (N == 1) 870 return SelTable.getUnarySelector(FirstII); 871 872 SmallVector<IdentifierInfo *, 16> Args; 873 Args.push_back(FirstII); 874 for (unsigned I = 1; I != N; ++I) 875 Args.push_back(Reader.getLocalIdentifier( 876 F, endian::readNext<uint32_t, little, unaligned>(d))); 877 878 return SelTable.getSelector(N, Args.data()); 879 } 880 881 ASTSelectorLookupTrait::data_type 882 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 883 unsigned DataLen) { 884 using namespace llvm::support; 885 886 data_type Result; 887 888 Result.ID = Reader.getGlobalSelectorID( 889 F, endian::readNext<uint32_t, little, unaligned>(d)); 890 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 891 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 892 Result.InstanceBits = FullInstanceBits & 0x3; 893 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 894 Result.FactoryBits = FullFactoryBits & 0x3; 895 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 896 unsigned NumInstanceMethods = FullInstanceBits >> 3; 897 unsigned NumFactoryMethods = FullFactoryBits >> 3; 898 899 // Load instance methods 900 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 901 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 902 F, endian::readNext<uint32_t, little, unaligned>(d))) 903 Result.Instance.push_back(Method); 904 } 905 906 // Load factory methods 907 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 908 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 909 F, endian::readNext<uint32_t, little, unaligned>(d))) 910 Result.Factory.push_back(Method); 911 } 912 913 return Result; 914 } 915 916 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 917 return llvm::djbHash(a); 918 } 919 920 std::pair<unsigned, unsigned> 921 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 922 return readULEBKeyDataLength(d); 923 } 924 925 ASTIdentifierLookupTraitBase::internal_key_type 926 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 927 assert(n >= 2 && d[n-1] == '\0'); 928 return StringRef((const char*) d, n-1); 929 } 930 931 /// Whether the given identifier is "interesting". 932 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 933 bool IsModule) { 934 return II.hadMacroDefinition() || II.isPoisoned() || 935 (!IsModule && II.getObjCOrBuiltinID()) || 936 II.hasRevertedTokenIDToIdentifier() || 937 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 938 II.getFETokenInfo()); 939 } 940 941 static bool readBit(unsigned &Bits) { 942 bool Value = Bits & 0x1; 943 Bits >>= 1; 944 return Value; 945 } 946 947 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 948 using namespace llvm::support; 949 950 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 951 return Reader.getGlobalIdentifierID(F, RawID >> 1); 952 } 953 954 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 955 if (!II.isFromAST()) { 956 II.setIsFromAST(); 957 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 958 if (isInterestingIdentifier(Reader, II, IsModule)) 959 II.setChangedSinceDeserialization(); 960 } 961 } 962 963 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 964 const unsigned char* d, 965 unsigned DataLen) { 966 using namespace llvm::support; 967 968 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 969 bool IsInteresting = RawID & 0x01; 970 971 // Wipe out the "is interesting" bit. 972 RawID = RawID >> 1; 973 974 // Build the IdentifierInfo and link the identifier ID with it. 975 IdentifierInfo *II = KnownII; 976 if (!II) { 977 II = &Reader.getIdentifierTable().getOwn(k); 978 KnownII = II; 979 } 980 markIdentifierFromAST(Reader, *II); 981 Reader.markIdentifierUpToDate(II); 982 983 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 984 if (!IsInteresting) { 985 // For uninteresting identifiers, there's nothing else to do. Just notify 986 // the reader that we've finished loading this identifier. 987 Reader.SetIdentifierInfo(ID, II); 988 return II; 989 } 990 991 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 992 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 993 bool CPlusPlusOperatorKeyword = readBit(Bits); 994 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 995 bool Poisoned = readBit(Bits); 996 bool ExtensionToken = readBit(Bits); 997 bool HadMacroDefinition = readBit(Bits); 998 999 assert(Bits == 0 && "Extra bits in the identifier?"); 1000 DataLen -= 8; 1001 1002 // Set or check the various bits in the IdentifierInfo structure. 1003 // Token IDs are read-only. 1004 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 1005 II->revertTokenIDToIdentifier(); 1006 if (!F.isModule()) 1007 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 1008 assert(II->isExtensionToken() == ExtensionToken && 1009 "Incorrect extension token flag"); 1010 (void)ExtensionToken; 1011 if (Poisoned) 1012 II->setIsPoisoned(true); 1013 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 1014 "Incorrect C++ operator keyword flag"); 1015 (void)CPlusPlusOperatorKeyword; 1016 1017 // If this identifier is a macro, deserialize the macro 1018 // definition. 1019 if (HadMacroDefinition) { 1020 uint32_t MacroDirectivesOffset = 1021 endian::readNext<uint32_t, little, unaligned>(d); 1022 DataLen -= 4; 1023 1024 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 1025 } 1026 1027 Reader.SetIdentifierInfo(ID, II); 1028 1029 // Read all of the declarations visible at global scope with this 1030 // name. 1031 if (DataLen > 0) { 1032 SmallVector<uint32_t, 4> DeclIDs; 1033 for (; DataLen > 0; DataLen -= 4) 1034 DeclIDs.push_back(Reader.getGlobalDeclID( 1035 F, endian::readNext<uint32_t, little, unaligned>(d))); 1036 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1037 } 1038 1039 return II; 1040 } 1041 1042 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1043 : Kind(Name.getNameKind()) { 1044 switch (Kind) { 1045 case DeclarationName::Identifier: 1046 Data = (uint64_t)Name.getAsIdentifierInfo(); 1047 break; 1048 case DeclarationName::ObjCZeroArgSelector: 1049 case DeclarationName::ObjCOneArgSelector: 1050 case DeclarationName::ObjCMultiArgSelector: 1051 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1052 break; 1053 case DeclarationName::CXXOperatorName: 1054 Data = Name.getCXXOverloadedOperator(); 1055 break; 1056 case DeclarationName::CXXLiteralOperatorName: 1057 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1058 break; 1059 case DeclarationName::CXXDeductionGuideName: 1060 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1061 ->getDeclName().getAsIdentifierInfo(); 1062 break; 1063 case DeclarationName::CXXConstructorName: 1064 case DeclarationName::CXXDestructorName: 1065 case DeclarationName::CXXConversionFunctionName: 1066 case DeclarationName::CXXUsingDirective: 1067 Data = 0; 1068 break; 1069 } 1070 } 1071 1072 unsigned DeclarationNameKey::getHash() const { 1073 llvm::FoldingSetNodeID ID; 1074 ID.AddInteger(Kind); 1075 1076 switch (Kind) { 1077 case DeclarationName::Identifier: 1078 case DeclarationName::CXXLiteralOperatorName: 1079 case DeclarationName::CXXDeductionGuideName: 1080 ID.AddString(((IdentifierInfo*)Data)->getName()); 1081 break; 1082 case DeclarationName::ObjCZeroArgSelector: 1083 case DeclarationName::ObjCOneArgSelector: 1084 case DeclarationName::ObjCMultiArgSelector: 1085 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1086 break; 1087 case DeclarationName::CXXOperatorName: 1088 ID.AddInteger((OverloadedOperatorKind)Data); 1089 break; 1090 case DeclarationName::CXXConstructorName: 1091 case DeclarationName::CXXDestructorName: 1092 case DeclarationName::CXXConversionFunctionName: 1093 case DeclarationName::CXXUsingDirective: 1094 break; 1095 } 1096 1097 return ID.ComputeHash(); 1098 } 1099 1100 ModuleFile * 1101 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1102 using namespace llvm::support; 1103 1104 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1105 return Reader.getLocalModuleFile(F, ModuleFileID); 1106 } 1107 1108 std::pair<unsigned, unsigned> 1109 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1110 return readULEBKeyDataLength(d); 1111 } 1112 1113 ASTDeclContextNameLookupTrait::internal_key_type 1114 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1115 using namespace llvm::support; 1116 1117 auto Kind = (DeclarationName::NameKind)*d++; 1118 uint64_t Data; 1119 switch (Kind) { 1120 case DeclarationName::Identifier: 1121 case DeclarationName::CXXLiteralOperatorName: 1122 case DeclarationName::CXXDeductionGuideName: 1123 Data = (uint64_t)Reader.getLocalIdentifier( 1124 F, endian::readNext<uint32_t, little, unaligned>(d)); 1125 break; 1126 case DeclarationName::ObjCZeroArgSelector: 1127 case DeclarationName::ObjCOneArgSelector: 1128 case DeclarationName::ObjCMultiArgSelector: 1129 Data = 1130 (uint64_t)Reader.getLocalSelector( 1131 F, endian::readNext<uint32_t, little, unaligned>( 1132 d)).getAsOpaquePtr(); 1133 break; 1134 case DeclarationName::CXXOperatorName: 1135 Data = *d++; // OverloadedOperatorKind 1136 break; 1137 case DeclarationName::CXXConstructorName: 1138 case DeclarationName::CXXDestructorName: 1139 case DeclarationName::CXXConversionFunctionName: 1140 case DeclarationName::CXXUsingDirective: 1141 Data = 0; 1142 break; 1143 } 1144 1145 return DeclarationNameKey(Kind, Data); 1146 } 1147 1148 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1149 const unsigned char *d, 1150 unsigned DataLen, 1151 data_type_builder &Val) { 1152 using namespace llvm::support; 1153 1154 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1155 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1156 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1157 } 1158 } 1159 1160 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1161 BitstreamCursor &Cursor, 1162 uint64_t Offset, 1163 DeclContext *DC) { 1164 assert(Offset != 0); 1165 1166 SavedStreamPosition SavedPosition(Cursor); 1167 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1168 Error(std::move(Err)); 1169 return true; 1170 } 1171 1172 RecordData Record; 1173 StringRef Blob; 1174 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1175 if (!MaybeCode) { 1176 Error(MaybeCode.takeError()); 1177 return true; 1178 } 1179 unsigned Code = MaybeCode.get(); 1180 1181 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1182 if (!MaybeRecCode) { 1183 Error(MaybeRecCode.takeError()); 1184 return true; 1185 } 1186 unsigned RecCode = MaybeRecCode.get(); 1187 if (RecCode != DECL_CONTEXT_LEXICAL) { 1188 Error("Expected lexical block"); 1189 return true; 1190 } 1191 1192 assert(!isa<TranslationUnitDecl>(DC) && 1193 "expected a TU_UPDATE_LEXICAL record for TU"); 1194 // If we are handling a C++ class template instantiation, we can see multiple 1195 // lexical updates for the same record. It's important that we select only one 1196 // of them, so that field numbering works properly. Just pick the first one we 1197 // see. 1198 auto &Lex = LexicalDecls[DC]; 1199 if (!Lex.first) { 1200 Lex = std::make_pair( 1201 &M, llvm::makeArrayRef( 1202 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1203 Blob.data()), 1204 Blob.size() / 4)); 1205 } 1206 DC->setHasExternalLexicalStorage(true); 1207 return false; 1208 } 1209 1210 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1211 BitstreamCursor &Cursor, 1212 uint64_t Offset, 1213 DeclID ID) { 1214 assert(Offset != 0); 1215 1216 SavedStreamPosition SavedPosition(Cursor); 1217 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1218 Error(std::move(Err)); 1219 return true; 1220 } 1221 1222 RecordData Record; 1223 StringRef Blob; 1224 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1225 if (!MaybeCode) { 1226 Error(MaybeCode.takeError()); 1227 return true; 1228 } 1229 unsigned Code = MaybeCode.get(); 1230 1231 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1232 if (!MaybeRecCode) { 1233 Error(MaybeRecCode.takeError()); 1234 return true; 1235 } 1236 unsigned RecCode = MaybeRecCode.get(); 1237 if (RecCode != DECL_CONTEXT_VISIBLE) { 1238 Error("Expected visible lookup table block"); 1239 return true; 1240 } 1241 1242 // We can't safely determine the primary context yet, so delay attaching the 1243 // lookup table until we're done with recursive deserialization. 1244 auto *Data = (const unsigned char*)Blob.data(); 1245 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1246 return false; 1247 } 1248 1249 void ASTReader::Error(StringRef Msg) const { 1250 Error(diag::err_fe_pch_malformed, Msg); 1251 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1252 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1253 Diag(diag::note_module_cache_path) 1254 << PP.getHeaderSearchInfo().getModuleCachePath(); 1255 } 1256 } 1257 1258 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1259 StringRef Arg3) const { 1260 if (Diags.isDiagnosticInFlight()) 1261 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3); 1262 else 1263 Diag(DiagID) << Arg1 << Arg2 << Arg3; 1264 } 1265 1266 void ASTReader::Error(llvm::Error &&Err) const { 1267 llvm::Error RemainingErr = 1268 handleErrors(std::move(Err), [this](const DiagnosticError &E) { 1269 auto Diag = E.getDiagnostic().second; 1270 1271 // Ideally we'd just emit it, but have to handle a possible in-flight 1272 // diagnostic. Note that the location is currently ignored as well. 1273 auto NumArgs = Diag.getStorage()->NumDiagArgs; 1274 assert(NumArgs <= 3 && "Can only have up to 3 arguments"); 1275 StringRef Arg1, Arg2, Arg3; 1276 switch (NumArgs) { 1277 case 3: 1278 Arg3 = Diag.getStringArg(2); 1279 LLVM_FALLTHROUGH; 1280 case 2: 1281 Arg2 = Diag.getStringArg(1); 1282 LLVM_FALLTHROUGH; 1283 case 1: 1284 Arg1 = Diag.getStringArg(0); 1285 } 1286 Error(Diag.getDiagID(), Arg1, Arg2, Arg3); 1287 }); 1288 if (RemainingErr) 1289 Error(toString(std::move(RemainingErr))); 1290 } 1291 1292 //===----------------------------------------------------------------------===// 1293 // Source Manager Deserialization 1294 //===----------------------------------------------------------------------===// 1295 1296 /// Read the line table in the source manager block. 1297 void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) { 1298 unsigned Idx = 0; 1299 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1300 1301 // Parse the file names 1302 std::map<int, int> FileIDs; 1303 FileIDs[-1] = -1; // For unspecified filenames. 1304 for (unsigned I = 0; Record[Idx]; ++I) { 1305 // Extract the file name 1306 auto Filename = ReadPath(F, Record, Idx); 1307 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1308 } 1309 ++Idx; 1310 1311 // Parse the line entries 1312 std::vector<LineEntry> Entries; 1313 while (Idx < Record.size()) { 1314 int FID = Record[Idx++]; 1315 assert(FID >= 0 && "Serialized line entries for non-local file."); 1316 // Remap FileID from 1-based old view. 1317 FID += F.SLocEntryBaseID - 1; 1318 1319 // Extract the line entries 1320 unsigned NumEntries = Record[Idx++]; 1321 assert(NumEntries && "no line entries for file ID"); 1322 Entries.clear(); 1323 Entries.reserve(NumEntries); 1324 for (unsigned I = 0; I != NumEntries; ++I) { 1325 unsigned FileOffset = Record[Idx++]; 1326 unsigned LineNo = Record[Idx++]; 1327 int FilenameID = FileIDs[Record[Idx++]]; 1328 SrcMgr::CharacteristicKind FileKind 1329 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1330 unsigned IncludeOffset = Record[Idx++]; 1331 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1332 FileKind, IncludeOffset)); 1333 } 1334 LineTable.AddEntry(FileID::get(FID), Entries); 1335 } 1336 } 1337 1338 /// Read a source manager block 1339 llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1340 using namespace SrcMgr; 1341 1342 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1343 1344 // Set the source-location entry cursor to the current position in 1345 // the stream. This cursor will be used to read the contents of the 1346 // source manager block initially, and then lazily read 1347 // source-location entries as needed. 1348 SLocEntryCursor = F.Stream; 1349 1350 // The stream itself is going to skip over the source manager block. 1351 if (llvm::Error Err = F.Stream.SkipBlock()) 1352 return Err; 1353 1354 // Enter the source manager block. 1355 if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) 1356 return Err; 1357 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo(); 1358 1359 RecordData Record; 1360 while (true) { 1361 Expected<llvm::BitstreamEntry> MaybeE = 1362 SLocEntryCursor.advanceSkippingSubblocks(); 1363 if (!MaybeE) 1364 return MaybeE.takeError(); 1365 llvm::BitstreamEntry E = MaybeE.get(); 1366 1367 switch (E.Kind) { 1368 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1369 case llvm::BitstreamEntry::Error: 1370 return llvm::createStringError(std::errc::illegal_byte_sequence, 1371 "malformed block record in AST file"); 1372 case llvm::BitstreamEntry::EndBlock: 1373 return llvm::Error::success(); 1374 case llvm::BitstreamEntry::Record: 1375 // The interesting case. 1376 break; 1377 } 1378 1379 // Read a record. 1380 Record.clear(); 1381 StringRef Blob; 1382 Expected<unsigned> MaybeRecord = 1383 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1384 if (!MaybeRecord) 1385 return MaybeRecord.takeError(); 1386 switch (MaybeRecord.get()) { 1387 default: // Default behavior: ignore. 1388 break; 1389 1390 case SM_SLOC_FILE_ENTRY: 1391 case SM_SLOC_BUFFER_ENTRY: 1392 case SM_SLOC_EXPANSION_ENTRY: 1393 // Once we hit one of the source location entries, we're done. 1394 return llvm::Error::success(); 1395 } 1396 } 1397 } 1398 1399 /// If a header file is not found at the path that we expect it to be 1400 /// and the PCH file was moved from its original location, try to resolve the 1401 /// file by assuming that header+PCH were moved together and the header is in 1402 /// the same place relative to the PCH. 1403 static std::string 1404 resolveFileRelativeToOriginalDir(const std::string &Filename, 1405 const std::string &OriginalDir, 1406 const std::string &CurrDir) { 1407 assert(OriginalDir != CurrDir && 1408 "No point trying to resolve the file if the PCH dir didn't change"); 1409 1410 using namespace llvm::sys; 1411 1412 SmallString<128> filePath(Filename); 1413 fs::make_absolute(filePath); 1414 assert(path::is_absolute(OriginalDir)); 1415 SmallString<128> currPCHPath(CurrDir); 1416 1417 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1418 fileDirE = path::end(path::parent_path(filePath)); 1419 path::const_iterator origDirI = path::begin(OriginalDir), 1420 origDirE = path::end(OriginalDir); 1421 // Skip the common path components from filePath and OriginalDir. 1422 while (fileDirI != fileDirE && origDirI != origDirE && 1423 *fileDirI == *origDirI) { 1424 ++fileDirI; 1425 ++origDirI; 1426 } 1427 for (; origDirI != origDirE; ++origDirI) 1428 path::append(currPCHPath, ".."); 1429 path::append(currPCHPath, fileDirI, fileDirE); 1430 path::append(currPCHPath, path::filename(Filename)); 1431 return std::string(currPCHPath.str()); 1432 } 1433 1434 bool ASTReader::ReadSLocEntry(int ID) { 1435 if (ID == 0) 1436 return false; 1437 1438 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1439 Error("source location entry ID out-of-range for AST file"); 1440 return true; 1441 } 1442 1443 // Local helper to read the (possibly-compressed) buffer data following the 1444 // entry record. 1445 auto ReadBuffer = [this]( 1446 BitstreamCursor &SLocEntryCursor, 1447 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1448 RecordData Record; 1449 StringRef Blob; 1450 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1451 if (!MaybeCode) { 1452 Error(MaybeCode.takeError()); 1453 return nullptr; 1454 } 1455 unsigned Code = MaybeCode.get(); 1456 1457 Expected<unsigned> MaybeRecCode = 1458 SLocEntryCursor.readRecord(Code, Record, &Blob); 1459 if (!MaybeRecCode) { 1460 Error(MaybeRecCode.takeError()); 1461 return nullptr; 1462 } 1463 unsigned RecCode = MaybeRecCode.get(); 1464 1465 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1466 if (!llvm::zlib::isAvailable()) { 1467 Error("zlib is not available"); 1468 return nullptr; 1469 } 1470 SmallString<0> Uncompressed; 1471 if (llvm::Error E = 1472 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1473 Error("could not decompress embedded file contents: " + 1474 llvm::toString(std::move(E))); 1475 return nullptr; 1476 } 1477 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1478 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1479 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1480 } else { 1481 Error("AST record has invalid code"); 1482 return nullptr; 1483 } 1484 }; 1485 1486 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1487 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1488 F->SLocEntryOffsetsBase + 1489 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1490 Error(std::move(Err)); 1491 return true; 1492 } 1493 1494 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1495 SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset; 1496 1497 ++NumSLocEntriesRead; 1498 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1499 if (!MaybeEntry) { 1500 Error(MaybeEntry.takeError()); 1501 return true; 1502 } 1503 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1504 1505 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1506 Error("incorrectly-formatted source location entry in AST file"); 1507 return true; 1508 } 1509 1510 RecordData Record; 1511 StringRef Blob; 1512 Expected<unsigned> MaybeSLOC = 1513 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1514 if (!MaybeSLOC) { 1515 Error(MaybeSLOC.takeError()); 1516 return true; 1517 } 1518 switch (MaybeSLOC.get()) { 1519 default: 1520 Error("incorrectly-formatted source location entry in AST file"); 1521 return true; 1522 1523 case SM_SLOC_FILE_ENTRY: { 1524 // We will detect whether a file changed and return 'Failure' for it, but 1525 // we will also try to fail gracefully by setting up the SLocEntry. 1526 unsigned InputID = Record[4]; 1527 InputFile IF = getInputFile(*F, InputID); 1528 Optional<FileEntryRef> File = IF.getFile(); 1529 bool OverriddenBuffer = IF.isOverridden(); 1530 1531 // Note that we only check if a File was returned. If it was out-of-date 1532 // we have complained but we will continue creating a FileID to recover 1533 // gracefully. 1534 if (!File) 1535 return true; 1536 1537 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1538 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1539 // This is the module's main file. 1540 IncludeLoc = getImportLocation(F); 1541 } 1542 SrcMgr::CharacteristicKind 1543 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1544 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID, 1545 BaseOffset + Record[0]); 1546 SrcMgr::FileInfo &FileInfo = 1547 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1548 FileInfo.NumCreatedFIDs = Record[5]; 1549 if (Record[3]) 1550 FileInfo.setHasLineDirectives(); 1551 1552 unsigned NumFileDecls = Record[7]; 1553 if (NumFileDecls && ContextObj) { 1554 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1555 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1556 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1557 NumFileDecls)); 1558 } 1559 1560 const SrcMgr::ContentCache &ContentCache = 1561 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter)); 1562 if (OverriddenBuffer && !ContentCache.BufferOverridden && 1563 ContentCache.ContentsEntry == ContentCache.OrigEntry && 1564 !ContentCache.getBufferIfLoaded()) { 1565 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1566 if (!Buffer) 1567 return true; 1568 SourceMgr.overrideFileContents(*File, std::move(Buffer)); 1569 } 1570 1571 break; 1572 } 1573 1574 case SM_SLOC_BUFFER_ENTRY: { 1575 const char *Name = Blob.data(); 1576 unsigned Offset = Record[0]; 1577 SrcMgr::CharacteristicKind 1578 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1579 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1580 if (IncludeLoc.isInvalid() && F->isModule()) { 1581 IncludeLoc = getImportLocation(F); 1582 } 1583 1584 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1585 if (!Buffer) 1586 return true; 1587 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1588 BaseOffset + Offset, IncludeLoc); 1589 break; 1590 } 1591 1592 case SM_SLOC_EXPANSION_ENTRY: { 1593 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1594 SourceMgr.createExpansionLoc(SpellingLoc, 1595 ReadSourceLocation(*F, Record[2]), 1596 ReadSourceLocation(*F, Record[3]), 1597 Record[5], 1598 Record[4], 1599 ID, 1600 BaseOffset + Record[0]); 1601 break; 1602 } 1603 } 1604 1605 return false; 1606 } 1607 1608 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1609 if (ID == 0) 1610 return std::make_pair(SourceLocation(), ""); 1611 1612 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1613 Error("source location entry ID out-of-range for AST file"); 1614 return std::make_pair(SourceLocation(), ""); 1615 } 1616 1617 // Find which module file this entry lands in. 1618 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1619 if (!M->isModule()) 1620 return std::make_pair(SourceLocation(), ""); 1621 1622 // FIXME: Can we map this down to a particular submodule? That would be 1623 // ideal. 1624 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1625 } 1626 1627 /// Find the location where the module F is imported. 1628 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1629 if (F->ImportLoc.isValid()) 1630 return F->ImportLoc; 1631 1632 // Otherwise we have a PCH. It's considered to be "imported" at the first 1633 // location of its includer. 1634 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1635 // Main file is the importer. 1636 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1637 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1638 } 1639 return F->ImportedBy[0]->FirstLoc; 1640 } 1641 1642 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1643 /// the abbreviations that are at the top of the block and then leave the cursor 1644 /// pointing into the block. 1645 llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, 1646 unsigned BlockID, 1647 uint64_t *StartOfBlockOffset) { 1648 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) 1649 return Err; 1650 1651 if (StartOfBlockOffset) 1652 *StartOfBlockOffset = Cursor.GetCurrentBitNo(); 1653 1654 while (true) { 1655 uint64_t Offset = Cursor.GetCurrentBitNo(); 1656 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1657 if (!MaybeCode) 1658 return MaybeCode.takeError(); 1659 unsigned Code = MaybeCode.get(); 1660 1661 // We expect all abbrevs to be at the start of the block. 1662 if (Code != llvm::bitc::DEFINE_ABBREV) { 1663 if (llvm::Error Err = Cursor.JumpToBit(Offset)) 1664 return Err; 1665 return llvm::Error::success(); 1666 } 1667 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) 1668 return Err; 1669 } 1670 } 1671 1672 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1673 unsigned &Idx) { 1674 Token Tok; 1675 Tok.startToken(); 1676 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1677 Tok.setLength(Record[Idx++]); 1678 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1679 Tok.setIdentifierInfo(II); 1680 Tok.setKind((tok::TokenKind)Record[Idx++]); 1681 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1682 return Tok; 1683 } 1684 1685 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1686 BitstreamCursor &Stream = F.MacroCursor; 1687 1688 // Keep track of where we are in the stream, then jump back there 1689 // after reading this macro. 1690 SavedStreamPosition SavedPosition(Stream); 1691 1692 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1693 // FIXME this drops errors on the floor. 1694 consumeError(std::move(Err)); 1695 return nullptr; 1696 } 1697 RecordData Record; 1698 SmallVector<IdentifierInfo*, 16> MacroParams; 1699 MacroInfo *Macro = nullptr; 1700 1701 while (true) { 1702 // Advance to the next record, but if we get to the end of the block, don't 1703 // pop it (removing all the abbreviations from the cursor) since we want to 1704 // be able to reseek within the block and read entries. 1705 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1706 Expected<llvm::BitstreamEntry> MaybeEntry = 1707 Stream.advanceSkippingSubblocks(Flags); 1708 if (!MaybeEntry) { 1709 Error(MaybeEntry.takeError()); 1710 return Macro; 1711 } 1712 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1713 1714 switch (Entry.Kind) { 1715 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1716 case llvm::BitstreamEntry::Error: 1717 Error("malformed block record in AST file"); 1718 return Macro; 1719 case llvm::BitstreamEntry::EndBlock: 1720 return Macro; 1721 case llvm::BitstreamEntry::Record: 1722 // The interesting case. 1723 break; 1724 } 1725 1726 // Read a record. 1727 Record.clear(); 1728 PreprocessorRecordTypes RecType; 1729 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1730 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1731 else { 1732 Error(MaybeRecType.takeError()); 1733 return Macro; 1734 } 1735 switch (RecType) { 1736 case PP_MODULE_MACRO: 1737 case PP_MACRO_DIRECTIVE_HISTORY: 1738 return Macro; 1739 1740 case PP_MACRO_OBJECT_LIKE: 1741 case PP_MACRO_FUNCTION_LIKE: { 1742 // If we already have a macro, that means that we've hit the end 1743 // of the definition of the macro we were looking for. We're 1744 // done. 1745 if (Macro) 1746 return Macro; 1747 1748 unsigned NextIndex = 1; // Skip identifier ID. 1749 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1750 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1751 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1752 MI->setIsUsed(Record[NextIndex++]); 1753 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1754 1755 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1756 // Decode function-like macro info. 1757 bool isC99VarArgs = Record[NextIndex++]; 1758 bool isGNUVarArgs = Record[NextIndex++]; 1759 bool hasCommaPasting = Record[NextIndex++]; 1760 MacroParams.clear(); 1761 unsigned NumArgs = Record[NextIndex++]; 1762 for (unsigned i = 0; i != NumArgs; ++i) 1763 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1764 1765 // Install function-like macro info. 1766 MI->setIsFunctionLike(); 1767 if (isC99VarArgs) MI->setIsC99Varargs(); 1768 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1769 if (hasCommaPasting) MI->setHasCommaPasting(); 1770 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1771 } 1772 1773 // Remember that we saw this macro last so that we add the tokens that 1774 // form its body to it. 1775 Macro = MI; 1776 1777 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1778 Record[NextIndex]) { 1779 // We have a macro definition. Register the association 1780 PreprocessedEntityID 1781 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1782 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1783 PreprocessingRecord::PPEntityID PPID = 1784 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1785 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1786 PPRec.getPreprocessedEntity(PPID)); 1787 if (PPDef) 1788 PPRec.RegisterMacroDefinition(Macro, PPDef); 1789 } 1790 1791 ++NumMacrosRead; 1792 break; 1793 } 1794 1795 case PP_TOKEN: { 1796 // If we see a TOKEN before a PP_MACRO_*, then the file is 1797 // erroneous, just pretend we didn't see this. 1798 if (!Macro) break; 1799 1800 unsigned Idx = 0; 1801 Token Tok = ReadToken(F, Record, Idx); 1802 Macro->AddTokenToBody(Tok); 1803 break; 1804 } 1805 } 1806 } 1807 } 1808 1809 PreprocessedEntityID 1810 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1811 unsigned LocalID) const { 1812 if (!M.ModuleOffsetMap.empty()) 1813 ReadModuleOffsetMap(M); 1814 1815 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1816 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1817 assert(I != M.PreprocessedEntityRemap.end() 1818 && "Invalid index into preprocessed entity index remap"); 1819 1820 return LocalID + I->second; 1821 } 1822 1823 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1824 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1825 } 1826 1827 HeaderFileInfoTrait::internal_key_type 1828 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1829 internal_key_type ikey = {FE->getSize(), 1830 M.HasTimestamps ? FE->getModificationTime() : 0, 1831 FE->getName(), /*Imported*/ false}; 1832 return ikey; 1833 } 1834 1835 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1836 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1837 return false; 1838 1839 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1840 return true; 1841 1842 // Determine whether the actual files are equivalent. 1843 FileManager &FileMgr = Reader.getFileManager(); 1844 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1845 if (!Key.Imported) { 1846 if (auto File = FileMgr.getFile(Key.Filename)) 1847 return *File; 1848 return nullptr; 1849 } 1850 1851 std::string Resolved = std::string(Key.Filename); 1852 Reader.ResolveImportedPath(M, Resolved); 1853 if (auto File = FileMgr.getFile(Resolved)) 1854 return *File; 1855 return nullptr; 1856 }; 1857 1858 const FileEntry *FEA = GetFile(a); 1859 const FileEntry *FEB = GetFile(b); 1860 return FEA && FEA == FEB; 1861 } 1862 1863 std::pair<unsigned, unsigned> 1864 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1865 return readULEBKeyDataLength(d); 1866 } 1867 1868 HeaderFileInfoTrait::internal_key_type 1869 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1870 using namespace llvm::support; 1871 1872 internal_key_type ikey; 1873 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1874 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1875 ikey.Filename = (const char *)d; 1876 ikey.Imported = true; 1877 return ikey; 1878 } 1879 1880 HeaderFileInfoTrait::data_type 1881 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1882 unsigned DataLen) { 1883 using namespace llvm::support; 1884 1885 const unsigned char *End = d + DataLen; 1886 HeaderFileInfo HFI; 1887 unsigned Flags = *d++; 1888 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1889 HFI.isImport |= (Flags >> 5) & 0x01; 1890 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1891 HFI.DirInfo = (Flags >> 1) & 0x07; 1892 HFI.IndexHeaderMapHeader = Flags & 0x01; 1893 // FIXME: Find a better way to handle this. Maybe just store a 1894 // "has been included" flag? 1895 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1896 HFI.NumIncludes); 1897 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1898 M, endian::readNext<uint32_t, little, unaligned>(d)); 1899 if (unsigned FrameworkOffset = 1900 endian::readNext<uint32_t, little, unaligned>(d)) { 1901 // The framework offset is 1 greater than the actual offset, 1902 // since 0 is used as an indicator for "no framework name". 1903 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1904 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1905 } 1906 1907 assert((End - d) % 4 == 0 && 1908 "Wrong data length in HeaderFileInfo deserialization"); 1909 while (d != End) { 1910 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1911 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1912 LocalSMID >>= 2; 1913 1914 // This header is part of a module. Associate it with the module to enable 1915 // implicit module import. 1916 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1917 Module *Mod = Reader.getSubmodule(GlobalSMID); 1918 FileManager &FileMgr = Reader.getFileManager(); 1919 ModuleMap &ModMap = 1920 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1921 1922 std::string Filename = std::string(key.Filename); 1923 if (key.Imported) 1924 Reader.ResolveImportedPath(M, Filename); 1925 // FIXME: NameAsWritten 1926 Module::Header H = {std::string(key.Filename), "", 1927 *FileMgr.getFile(Filename)}; 1928 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1929 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1930 } 1931 1932 // This HeaderFileInfo was externally loaded. 1933 HFI.External = true; 1934 HFI.IsValid = true; 1935 return HFI; 1936 } 1937 1938 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1939 uint32_t MacroDirectivesOffset) { 1940 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1941 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1942 } 1943 1944 void ASTReader::ReadDefinedMacros() { 1945 // Note that we are loading defined macros. 1946 Deserializing Macros(this); 1947 1948 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1949 BitstreamCursor &MacroCursor = I.MacroCursor; 1950 1951 // If there was no preprocessor block, skip this file. 1952 if (MacroCursor.getBitcodeBytes().empty()) 1953 continue; 1954 1955 BitstreamCursor Cursor = MacroCursor; 1956 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1957 Error(std::move(Err)); 1958 return; 1959 } 1960 1961 RecordData Record; 1962 while (true) { 1963 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1964 if (!MaybeE) { 1965 Error(MaybeE.takeError()); 1966 return; 1967 } 1968 llvm::BitstreamEntry E = MaybeE.get(); 1969 1970 switch (E.Kind) { 1971 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1972 case llvm::BitstreamEntry::Error: 1973 Error("malformed block record in AST file"); 1974 return; 1975 case llvm::BitstreamEntry::EndBlock: 1976 goto NextCursor; 1977 1978 case llvm::BitstreamEntry::Record: { 1979 Record.clear(); 1980 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1981 if (!MaybeRecord) { 1982 Error(MaybeRecord.takeError()); 1983 return; 1984 } 1985 switch (MaybeRecord.get()) { 1986 default: // Default behavior: ignore. 1987 break; 1988 1989 case PP_MACRO_OBJECT_LIKE: 1990 case PP_MACRO_FUNCTION_LIKE: { 1991 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1992 if (II->isOutOfDate()) 1993 updateOutOfDateIdentifier(*II); 1994 break; 1995 } 1996 1997 case PP_TOKEN: 1998 // Ignore tokens. 1999 break; 2000 } 2001 break; 2002 } 2003 } 2004 } 2005 NextCursor: ; 2006 } 2007 } 2008 2009 namespace { 2010 2011 /// Visitor class used to look up identifirs in an AST file. 2012 class IdentifierLookupVisitor { 2013 StringRef Name; 2014 unsigned NameHash; 2015 unsigned PriorGeneration; 2016 unsigned &NumIdentifierLookups; 2017 unsigned &NumIdentifierLookupHits; 2018 IdentifierInfo *Found = nullptr; 2019 2020 public: 2021 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2022 unsigned &NumIdentifierLookups, 2023 unsigned &NumIdentifierLookupHits) 2024 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2025 PriorGeneration(PriorGeneration), 2026 NumIdentifierLookups(NumIdentifierLookups), 2027 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2028 2029 bool operator()(ModuleFile &M) { 2030 // If we've already searched this module file, skip it now. 2031 if (M.Generation <= PriorGeneration) 2032 return true; 2033 2034 ASTIdentifierLookupTable *IdTable 2035 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2036 if (!IdTable) 2037 return false; 2038 2039 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2040 Found); 2041 ++NumIdentifierLookups; 2042 ASTIdentifierLookupTable::iterator Pos = 2043 IdTable->find_hashed(Name, NameHash, &Trait); 2044 if (Pos == IdTable->end()) 2045 return false; 2046 2047 // Dereferencing the iterator has the effect of building the 2048 // IdentifierInfo node and populating it with the various 2049 // declarations it needs. 2050 ++NumIdentifierLookupHits; 2051 Found = *Pos; 2052 return true; 2053 } 2054 2055 // Retrieve the identifier info found within the module 2056 // files. 2057 IdentifierInfo *getIdentifierInfo() const { return Found; } 2058 }; 2059 2060 } // namespace 2061 2062 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2063 // Note that we are loading an identifier. 2064 Deserializing AnIdentifier(this); 2065 2066 unsigned PriorGeneration = 0; 2067 if (getContext().getLangOpts().Modules) 2068 PriorGeneration = IdentifierGeneration[&II]; 2069 2070 // If there is a global index, look there first to determine which modules 2071 // provably do not have any results for this identifier. 2072 GlobalModuleIndex::HitSet Hits; 2073 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2074 if (!loadGlobalIndex()) { 2075 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2076 HitsPtr = &Hits; 2077 } 2078 } 2079 2080 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2081 NumIdentifierLookups, 2082 NumIdentifierLookupHits); 2083 ModuleMgr.visit(Visitor, HitsPtr); 2084 markIdentifierUpToDate(&II); 2085 } 2086 2087 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2088 if (!II) 2089 return; 2090 2091 II->setOutOfDate(false); 2092 2093 // Update the generation for this identifier. 2094 if (getContext().getLangOpts().Modules) 2095 IdentifierGeneration[II] = getGeneration(); 2096 } 2097 2098 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2099 const PendingMacroInfo &PMInfo) { 2100 ModuleFile &M = *PMInfo.M; 2101 2102 BitstreamCursor &Cursor = M.MacroCursor; 2103 SavedStreamPosition SavedPosition(Cursor); 2104 if (llvm::Error Err = 2105 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2106 Error(std::move(Err)); 2107 return; 2108 } 2109 2110 struct ModuleMacroRecord { 2111 SubmoduleID SubModID; 2112 MacroInfo *MI; 2113 SmallVector<SubmoduleID, 8> Overrides; 2114 }; 2115 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2116 2117 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2118 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2119 // macro histroy. 2120 RecordData Record; 2121 while (true) { 2122 Expected<llvm::BitstreamEntry> MaybeEntry = 2123 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2124 if (!MaybeEntry) { 2125 Error(MaybeEntry.takeError()); 2126 return; 2127 } 2128 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2129 2130 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2131 Error("malformed block record in AST file"); 2132 return; 2133 } 2134 2135 Record.clear(); 2136 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2137 if (!MaybePP) { 2138 Error(MaybePP.takeError()); 2139 return; 2140 } 2141 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2142 case PP_MACRO_DIRECTIVE_HISTORY: 2143 break; 2144 2145 case PP_MODULE_MACRO: { 2146 ModuleMacros.push_back(ModuleMacroRecord()); 2147 auto &Info = ModuleMacros.back(); 2148 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2149 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2150 for (int I = 2, N = Record.size(); I != N; ++I) 2151 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2152 continue; 2153 } 2154 2155 default: 2156 Error("malformed block record in AST file"); 2157 return; 2158 } 2159 2160 // We found the macro directive history; that's the last record 2161 // for this macro. 2162 break; 2163 } 2164 2165 // Module macros are listed in reverse dependency order. 2166 { 2167 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2168 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2169 for (auto &MMR : ModuleMacros) { 2170 Overrides.clear(); 2171 for (unsigned ModID : MMR.Overrides) { 2172 Module *Mod = getSubmodule(ModID); 2173 auto *Macro = PP.getModuleMacro(Mod, II); 2174 assert(Macro && "missing definition for overridden macro"); 2175 Overrides.push_back(Macro); 2176 } 2177 2178 bool Inserted = false; 2179 Module *Owner = getSubmodule(MMR.SubModID); 2180 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2181 } 2182 } 2183 2184 // Don't read the directive history for a module; we don't have anywhere 2185 // to put it. 2186 if (M.isModule()) 2187 return; 2188 2189 // Deserialize the macro directives history in reverse source-order. 2190 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2191 unsigned Idx = 0, N = Record.size(); 2192 while (Idx < N) { 2193 MacroDirective *MD = nullptr; 2194 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2195 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2196 switch (K) { 2197 case MacroDirective::MD_Define: { 2198 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2199 MD = PP.AllocateDefMacroDirective(MI, Loc); 2200 break; 2201 } 2202 case MacroDirective::MD_Undefine: 2203 MD = PP.AllocateUndefMacroDirective(Loc); 2204 break; 2205 case MacroDirective::MD_Visibility: 2206 bool isPublic = Record[Idx++]; 2207 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2208 break; 2209 } 2210 2211 if (!Latest) 2212 Latest = MD; 2213 if (Earliest) 2214 Earliest->setPrevious(MD); 2215 Earliest = MD; 2216 } 2217 2218 if (Latest) 2219 PP.setLoadedMacroDirective(II, Earliest, Latest); 2220 } 2221 2222 bool ASTReader::shouldDisableValidationForFile( 2223 const serialization::ModuleFile &M) const { 2224 if (DisableValidationKind == DisableValidationForModuleKind::None) 2225 return false; 2226 2227 // If a PCH is loaded and validation is disabled for PCH then disable 2228 // validation for the PCH and the modules it loads. 2229 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind); 2230 2231 switch (K) { 2232 case MK_MainFile: 2233 case MK_Preamble: 2234 case MK_PCH: 2235 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH); 2236 case MK_ImplicitModule: 2237 case MK_ExplicitModule: 2238 case MK_PrebuiltModule: 2239 return bool(DisableValidationKind & DisableValidationForModuleKind::Module); 2240 } 2241 2242 return false; 2243 } 2244 2245 ASTReader::InputFileInfo 2246 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2247 // Go find this input file. 2248 BitstreamCursor &Cursor = F.InputFilesCursor; 2249 SavedStreamPosition SavedPosition(Cursor); 2250 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2251 // FIXME this drops errors on the floor. 2252 consumeError(std::move(Err)); 2253 } 2254 2255 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2256 if (!MaybeCode) { 2257 // FIXME this drops errors on the floor. 2258 consumeError(MaybeCode.takeError()); 2259 } 2260 unsigned Code = MaybeCode.get(); 2261 RecordData Record; 2262 StringRef Blob; 2263 2264 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2265 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2266 "invalid record type for input file"); 2267 else { 2268 // FIXME this drops errors on the floor. 2269 consumeError(Maybe.takeError()); 2270 } 2271 2272 assert(Record[0] == ID && "Bogus stored ID or offset"); 2273 InputFileInfo R; 2274 R.StoredSize = static_cast<off_t>(Record[1]); 2275 R.StoredTime = static_cast<time_t>(Record[2]); 2276 R.Overridden = static_cast<bool>(Record[3]); 2277 R.Transient = static_cast<bool>(Record[4]); 2278 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2279 R.Filename = std::string(Blob); 2280 ResolveImportedPath(F, R.Filename); 2281 2282 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2283 if (!MaybeEntry) // FIXME this drops errors on the floor. 2284 consumeError(MaybeEntry.takeError()); 2285 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2286 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2287 "expected record type for input file hash"); 2288 2289 Record.clear(); 2290 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2291 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2292 "invalid record type for input file hash"); 2293 else { 2294 // FIXME this drops errors on the floor. 2295 consumeError(Maybe.takeError()); 2296 } 2297 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2298 static_cast<uint64_t>(Record[0]); 2299 return R; 2300 } 2301 2302 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2303 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2304 // If this ID is bogus, just return an empty input file. 2305 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2306 return InputFile(); 2307 2308 // If we've already loaded this input file, return it. 2309 if (F.InputFilesLoaded[ID-1].getFile()) 2310 return F.InputFilesLoaded[ID-1]; 2311 2312 if (F.InputFilesLoaded[ID-1].isNotFound()) 2313 return InputFile(); 2314 2315 // Go find this input file. 2316 BitstreamCursor &Cursor = F.InputFilesCursor; 2317 SavedStreamPosition SavedPosition(Cursor); 2318 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2319 // FIXME this drops errors on the floor. 2320 consumeError(std::move(Err)); 2321 } 2322 2323 InputFileInfo FI = readInputFileInfo(F, ID); 2324 off_t StoredSize = FI.StoredSize; 2325 time_t StoredTime = FI.StoredTime; 2326 bool Overridden = FI.Overridden; 2327 bool Transient = FI.Transient; 2328 StringRef Filename = FI.Filename; 2329 uint64_t StoredContentHash = FI.ContentHash; 2330 2331 OptionalFileEntryRefDegradesToFileEntryPtr File = 2332 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false)); 2333 2334 // If we didn't find the file, resolve it relative to the 2335 // original directory from which this AST file was created. 2336 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2337 F.OriginalDir != F.BaseDirectory) { 2338 std::string Resolved = resolveFileRelativeToOriginalDir( 2339 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2340 if (!Resolved.empty()) 2341 File = expectedToOptional(FileMgr.getFileRef(Resolved)); 2342 } 2343 2344 // For an overridden file, create a virtual file with the stored 2345 // size/timestamp. 2346 if ((Overridden || Transient) && !File) 2347 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime); 2348 2349 if (!File) { 2350 if (Complain) { 2351 std::string ErrorStr = "could not find file '"; 2352 ErrorStr += Filename; 2353 ErrorStr += "' referenced by AST file '"; 2354 ErrorStr += F.FileName; 2355 ErrorStr += "'"; 2356 Error(ErrorStr); 2357 } 2358 // Record that we didn't find the file. 2359 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2360 return InputFile(); 2361 } 2362 2363 // Check if there was a request to override the contents of the file 2364 // that was part of the precompiled header. Overriding such a file 2365 // can lead to problems when lexing using the source locations from the 2366 // PCH. 2367 SourceManager &SM = getSourceManager(); 2368 // FIXME: Reject if the overrides are different. 2369 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2370 if (Complain) 2371 Error(diag::err_fe_pch_file_overridden, Filename); 2372 2373 // After emitting the diagnostic, bypass the overriding file to recover 2374 // (this creates a separate FileEntry). 2375 File = SM.bypassFileContentsOverride(*File); 2376 if (!File) { 2377 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2378 return InputFile(); 2379 } 2380 } 2381 2382 struct Change { 2383 enum ModificationKind { 2384 Size, 2385 ModTime, 2386 Content, 2387 None, 2388 } Kind; 2389 llvm::Optional<int64_t> Old = llvm::None; 2390 llvm::Optional<int64_t> New = llvm::None; 2391 }; 2392 auto HasInputFileChanged = [&]() { 2393 if (StoredSize != File->getSize()) 2394 return Change{Change::Size, StoredSize, File->getSize()}; 2395 if (!shouldDisableValidationForFile(F) && StoredTime && 2396 StoredTime != File->getModificationTime()) { 2397 Change MTimeChange = {Change::ModTime, StoredTime, 2398 File->getModificationTime()}; 2399 2400 // In case the modification time changes but not the content, 2401 // accept the cached file as legit. 2402 if (ValidateASTInputFilesContent && 2403 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2404 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2405 if (!MemBuffOrError) { 2406 if (!Complain) 2407 return MTimeChange; 2408 std::string ErrorStr = "could not get buffer for file '"; 2409 ErrorStr += File->getName(); 2410 ErrorStr += "'"; 2411 Error(ErrorStr); 2412 return MTimeChange; 2413 } 2414 2415 // FIXME: hash_value is not guaranteed to be stable! 2416 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2417 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2418 return Change{Change::None}; 2419 2420 return Change{Change::Content}; 2421 } 2422 return MTimeChange; 2423 } 2424 return Change{Change::None}; 2425 }; 2426 2427 bool IsOutOfDate = false; 2428 auto FileChange = HasInputFileChanged(); 2429 // For an overridden file, there is nothing to validate. 2430 if (!Overridden && FileChange.Kind != Change::None) { 2431 if (Complain && !Diags.isDiagnosticInFlight()) { 2432 // Build a list of the PCH imports that got us here (in reverse). 2433 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2434 while (!ImportStack.back()->ImportedBy.empty()) 2435 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2436 2437 // The top-level PCH is stale. 2438 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2439 Diag(diag::err_fe_ast_file_modified) 2440 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind) 2441 << TopLevelPCHName << FileChange.Kind 2442 << (FileChange.Old && FileChange.New) 2443 << llvm::itostr(FileChange.Old.getValueOr(0)) 2444 << llvm::itostr(FileChange.New.getValueOr(0)); 2445 2446 // Print the import stack. 2447 if (ImportStack.size() > 1) { 2448 Diag(diag::note_pch_required_by) 2449 << Filename << ImportStack[0]->FileName; 2450 for (unsigned I = 1; I < ImportStack.size(); ++I) 2451 Diag(diag::note_pch_required_by) 2452 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2453 } 2454 2455 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2456 } 2457 2458 IsOutOfDate = true; 2459 } 2460 // FIXME: If the file is overridden and we've already opened it, 2461 // issue an error (or split it into a separate FileEntry). 2462 2463 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate); 2464 2465 // Note that we've loaded this input file. 2466 F.InputFilesLoaded[ID-1] = IF; 2467 return IF; 2468 } 2469 2470 /// If we are loading a relocatable PCH or module file, and the filename 2471 /// is not an absolute path, add the system or module root to the beginning of 2472 /// the file name. 2473 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2474 // Resolve relative to the base directory, if we have one. 2475 if (!M.BaseDirectory.empty()) 2476 return ResolveImportedPath(Filename, M.BaseDirectory); 2477 } 2478 2479 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2480 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2481 return; 2482 2483 SmallString<128> Buffer; 2484 llvm::sys::path::append(Buffer, Prefix, Filename); 2485 Filename.assign(Buffer.begin(), Buffer.end()); 2486 } 2487 2488 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2489 switch (ARR) { 2490 case ASTReader::Failure: return true; 2491 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2492 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2493 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2494 case ASTReader::ConfigurationMismatch: 2495 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2496 case ASTReader::HadErrors: return true; 2497 case ASTReader::Success: return false; 2498 } 2499 2500 llvm_unreachable("unknown ASTReadResult"); 2501 } 2502 2503 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2504 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2505 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2506 std::string &SuggestedPredefines) { 2507 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2508 // FIXME this drops errors on the floor. 2509 consumeError(std::move(Err)); 2510 return Failure; 2511 } 2512 2513 // Read all of the records in the options block. 2514 RecordData Record; 2515 ASTReadResult Result = Success; 2516 while (true) { 2517 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2518 if (!MaybeEntry) { 2519 // FIXME this drops errors on the floor. 2520 consumeError(MaybeEntry.takeError()); 2521 return Failure; 2522 } 2523 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2524 2525 switch (Entry.Kind) { 2526 case llvm::BitstreamEntry::Error: 2527 case llvm::BitstreamEntry::SubBlock: 2528 return Failure; 2529 2530 case llvm::BitstreamEntry::EndBlock: 2531 return Result; 2532 2533 case llvm::BitstreamEntry::Record: 2534 // The interesting case. 2535 break; 2536 } 2537 2538 // Read and process a record. 2539 Record.clear(); 2540 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2541 if (!MaybeRecordType) { 2542 // FIXME this drops errors on the floor. 2543 consumeError(MaybeRecordType.takeError()); 2544 return Failure; 2545 } 2546 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2547 case LANGUAGE_OPTIONS: { 2548 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2549 if (ParseLanguageOptions(Record, Complain, Listener, 2550 AllowCompatibleConfigurationMismatch)) 2551 Result = ConfigurationMismatch; 2552 break; 2553 } 2554 2555 case TARGET_OPTIONS: { 2556 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2557 if (ParseTargetOptions(Record, Complain, Listener, 2558 AllowCompatibleConfigurationMismatch)) 2559 Result = ConfigurationMismatch; 2560 break; 2561 } 2562 2563 case FILE_SYSTEM_OPTIONS: { 2564 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2565 if (!AllowCompatibleConfigurationMismatch && 2566 ParseFileSystemOptions(Record, Complain, Listener)) 2567 Result = ConfigurationMismatch; 2568 break; 2569 } 2570 2571 case HEADER_SEARCH_OPTIONS: { 2572 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2573 if (!AllowCompatibleConfigurationMismatch && 2574 ParseHeaderSearchOptions(Record, Complain, Listener)) 2575 Result = ConfigurationMismatch; 2576 break; 2577 } 2578 2579 case PREPROCESSOR_OPTIONS: 2580 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2581 if (!AllowCompatibleConfigurationMismatch && 2582 ParsePreprocessorOptions(Record, Complain, Listener, 2583 SuggestedPredefines)) 2584 Result = ConfigurationMismatch; 2585 break; 2586 } 2587 } 2588 } 2589 2590 ASTReader::ASTReadResult 2591 ASTReader::ReadControlBlock(ModuleFile &F, 2592 SmallVectorImpl<ImportedModule> &Loaded, 2593 const ModuleFile *ImportedBy, 2594 unsigned ClientLoadCapabilities) { 2595 BitstreamCursor &Stream = F.Stream; 2596 2597 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2598 Error(std::move(Err)); 2599 return Failure; 2600 } 2601 2602 // Lambda to read the unhashed control block the first time it's called. 2603 // 2604 // For PCM files, the unhashed control block cannot be read until after the 2605 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2606 // need to look ahead before reading the IMPORTS record. For consistency, 2607 // this block is always read somehow (see BitstreamEntry::EndBlock). 2608 bool HasReadUnhashedControlBlock = false; 2609 auto readUnhashedControlBlockOnce = [&]() { 2610 if (!HasReadUnhashedControlBlock) { 2611 HasReadUnhashedControlBlock = true; 2612 if (ASTReadResult Result = 2613 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2614 return Result; 2615 } 2616 return Success; 2617 }; 2618 2619 bool DisableValidation = shouldDisableValidationForFile(F); 2620 2621 // Read all of the records and blocks in the control block. 2622 RecordData Record; 2623 unsigned NumInputs = 0; 2624 unsigned NumUserInputs = 0; 2625 StringRef BaseDirectoryAsWritten; 2626 while (true) { 2627 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2628 if (!MaybeEntry) { 2629 Error(MaybeEntry.takeError()); 2630 return Failure; 2631 } 2632 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2633 2634 switch (Entry.Kind) { 2635 case llvm::BitstreamEntry::Error: 2636 Error("malformed block record in AST file"); 2637 return Failure; 2638 case llvm::BitstreamEntry::EndBlock: { 2639 // Validate the module before returning. This call catches an AST with 2640 // no module name and no imports. 2641 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2642 return Result; 2643 2644 // Validate input files. 2645 const HeaderSearchOptions &HSOpts = 2646 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2647 2648 // All user input files reside at the index range [0, NumUserInputs), and 2649 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2650 // loaded module files, ignore missing inputs. 2651 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2652 F.Kind != MK_PrebuiltModule) { 2653 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2654 2655 // If we are reading a module, we will create a verification timestamp, 2656 // so we verify all input files. Otherwise, verify only user input 2657 // files. 2658 2659 unsigned N = NumUserInputs; 2660 if (ValidateSystemInputs || 2661 (HSOpts.ModulesValidateOncePerBuildSession && 2662 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2663 F.Kind == MK_ImplicitModule)) 2664 N = NumInputs; 2665 2666 for (unsigned I = 0; I < N; ++I) { 2667 InputFile IF = getInputFile(F, I+1, Complain); 2668 if (!IF.getFile() || IF.isOutOfDate()) 2669 return OutOfDate; 2670 } 2671 } 2672 2673 if (Listener) 2674 Listener->visitModuleFile(F.FileName, F.Kind); 2675 2676 if (Listener && Listener->needsInputFileVisitation()) { 2677 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2678 : NumUserInputs; 2679 for (unsigned I = 0; I < N; ++I) { 2680 bool IsSystem = I >= NumUserInputs; 2681 InputFileInfo FI = readInputFileInfo(F, I+1); 2682 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2683 F.Kind == MK_ExplicitModule || 2684 F.Kind == MK_PrebuiltModule); 2685 } 2686 } 2687 2688 return Success; 2689 } 2690 2691 case llvm::BitstreamEntry::SubBlock: 2692 switch (Entry.ID) { 2693 case INPUT_FILES_BLOCK_ID: 2694 F.InputFilesCursor = Stream; 2695 if (llvm::Error Err = Stream.SkipBlock()) { 2696 Error(std::move(Err)); 2697 return Failure; 2698 } 2699 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2700 Error("malformed block record in AST file"); 2701 return Failure; 2702 } 2703 continue; 2704 2705 case OPTIONS_BLOCK_ID: 2706 // If we're reading the first module for this group, check its options 2707 // are compatible with ours. For modules it imports, no further checking 2708 // is required, because we checked them when we built it. 2709 if (Listener && !ImportedBy) { 2710 // Should we allow the configuration of the module file to differ from 2711 // the configuration of the current translation unit in a compatible 2712 // way? 2713 // 2714 // FIXME: Allow this for files explicitly specified with -include-pch. 2715 bool AllowCompatibleConfigurationMismatch = 2716 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2717 2718 ASTReadResult Result = 2719 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2720 AllowCompatibleConfigurationMismatch, *Listener, 2721 SuggestedPredefines); 2722 if (Result == Failure) { 2723 Error("malformed block record in AST file"); 2724 return Result; 2725 } 2726 2727 if (DisableValidation || 2728 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2729 Result = Success; 2730 2731 // If we can't load the module, exit early since we likely 2732 // will rebuild the module anyway. The stream may be in the 2733 // middle of a block. 2734 if (Result != Success) 2735 return Result; 2736 } else if (llvm::Error Err = Stream.SkipBlock()) { 2737 Error(std::move(Err)); 2738 return Failure; 2739 } 2740 continue; 2741 2742 default: 2743 if (llvm::Error Err = Stream.SkipBlock()) { 2744 Error(std::move(Err)); 2745 return Failure; 2746 } 2747 continue; 2748 } 2749 2750 case llvm::BitstreamEntry::Record: 2751 // The interesting case. 2752 break; 2753 } 2754 2755 // Read and process a record. 2756 Record.clear(); 2757 StringRef Blob; 2758 Expected<unsigned> MaybeRecordType = 2759 Stream.readRecord(Entry.ID, Record, &Blob); 2760 if (!MaybeRecordType) { 2761 Error(MaybeRecordType.takeError()); 2762 return Failure; 2763 } 2764 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2765 case METADATA: { 2766 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2767 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2768 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2769 : diag::err_pch_version_too_new); 2770 return VersionMismatch; 2771 } 2772 2773 bool hasErrors = Record[6]; 2774 if (hasErrors && !DisableValidation) { 2775 // If requested by the caller and the module hasn't already been read 2776 // or compiled, mark modules on error as out-of-date. 2777 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) && 2778 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2779 return OutOfDate; 2780 2781 if (!AllowASTWithCompilerErrors) { 2782 Diag(diag::err_pch_with_compiler_errors); 2783 return HadErrors; 2784 } 2785 } 2786 if (hasErrors) { 2787 Diags.ErrorOccurred = true; 2788 Diags.UncompilableErrorOccurred = true; 2789 Diags.UnrecoverableErrorOccurred = true; 2790 } 2791 2792 F.RelocatablePCH = Record[4]; 2793 // Relative paths in a relocatable PCH are relative to our sysroot. 2794 if (F.RelocatablePCH) 2795 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2796 2797 F.HasTimestamps = Record[5]; 2798 2799 const std::string &CurBranch = getClangFullRepositoryVersion(); 2800 StringRef ASTBranch = Blob; 2801 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2802 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2803 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2804 return VersionMismatch; 2805 } 2806 break; 2807 } 2808 2809 case IMPORTS: { 2810 // Validate the AST before processing any imports (otherwise, untangling 2811 // them can be error-prone and expensive). A module will have a name and 2812 // will already have been validated, but this catches the PCH case. 2813 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2814 return Result; 2815 2816 // Load each of the imported PCH files. 2817 unsigned Idx = 0, N = Record.size(); 2818 while (Idx < N) { 2819 // Read information about the AST file. 2820 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2821 // The import location will be the local one for now; we will adjust 2822 // all import locations of module imports after the global source 2823 // location info are setup, in ReadAST. 2824 SourceLocation ImportLoc = 2825 ReadUntranslatedSourceLocation(Record[Idx++]); 2826 off_t StoredSize = (off_t)Record[Idx++]; 2827 time_t StoredModTime = (time_t)Record[Idx++]; 2828 auto FirstSignatureByte = Record.begin() + Idx; 2829 ASTFileSignature StoredSignature = ASTFileSignature::create( 2830 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size); 2831 Idx += ASTFileSignature::size; 2832 2833 std::string ImportedName = ReadString(Record, Idx); 2834 std::string ImportedFile; 2835 2836 // For prebuilt and explicit modules first consult the file map for 2837 // an override. Note that here we don't search prebuilt module 2838 // directories, only the explicit name to file mappings. Also, we will 2839 // still verify the size/signature making sure it is essentially the 2840 // same file but perhaps in a different location. 2841 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2842 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2843 ImportedName, /*FileMapOnly*/ true); 2844 2845 if (ImportedFile.empty()) 2846 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2847 // ModuleCache as when writing. 2848 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2849 else 2850 SkipPath(Record, Idx); 2851 2852 // If our client can't cope with us being out of date, we can't cope with 2853 // our dependency being missing. 2854 unsigned Capabilities = ClientLoadCapabilities; 2855 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2856 Capabilities &= ~ARR_Missing; 2857 2858 // Load the AST file. 2859 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2860 Loaded, StoredSize, StoredModTime, 2861 StoredSignature, Capabilities); 2862 2863 // If we diagnosed a problem, produce a backtrace. 2864 bool recompilingFinalized = 2865 Result == OutOfDate && (Capabilities & ARR_OutOfDate) && 2866 getModuleManager().getModuleCache().isPCMFinal(F.FileName); 2867 if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized) 2868 Diag(diag::note_module_file_imported_by) 2869 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2870 if (recompilingFinalized) 2871 Diag(diag::note_module_file_conflict); 2872 2873 switch (Result) { 2874 case Failure: return Failure; 2875 // If we have to ignore the dependency, we'll have to ignore this too. 2876 case Missing: 2877 case OutOfDate: return OutOfDate; 2878 case VersionMismatch: return VersionMismatch; 2879 case ConfigurationMismatch: return ConfigurationMismatch; 2880 case HadErrors: return HadErrors; 2881 case Success: break; 2882 } 2883 } 2884 break; 2885 } 2886 2887 case ORIGINAL_FILE: 2888 F.OriginalSourceFileID = FileID::get(Record[0]); 2889 F.ActualOriginalSourceFileName = std::string(Blob); 2890 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2891 ResolveImportedPath(F, F.OriginalSourceFileName); 2892 break; 2893 2894 case ORIGINAL_FILE_ID: 2895 F.OriginalSourceFileID = FileID::get(Record[0]); 2896 break; 2897 2898 case ORIGINAL_PCH_DIR: 2899 F.OriginalDir = std::string(Blob); 2900 break; 2901 2902 case MODULE_NAME: 2903 F.ModuleName = std::string(Blob); 2904 Diag(diag::remark_module_import) 2905 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2906 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2907 if (Listener) 2908 Listener->ReadModuleName(F.ModuleName); 2909 2910 // Validate the AST as soon as we have a name so we can exit early on 2911 // failure. 2912 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2913 return Result; 2914 2915 break; 2916 2917 case MODULE_DIRECTORY: { 2918 // Save the BaseDirectory as written in the PCM for computing the module 2919 // filename for the ModuleCache. 2920 BaseDirectoryAsWritten = Blob; 2921 assert(!F.ModuleName.empty() && 2922 "MODULE_DIRECTORY found before MODULE_NAME"); 2923 // If we've already loaded a module map file covering this module, we may 2924 // have a better path for it (relative to the current build). 2925 Module *M = PP.getHeaderSearchInfo().lookupModule( 2926 F.ModuleName, /*AllowSearch*/ true, 2927 /*AllowExtraModuleMapSearch*/ true); 2928 if (M && M->Directory) { 2929 // If we're implicitly loading a module, the base directory can't 2930 // change between the build and use. 2931 // Don't emit module relocation error if we have -fno-validate-pch 2932 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 2933 DisableValidationForModuleKind::Module) && 2934 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2935 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2936 if (!BuildDir || *BuildDir != M->Directory) { 2937 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2938 Diag(diag::err_imported_module_relocated) 2939 << F.ModuleName << Blob << M->Directory->getName(); 2940 return OutOfDate; 2941 } 2942 } 2943 F.BaseDirectory = std::string(M->Directory->getName()); 2944 } else { 2945 F.BaseDirectory = std::string(Blob); 2946 } 2947 break; 2948 } 2949 2950 case MODULE_MAP_FILE: 2951 if (ASTReadResult Result = 2952 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2953 return Result; 2954 break; 2955 2956 case INPUT_FILE_OFFSETS: 2957 NumInputs = Record[0]; 2958 NumUserInputs = Record[1]; 2959 F.InputFileOffsets = 2960 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2961 F.InputFilesLoaded.resize(NumInputs); 2962 F.NumUserInputFiles = NumUserInputs; 2963 break; 2964 } 2965 } 2966 } 2967 2968 llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, 2969 unsigned ClientLoadCapabilities) { 2970 BitstreamCursor &Stream = F.Stream; 2971 2972 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) 2973 return Err; 2974 F.ASTBlockStartOffset = Stream.GetCurrentBitNo(); 2975 2976 // Read all of the records and blocks for the AST file. 2977 RecordData Record; 2978 while (true) { 2979 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2980 if (!MaybeEntry) 2981 return MaybeEntry.takeError(); 2982 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2983 2984 switch (Entry.Kind) { 2985 case llvm::BitstreamEntry::Error: 2986 return llvm::createStringError( 2987 std::errc::illegal_byte_sequence, 2988 "error at end of module block in AST file"); 2989 case llvm::BitstreamEntry::EndBlock: 2990 // Outside of C++, we do not store a lookup map for the translation unit. 2991 // Instead, mark it as needing a lookup map to be built if this module 2992 // contains any declarations lexically within it (which it always does!). 2993 // This usually has no cost, since we very rarely need the lookup map for 2994 // the translation unit outside C++. 2995 if (ASTContext *Ctx = ContextObj) { 2996 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2997 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2998 DC->setMustBuildLookupTable(); 2999 } 3000 3001 return llvm::Error::success(); 3002 case llvm::BitstreamEntry::SubBlock: 3003 switch (Entry.ID) { 3004 case DECLTYPES_BLOCK_ID: 3005 // We lazily load the decls block, but we want to set up the 3006 // DeclsCursor cursor to point into it. Clone our current bitcode 3007 // cursor to it, enter the block and read the abbrevs in that block. 3008 // With the main cursor, we just skip over it. 3009 F.DeclsCursor = Stream; 3010 if (llvm::Error Err = Stream.SkipBlock()) 3011 return Err; 3012 if (llvm::Error Err = ReadBlockAbbrevs( 3013 F.DeclsCursor, DECLTYPES_BLOCK_ID, &F.DeclsBlockStartOffset)) 3014 return Err; 3015 break; 3016 3017 case PREPROCESSOR_BLOCK_ID: 3018 F.MacroCursor = Stream; 3019 if (!PP.getExternalSource()) 3020 PP.setExternalSource(this); 3021 3022 if (llvm::Error Err = Stream.SkipBlock()) 3023 return Err; 3024 if (llvm::Error Err = 3025 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) 3026 return Err; 3027 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 3028 break; 3029 3030 case PREPROCESSOR_DETAIL_BLOCK_ID: 3031 F.PreprocessorDetailCursor = Stream; 3032 3033 if (llvm::Error Err = Stream.SkipBlock()) { 3034 return Err; 3035 } 3036 if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3037 PREPROCESSOR_DETAIL_BLOCK_ID)) 3038 return Err; 3039 F.PreprocessorDetailStartOffset 3040 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3041 3042 if (!PP.getPreprocessingRecord()) 3043 PP.createPreprocessingRecord(); 3044 if (!PP.getPreprocessingRecord()->getExternalSource()) 3045 PP.getPreprocessingRecord()->SetExternalSource(*this); 3046 break; 3047 3048 case SOURCE_MANAGER_BLOCK_ID: 3049 if (llvm::Error Err = ReadSourceManagerBlock(F)) 3050 return Err; 3051 break; 3052 3053 case SUBMODULE_BLOCK_ID: 3054 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3055 return Err; 3056 break; 3057 3058 case COMMENTS_BLOCK_ID: { 3059 BitstreamCursor C = Stream; 3060 3061 if (llvm::Error Err = Stream.SkipBlock()) 3062 return Err; 3063 if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) 3064 return Err; 3065 CommentsCursors.push_back(std::make_pair(C, &F)); 3066 break; 3067 } 3068 3069 default: 3070 if (llvm::Error Err = Stream.SkipBlock()) 3071 return Err; 3072 break; 3073 } 3074 continue; 3075 3076 case llvm::BitstreamEntry::Record: 3077 // The interesting case. 3078 break; 3079 } 3080 3081 // Read and process a record. 3082 Record.clear(); 3083 StringRef Blob; 3084 Expected<unsigned> MaybeRecordType = 3085 Stream.readRecord(Entry.ID, Record, &Blob); 3086 if (!MaybeRecordType) 3087 return MaybeRecordType.takeError(); 3088 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3089 3090 // If we're not loading an AST context, we don't care about most records. 3091 if (!ContextObj) { 3092 switch (RecordType) { 3093 case IDENTIFIER_TABLE: 3094 case IDENTIFIER_OFFSET: 3095 case INTERESTING_IDENTIFIERS: 3096 case STATISTICS: 3097 case PP_CONDITIONAL_STACK: 3098 case PP_COUNTER_VALUE: 3099 case SOURCE_LOCATION_OFFSETS: 3100 case MODULE_OFFSET_MAP: 3101 case SOURCE_MANAGER_LINE_TABLE: 3102 case SOURCE_LOCATION_PRELOADS: 3103 case PPD_ENTITIES_OFFSETS: 3104 case HEADER_SEARCH_TABLE: 3105 case IMPORTED_MODULES: 3106 case MACRO_OFFSET: 3107 break; 3108 default: 3109 continue; 3110 } 3111 } 3112 3113 switch (RecordType) { 3114 default: // Default behavior: ignore. 3115 break; 3116 3117 case TYPE_OFFSET: { 3118 if (F.LocalNumTypes != 0) 3119 return llvm::createStringError( 3120 std::errc::illegal_byte_sequence, 3121 "duplicate TYPE_OFFSET record in AST file"); 3122 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data()); 3123 F.LocalNumTypes = Record[0]; 3124 unsigned LocalBaseTypeIndex = Record[1]; 3125 F.BaseTypeIndex = getTotalNumTypes(); 3126 3127 if (F.LocalNumTypes > 0) { 3128 // Introduce the global -> local mapping for types within this module. 3129 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3130 3131 // Introduce the local -> global mapping for types within this module. 3132 F.TypeRemap.insertOrReplace( 3133 std::make_pair(LocalBaseTypeIndex, 3134 F.BaseTypeIndex - LocalBaseTypeIndex)); 3135 3136 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3137 } 3138 break; 3139 } 3140 3141 case DECL_OFFSET: { 3142 if (F.LocalNumDecls != 0) 3143 return llvm::createStringError( 3144 std::errc::illegal_byte_sequence, 3145 "duplicate DECL_OFFSET record in AST file"); 3146 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3147 F.LocalNumDecls = Record[0]; 3148 unsigned LocalBaseDeclID = Record[1]; 3149 F.BaseDeclID = getTotalNumDecls(); 3150 3151 if (F.LocalNumDecls > 0) { 3152 // Introduce the global -> local mapping for declarations within this 3153 // module. 3154 GlobalDeclMap.insert( 3155 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3156 3157 // Introduce the local -> global mapping for declarations within this 3158 // module. 3159 F.DeclRemap.insertOrReplace( 3160 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3161 3162 // Introduce the global -> local mapping for declarations within this 3163 // module. 3164 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3165 3166 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3167 } 3168 break; 3169 } 3170 3171 case TU_UPDATE_LEXICAL: { 3172 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3173 LexicalContents Contents( 3174 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3175 Blob.data()), 3176 static_cast<unsigned int>(Blob.size() / 4)); 3177 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3178 TU->setHasExternalLexicalStorage(true); 3179 break; 3180 } 3181 3182 case UPDATE_VISIBLE: { 3183 unsigned Idx = 0; 3184 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3185 auto *Data = (const unsigned char*)Blob.data(); 3186 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3187 // If we've already loaded the decl, perform the updates when we finish 3188 // loading this block. 3189 if (Decl *D = GetExistingDecl(ID)) 3190 PendingUpdateRecords.push_back( 3191 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3192 break; 3193 } 3194 3195 case IDENTIFIER_TABLE: 3196 F.IdentifierTableData = 3197 reinterpret_cast<const unsigned char *>(Blob.data()); 3198 if (Record[0]) { 3199 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3200 F.IdentifierTableData + Record[0], 3201 F.IdentifierTableData + sizeof(uint32_t), 3202 F.IdentifierTableData, 3203 ASTIdentifierLookupTrait(*this, F)); 3204 3205 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3206 } 3207 break; 3208 3209 case IDENTIFIER_OFFSET: { 3210 if (F.LocalNumIdentifiers != 0) 3211 return llvm::createStringError( 3212 std::errc::illegal_byte_sequence, 3213 "duplicate IDENTIFIER_OFFSET record in AST file"); 3214 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3215 F.LocalNumIdentifiers = Record[0]; 3216 unsigned LocalBaseIdentifierID = Record[1]; 3217 F.BaseIdentifierID = getTotalNumIdentifiers(); 3218 3219 if (F.LocalNumIdentifiers > 0) { 3220 // Introduce the global -> local mapping for identifiers within this 3221 // module. 3222 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3223 &F)); 3224 3225 // Introduce the local -> global mapping for identifiers within this 3226 // module. 3227 F.IdentifierRemap.insertOrReplace( 3228 std::make_pair(LocalBaseIdentifierID, 3229 F.BaseIdentifierID - LocalBaseIdentifierID)); 3230 3231 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3232 + F.LocalNumIdentifiers); 3233 } 3234 break; 3235 } 3236 3237 case INTERESTING_IDENTIFIERS: 3238 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3239 break; 3240 3241 case EAGERLY_DESERIALIZED_DECLS: 3242 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3243 // about "interesting" decls (for instance, if we're building a module). 3244 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3245 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3246 break; 3247 3248 case MODULAR_CODEGEN_DECLS: 3249 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3250 // them (ie: if we're not codegenerating this module). 3251 if (F.Kind == MK_MainFile || 3252 getContext().getLangOpts().BuildingPCHWithObjectFile) 3253 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3254 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3255 break; 3256 3257 case SPECIAL_TYPES: 3258 if (SpecialTypes.empty()) { 3259 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3260 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3261 break; 3262 } 3263 3264 if (SpecialTypes.size() != Record.size()) 3265 return llvm::createStringError(std::errc::illegal_byte_sequence, 3266 "invalid special-types record"); 3267 3268 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3269 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3270 if (!SpecialTypes[I]) 3271 SpecialTypes[I] = ID; 3272 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3273 // merge step? 3274 } 3275 break; 3276 3277 case STATISTICS: 3278 TotalNumStatements += Record[0]; 3279 TotalNumMacros += Record[1]; 3280 TotalLexicalDeclContexts += Record[2]; 3281 TotalVisibleDeclContexts += Record[3]; 3282 break; 3283 3284 case UNUSED_FILESCOPED_DECLS: 3285 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3286 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3287 break; 3288 3289 case DELEGATING_CTORS: 3290 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3291 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3292 break; 3293 3294 case WEAK_UNDECLARED_IDENTIFIERS: 3295 if (Record.size() % 4 != 0) 3296 return llvm::createStringError(std::errc::illegal_byte_sequence, 3297 "invalid weak identifiers record"); 3298 3299 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3300 // files. This isn't the way to do it :) 3301 WeakUndeclaredIdentifiers.clear(); 3302 3303 // Translate the weak, undeclared identifiers into global IDs. 3304 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3305 WeakUndeclaredIdentifiers.push_back( 3306 getGlobalIdentifierID(F, Record[I++])); 3307 WeakUndeclaredIdentifiers.push_back( 3308 getGlobalIdentifierID(F, Record[I++])); 3309 WeakUndeclaredIdentifiers.push_back( 3310 ReadSourceLocation(F, Record, I).getRawEncoding()); 3311 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3312 } 3313 break; 3314 3315 case SELECTOR_OFFSETS: { 3316 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3317 F.LocalNumSelectors = Record[0]; 3318 unsigned LocalBaseSelectorID = Record[1]; 3319 F.BaseSelectorID = getTotalNumSelectors(); 3320 3321 if (F.LocalNumSelectors > 0) { 3322 // Introduce the global -> local mapping for selectors within this 3323 // module. 3324 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3325 3326 // Introduce the local -> global mapping for selectors within this 3327 // module. 3328 F.SelectorRemap.insertOrReplace( 3329 std::make_pair(LocalBaseSelectorID, 3330 F.BaseSelectorID - LocalBaseSelectorID)); 3331 3332 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3333 } 3334 break; 3335 } 3336 3337 case METHOD_POOL: 3338 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3339 if (Record[0]) 3340 F.SelectorLookupTable 3341 = ASTSelectorLookupTable::Create( 3342 F.SelectorLookupTableData + Record[0], 3343 F.SelectorLookupTableData, 3344 ASTSelectorLookupTrait(*this, F)); 3345 TotalNumMethodPoolEntries += Record[1]; 3346 break; 3347 3348 case REFERENCED_SELECTOR_POOL: 3349 if (!Record.empty()) { 3350 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3351 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3352 Record[Idx++])); 3353 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3354 getRawEncoding()); 3355 } 3356 } 3357 break; 3358 3359 case PP_CONDITIONAL_STACK: 3360 if (!Record.empty()) { 3361 unsigned Idx = 0, End = Record.size() - 1; 3362 bool ReachedEOFWhileSkipping = Record[Idx++]; 3363 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3364 if (ReachedEOFWhileSkipping) { 3365 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3366 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3367 bool FoundNonSkipPortion = Record[Idx++]; 3368 bool FoundElse = Record[Idx++]; 3369 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3370 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3371 FoundElse, ElseLoc); 3372 } 3373 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3374 while (Idx < End) { 3375 auto Loc = ReadSourceLocation(F, Record, Idx); 3376 bool WasSkipping = Record[Idx++]; 3377 bool FoundNonSkip = Record[Idx++]; 3378 bool FoundElse = Record[Idx++]; 3379 ConditionalStack.push_back( 3380 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3381 } 3382 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3383 } 3384 break; 3385 3386 case PP_COUNTER_VALUE: 3387 if (!Record.empty() && Listener) 3388 Listener->ReadCounter(F, Record[0]); 3389 break; 3390 3391 case FILE_SORTED_DECLS: 3392 F.FileSortedDecls = (const DeclID *)Blob.data(); 3393 F.NumFileSortedDecls = Record[0]; 3394 break; 3395 3396 case SOURCE_LOCATION_OFFSETS: { 3397 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3398 F.LocalNumSLocEntries = Record[0]; 3399 SourceLocation::UIntTy SLocSpaceSize = Record[1]; 3400 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset; 3401 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3402 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3403 SLocSpaceSize); 3404 if (!F.SLocEntryBaseID) 3405 return llvm::createStringError(std::errc::invalid_argument, 3406 "ran out of source locations"); 3407 // Make our entry in the range map. BaseID is negative and growing, so 3408 // we invert it. Because we invert it, though, we need the other end of 3409 // the range. 3410 unsigned RangeStart = 3411 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3412 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3413 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3414 3415 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3416 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0); 3417 GlobalSLocOffsetMap.insert( 3418 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3419 - SLocSpaceSize,&F)); 3420 3421 // Initialize the remapping table. 3422 // Invalid stays invalid. 3423 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3424 // This module. Base was 2 when being compiled. 3425 F.SLocRemap.insertOrReplace(std::make_pair( 3426 2U, static_cast<SourceLocation::IntTy>(F.SLocEntryBaseOffset - 2))); 3427 3428 TotalNumSLocEntries += F.LocalNumSLocEntries; 3429 break; 3430 } 3431 3432 case MODULE_OFFSET_MAP: 3433 F.ModuleOffsetMap = Blob; 3434 break; 3435 3436 case SOURCE_MANAGER_LINE_TABLE: 3437 ParseLineTable(F, Record); 3438 break; 3439 3440 case SOURCE_LOCATION_PRELOADS: { 3441 // Need to transform from the local view (1-based IDs) to the global view, 3442 // which is based off F.SLocEntryBaseID. 3443 if (!F.PreloadSLocEntries.empty()) 3444 return llvm::createStringError( 3445 std::errc::illegal_byte_sequence, 3446 "Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3447 3448 F.PreloadSLocEntries.swap(Record); 3449 break; 3450 } 3451 3452 case EXT_VECTOR_DECLS: 3453 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3454 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3455 break; 3456 3457 case VTABLE_USES: 3458 if (Record.size() % 3 != 0) 3459 return llvm::createStringError(std::errc::illegal_byte_sequence, 3460 "Invalid VTABLE_USES record"); 3461 3462 // Later tables overwrite earlier ones. 3463 // FIXME: Modules will have some trouble with this. This is clearly not 3464 // the right way to do this. 3465 VTableUses.clear(); 3466 3467 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3468 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3469 VTableUses.push_back( 3470 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3471 VTableUses.push_back(Record[Idx++]); 3472 } 3473 break; 3474 3475 case PENDING_IMPLICIT_INSTANTIATIONS: 3476 if (PendingInstantiations.size() % 2 != 0) 3477 return llvm::createStringError( 3478 std::errc::illegal_byte_sequence, 3479 "Invalid existing PendingInstantiations"); 3480 3481 if (Record.size() % 2 != 0) 3482 return llvm::createStringError( 3483 std::errc::illegal_byte_sequence, 3484 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3485 3486 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3487 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3488 PendingInstantiations.push_back( 3489 ReadSourceLocation(F, Record, I).getRawEncoding()); 3490 } 3491 break; 3492 3493 case SEMA_DECL_REFS: 3494 if (Record.size() != 3) 3495 return llvm::createStringError(std::errc::illegal_byte_sequence, 3496 "Invalid SEMA_DECL_REFS block"); 3497 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3498 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3499 break; 3500 3501 case PPD_ENTITIES_OFFSETS: { 3502 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3503 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3504 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3505 3506 unsigned LocalBasePreprocessedEntityID = Record[0]; 3507 3508 unsigned StartingID; 3509 if (!PP.getPreprocessingRecord()) 3510 PP.createPreprocessingRecord(); 3511 if (!PP.getPreprocessingRecord()->getExternalSource()) 3512 PP.getPreprocessingRecord()->SetExternalSource(*this); 3513 StartingID 3514 = PP.getPreprocessingRecord() 3515 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3516 F.BasePreprocessedEntityID = StartingID; 3517 3518 if (F.NumPreprocessedEntities > 0) { 3519 // Introduce the global -> local mapping for preprocessed entities in 3520 // this module. 3521 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3522 3523 // Introduce the local -> global mapping for preprocessed entities in 3524 // this module. 3525 F.PreprocessedEntityRemap.insertOrReplace( 3526 std::make_pair(LocalBasePreprocessedEntityID, 3527 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3528 } 3529 3530 break; 3531 } 3532 3533 case PPD_SKIPPED_RANGES: { 3534 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3535 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3536 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3537 3538 if (!PP.getPreprocessingRecord()) 3539 PP.createPreprocessingRecord(); 3540 if (!PP.getPreprocessingRecord()->getExternalSource()) 3541 PP.getPreprocessingRecord()->SetExternalSource(*this); 3542 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3543 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3544 3545 if (F.NumPreprocessedSkippedRanges > 0) 3546 GlobalSkippedRangeMap.insert( 3547 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3548 break; 3549 } 3550 3551 case DECL_UPDATE_OFFSETS: 3552 if (Record.size() % 2 != 0) 3553 return llvm::createStringError( 3554 std::errc::illegal_byte_sequence, 3555 "invalid DECL_UPDATE_OFFSETS block in AST file"); 3556 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3557 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3558 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3559 3560 // If we've already loaded the decl, perform the updates when we finish 3561 // loading this block. 3562 if (Decl *D = GetExistingDecl(ID)) 3563 PendingUpdateRecords.push_back( 3564 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3565 } 3566 break; 3567 3568 case OBJC_CATEGORIES_MAP: 3569 if (F.LocalNumObjCCategoriesInMap != 0) 3570 return llvm::createStringError( 3571 std::errc::illegal_byte_sequence, 3572 "duplicate OBJC_CATEGORIES_MAP record in AST file"); 3573 3574 F.LocalNumObjCCategoriesInMap = Record[0]; 3575 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3576 break; 3577 3578 case OBJC_CATEGORIES: 3579 F.ObjCCategories.swap(Record); 3580 break; 3581 3582 case CUDA_SPECIAL_DECL_REFS: 3583 // Later tables overwrite earlier ones. 3584 // FIXME: Modules will have trouble with this. 3585 CUDASpecialDeclRefs.clear(); 3586 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3587 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3588 break; 3589 3590 case HEADER_SEARCH_TABLE: 3591 F.HeaderFileInfoTableData = Blob.data(); 3592 F.LocalNumHeaderFileInfos = Record[1]; 3593 if (Record[0]) { 3594 F.HeaderFileInfoTable 3595 = HeaderFileInfoLookupTable::Create( 3596 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3597 (const unsigned char *)F.HeaderFileInfoTableData, 3598 HeaderFileInfoTrait(*this, F, 3599 &PP.getHeaderSearchInfo(), 3600 Blob.data() + Record[2])); 3601 3602 PP.getHeaderSearchInfo().SetExternalSource(this); 3603 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3604 PP.getHeaderSearchInfo().SetExternalLookup(this); 3605 } 3606 break; 3607 3608 case FP_PRAGMA_OPTIONS: 3609 // Later tables overwrite earlier ones. 3610 FPPragmaOptions.swap(Record); 3611 break; 3612 3613 case OPENCL_EXTENSIONS: 3614 for (unsigned I = 0, E = Record.size(); I != E; ) { 3615 auto Name = ReadString(Record, I); 3616 auto &OptInfo = OpenCLExtensions.OptMap[Name]; 3617 OptInfo.Supported = Record[I++] != 0; 3618 OptInfo.Enabled = Record[I++] != 0; 3619 OptInfo.WithPragma = Record[I++] != 0; 3620 OptInfo.Avail = Record[I++]; 3621 OptInfo.Core = Record[I++]; 3622 OptInfo.Opt = Record[I++]; 3623 } 3624 break; 3625 3626 case TENTATIVE_DEFINITIONS: 3627 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3628 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3629 break; 3630 3631 case KNOWN_NAMESPACES: 3632 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3633 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3634 break; 3635 3636 case UNDEFINED_BUT_USED: 3637 if (UndefinedButUsed.size() % 2 != 0) 3638 return llvm::createStringError(std::errc::illegal_byte_sequence, 3639 "Invalid existing UndefinedButUsed"); 3640 3641 if (Record.size() % 2 != 0) 3642 return llvm::createStringError(std::errc::illegal_byte_sequence, 3643 "invalid undefined-but-used record"); 3644 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3645 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3646 UndefinedButUsed.push_back( 3647 ReadSourceLocation(F, Record, I).getRawEncoding()); 3648 } 3649 break; 3650 3651 case DELETE_EXPRS_TO_ANALYZE: 3652 for (unsigned I = 0, N = Record.size(); I != N;) { 3653 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3654 const uint64_t Count = Record[I++]; 3655 DelayedDeleteExprs.push_back(Count); 3656 for (uint64_t C = 0; C < Count; ++C) { 3657 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3658 bool IsArrayForm = Record[I++] == 1; 3659 DelayedDeleteExprs.push_back(IsArrayForm); 3660 } 3661 } 3662 break; 3663 3664 case IMPORTED_MODULES: 3665 if (!F.isModule()) { 3666 // If we aren't loading a module (which has its own exports), make 3667 // all of the imported modules visible. 3668 // FIXME: Deal with macros-only imports. 3669 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3670 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3671 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3672 if (GlobalID) { 3673 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3674 if (DeserializationListener) 3675 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3676 } 3677 } 3678 } 3679 break; 3680 3681 case MACRO_OFFSET: { 3682 if (F.LocalNumMacros != 0) 3683 return llvm::createStringError( 3684 std::errc::illegal_byte_sequence, 3685 "duplicate MACRO_OFFSET record in AST file"); 3686 F.MacroOffsets = (const uint32_t *)Blob.data(); 3687 F.LocalNumMacros = Record[0]; 3688 unsigned LocalBaseMacroID = Record[1]; 3689 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset; 3690 F.BaseMacroID = getTotalNumMacros(); 3691 3692 if (F.LocalNumMacros > 0) { 3693 // Introduce the global -> local mapping for macros within this module. 3694 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3695 3696 // Introduce the local -> global mapping for macros within this module. 3697 F.MacroRemap.insertOrReplace( 3698 std::make_pair(LocalBaseMacroID, 3699 F.BaseMacroID - LocalBaseMacroID)); 3700 3701 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3702 } 3703 break; 3704 } 3705 3706 case LATE_PARSED_TEMPLATE: 3707 LateParsedTemplates.emplace_back( 3708 std::piecewise_construct, std::forward_as_tuple(&F), 3709 std::forward_as_tuple(Record.begin(), Record.end())); 3710 break; 3711 3712 case OPTIMIZE_PRAGMA_OPTIONS: 3713 if (Record.size() != 1) 3714 return llvm::createStringError(std::errc::illegal_byte_sequence, 3715 "invalid pragma optimize record"); 3716 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3717 break; 3718 3719 case MSSTRUCT_PRAGMA_OPTIONS: 3720 if (Record.size() != 1) 3721 return llvm::createStringError(std::errc::illegal_byte_sequence, 3722 "invalid pragma ms_struct record"); 3723 PragmaMSStructState = Record[0]; 3724 break; 3725 3726 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3727 if (Record.size() != 2) 3728 return llvm::createStringError( 3729 std::errc::illegal_byte_sequence, 3730 "invalid pragma pointers to members record"); 3731 PragmaMSPointersToMembersState = Record[0]; 3732 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3733 break; 3734 3735 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3736 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3737 UnusedLocalTypedefNameCandidates.push_back( 3738 getGlobalDeclID(F, Record[I])); 3739 break; 3740 3741 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3742 if (Record.size() != 1) 3743 return llvm::createStringError(std::errc::illegal_byte_sequence, 3744 "invalid cuda pragma options record"); 3745 ForceCUDAHostDeviceDepth = Record[0]; 3746 break; 3747 3748 case ALIGN_PACK_PRAGMA_OPTIONS: { 3749 if (Record.size() < 3) 3750 return llvm::createStringError(std::errc::illegal_byte_sequence, 3751 "invalid pragma pack record"); 3752 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]); 3753 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3754 unsigned NumStackEntries = Record[2]; 3755 unsigned Idx = 3; 3756 // Reset the stack when importing a new module. 3757 PragmaAlignPackStack.clear(); 3758 for (unsigned I = 0; I < NumStackEntries; ++I) { 3759 PragmaAlignPackStackEntry Entry; 3760 Entry.Value = ReadAlignPackInfo(Record[Idx++]); 3761 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3762 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3763 PragmaAlignPackStrings.push_back(ReadString(Record, Idx)); 3764 Entry.SlotLabel = PragmaAlignPackStrings.back(); 3765 PragmaAlignPackStack.push_back(Entry); 3766 } 3767 break; 3768 } 3769 3770 case FLOAT_CONTROL_PRAGMA_OPTIONS: { 3771 if (Record.size() < 3) 3772 return llvm::createStringError(std::errc::illegal_byte_sequence, 3773 "invalid pragma float control record"); 3774 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]); 3775 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3776 unsigned NumStackEntries = Record[2]; 3777 unsigned Idx = 3; 3778 // Reset the stack when importing a new module. 3779 FpPragmaStack.clear(); 3780 for (unsigned I = 0; I < NumStackEntries; ++I) { 3781 FpPragmaStackEntry Entry; 3782 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]); 3783 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3784 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3785 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3786 Entry.SlotLabel = FpPragmaStrings.back(); 3787 FpPragmaStack.push_back(Entry); 3788 } 3789 break; 3790 } 3791 3792 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3793 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3794 DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I])); 3795 break; 3796 } 3797 } 3798 } 3799 3800 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3801 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3802 3803 // Additional remapping information. 3804 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3805 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3806 F.ModuleOffsetMap = StringRef(); 3807 3808 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3809 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3810 F.SLocRemap.insert(std::make_pair(0U, 0)); 3811 F.SLocRemap.insert(std::make_pair(2U, 1)); 3812 } 3813 3814 // Continuous range maps we may be updating in our module. 3815 using SLocRemapBuilder = 3816 ContinuousRangeMap<SourceLocation::UIntTy, SourceLocation::IntTy, 3817 2>::Builder; 3818 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3819 SLocRemapBuilder SLocRemap(F.SLocRemap); 3820 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3821 RemapBuilder MacroRemap(F.MacroRemap); 3822 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3823 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3824 RemapBuilder SelectorRemap(F.SelectorRemap); 3825 RemapBuilder DeclRemap(F.DeclRemap); 3826 RemapBuilder TypeRemap(F.TypeRemap); 3827 3828 while (Data < DataEnd) { 3829 // FIXME: Looking up dependency modules by filename is horrible. Let's 3830 // start fixing this with prebuilt, explicit and implicit modules and see 3831 // how it goes... 3832 using namespace llvm::support; 3833 ModuleKind Kind = static_cast<ModuleKind>( 3834 endian::readNext<uint8_t, little, unaligned>(Data)); 3835 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3836 StringRef Name = StringRef((const char*)Data, Len); 3837 Data += Len; 3838 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule || 3839 Kind == MK_ImplicitModule 3840 ? ModuleMgr.lookupByModuleName(Name) 3841 : ModuleMgr.lookupByFileName(Name)); 3842 if (!OM) { 3843 std::string Msg = 3844 "SourceLocation remap refers to unknown module, cannot find "; 3845 Msg.append(std::string(Name)); 3846 Error(Msg); 3847 return; 3848 } 3849 3850 SourceLocation::UIntTy SLocOffset = 3851 endian::readNext<uint32_t, little, unaligned>(Data); 3852 uint32_t IdentifierIDOffset = 3853 endian::readNext<uint32_t, little, unaligned>(Data); 3854 uint32_t MacroIDOffset = 3855 endian::readNext<uint32_t, little, unaligned>(Data); 3856 uint32_t PreprocessedEntityIDOffset = 3857 endian::readNext<uint32_t, little, unaligned>(Data); 3858 uint32_t SubmoduleIDOffset = 3859 endian::readNext<uint32_t, little, unaligned>(Data); 3860 uint32_t SelectorIDOffset = 3861 endian::readNext<uint32_t, little, unaligned>(Data); 3862 uint32_t DeclIDOffset = 3863 endian::readNext<uint32_t, little, unaligned>(Data); 3864 uint32_t TypeIndexOffset = 3865 endian::readNext<uint32_t, little, unaligned>(Data); 3866 3867 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3868 RemapBuilder &Remap) { 3869 constexpr uint32_t None = std::numeric_limits<uint32_t>::max(); 3870 if (Offset != None) 3871 Remap.insert(std::make_pair(Offset, 3872 static_cast<int>(BaseOffset - Offset))); 3873 }; 3874 3875 constexpr SourceLocation::UIntTy SLocNone = 3876 std::numeric_limits<SourceLocation::UIntTy>::max(); 3877 if (SLocOffset != SLocNone) 3878 SLocRemap.insert(std::make_pair( 3879 SLocOffset, static_cast<SourceLocation::IntTy>( 3880 OM->SLocEntryBaseOffset - SLocOffset))); 3881 3882 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3883 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3884 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3885 PreprocessedEntityRemap); 3886 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3887 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3888 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3889 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3890 3891 // Global -> local mappings. 3892 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3893 } 3894 } 3895 3896 ASTReader::ASTReadResult 3897 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3898 const ModuleFile *ImportedBy, 3899 unsigned ClientLoadCapabilities) { 3900 unsigned Idx = 0; 3901 F.ModuleMapPath = ReadPath(F, Record, Idx); 3902 3903 // Try to resolve ModuleName in the current header search context and 3904 // verify that it is found in the same module map file as we saved. If the 3905 // top-level AST file is a main file, skip this check because there is no 3906 // usable header search context. 3907 assert(!F.ModuleName.empty() && 3908 "MODULE_NAME should come before MODULE_MAP_FILE"); 3909 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3910 // An implicitly-loaded module file should have its module listed in some 3911 // module map file that we've already loaded. 3912 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3913 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3914 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3915 // Don't emit module relocation error if we have -fno-validate-pch 3916 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 3917 DisableValidationForModuleKind::Module) && 3918 !ModMap) { 3919 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) { 3920 if (auto ASTFE = M ? M->getASTFile() : None) { 3921 // This module was defined by an imported (explicit) module. 3922 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3923 << ASTFE->getName(); 3924 } else { 3925 // This module was built with a different module map. 3926 Diag(diag::err_imported_module_not_found) 3927 << F.ModuleName << F.FileName 3928 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3929 << !ImportedBy; 3930 // In case it was imported by a PCH, there's a chance the user is 3931 // just missing to include the search path to the directory containing 3932 // the modulemap. 3933 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3934 Diag(diag::note_imported_by_pch_module_not_found) 3935 << llvm::sys::path::parent_path(F.ModuleMapPath); 3936 } 3937 } 3938 return OutOfDate; 3939 } 3940 3941 assert(M && M->Name == F.ModuleName && "found module with different name"); 3942 3943 // Check the primary module map file. 3944 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3945 if (!StoredModMap || *StoredModMap != ModMap) { 3946 assert(ModMap && "found module is missing module map file"); 3947 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3948 "top-level import should be verified"); 3949 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3950 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3951 Diag(diag::err_imported_module_modmap_changed) 3952 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3953 << ModMap->getName() << F.ModuleMapPath << NotImported; 3954 return OutOfDate; 3955 } 3956 3957 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3958 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3959 // FIXME: we should use input files rather than storing names. 3960 std::string Filename = ReadPath(F, Record, Idx); 3961 auto SF = FileMgr.getFile(Filename, false, false); 3962 if (!SF) { 3963 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3964 Error("could not find file '" + Filename +"' referenced by AST file"); 3965 return OutOfDate; 3966 } 3967 AdditionalStoredMaps.insert(*SF); 3968 } 3969 3970 // Check any additional module map files (e.g. module.private.modulemap) 3971 // that are not in the pcm. 3972 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3973 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3974 // Remove files that match 3975 // Note: SmallPtrSet::erase is really remove 3976 if (!AdditionalStoredMaps.erase(ModMap)) { 3977 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3978 Diag(diag::err_module_different_modmap) 3979 << F.ModuleName << /*new*/0 << ModMap->getName(); 3980 return OutOfDate; 3981 } 3982 } 3983 } 3984 3985 // Check any additional module map files that are in the pcm, but not 3986 // found in header search. Cases that match are already removed. 3987 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3988 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3989 Diag(diag::err_module_different_modmap) 3990 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3991 return OutOfDate; 3992 } 3993 } 3994 3995 if (Listener) 3996 Listener->ReadModuleMapFile(F.ModuleMapPath); 3997 return Success; 3998 } 3999 4000 /// Move the given method to the back of the global list of methods. 4001 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4002 // Find the entry for this selector in the method pool. 4003 Sema::GlobalMethodPool::iterator Known 4004 = S.MethodPool.find(Method->getSelector()); 4005 if (Known == S.MethodPool.end()) 4006 return; 4007 4008 // Retrieve the appropriate method list. 4009 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4010 : Known->second.second; 4011 bool Found = false; 4012 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4013 if (!Found) { 4014 if (List->getMethod() == Method) { 4015 Found = true; 4016 } else { 4017 // Keep searching. 4018 continue; 4019 } 4020 } 4021 4022 if (List->getNext()) 4023 List->setMethod(List->getNext()->getMethod()); 4024 else 4025 List->setMethod(Method); 4026 } 4027 } 4028 4029 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4030 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4031 for (Decl *D : Names) { 4032 bool wasHidden = !D->isUnconditionallyVisible(); 4033 D->setVisibleDespiteOwningModule(); 4034 4035 if (wasHidden && SemaObj) { 4036 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4037 moveMethodToBackOfGlobalList(*SemaObj, Method); 4038 } 4039 } 4040 } 4041 } 4042 4043 void ASTReader::makeModuleVisible(Module *Mod, 4044 Module::NameVisibilityKind NameVisibility, 4045 SourceLocation ImportLoc) { 4046 llvm::SmallPtrSet<Module *, 4> Visited; 4047 SmallVector<Module *, 4> Stack; 4048 Stack.push_back(Mod); 4049 while (!Stack.empty()) { 4050 Mod = Stack.pop_back_val(); 4051 4052 if (NameVisibility <= Mod->NameVisibility) { 4053 // This module already has this level of visibility (or greater), so 4054 // there is nothing more to do. 4055 continue; 4056 } 4057 4058 if (Mod->isUnimportable()) { 4059 // Modules that aren't importable cannot be made visible. 4060 continue; 4061 } 4062 4063 // Update the module's name visibility. 4064 Mod->NameVisibility = NameVisibility; 4065 4066 // If we've already deserialized any names from this module, 4067 // mark them as visible. 4068 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4069 if (Hidden != HiddenNamesMap.end()) { 4070 auto HiddenNames = std::move(*Hidden); 4071 HiddenNamesMap.erase(Hidden); 4072 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4073 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4074 "making names visible added hidden names"); 4075 } 4076 4077 // Push any exported modules onto the stack to be marked as visible. 4078 SmallVector<Module *, 16> Exports; 4079 Mod->getExportedModules(Exports); 4080 for (SmallVectorImpl<Module *>::iterator 4081 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4082 Module *Exported = *I; 4083 if (Visited.insert(Exported).second) 4084 Stack.push_back(Exported); 4085 } 4086 } 4087 } 4088 4089 /// We've merged the definition \p MergedDef into the existing definition 4090 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4091 /// visible. 4092 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4093 NamedDecl *MergedDef) { 4094 if (!Def->isUnconditionallyVisible()) { 4095 // If MergedDef is visible or becomes visible, make the definition visible. 4096 if (MergedDef->isUnconditionallyVisible()) 4097 Def->setVisibleDespiteOwningModule(); 4098 else { 4099 getContext().mergeDefinitionIntoModule( 4100 Def, MergedDef->getImportedOwningModule(), 4101 /*NotifyListeners*/ false); 4102 PendingMergedDefinitionsToDeduplicate.insert(Def); 4103 } 4104 } 4105 } 4106 4107 bool ASTReader::loadGlobalIndex() { 4108 if (GlobalIndex) 4109 return false; 4110 4111 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4112 !PP.getLangOpts().Modules) 4113 return true; 4114 4115 // Try to load the global index. 4116 TriedLoadingGlobalIndex = true; 4117 StringRef ModuleCachePath 4118 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4119 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4120 GlobalModuleIndex::readIndex(ModuleCachePath); 4121 if (llvm::Error Err = std::move(Result.second)) { 4122 assert(!Result.first); 4123 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4124 return true; 4125 } 4126 4127 GlobalIndex.reset(Result.first); 4128 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4129 return false; 4130 } 4131 4132 bool ASTReader::isGlobalIndexUnavailable() const { 4133 return PP.getLangOpts().Modules && UseGlobalIndex && 4134 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4135 } 4136 4137 static void updateModuleTimestamp(ModuleFile &MF) { 4138 // Overwrite the timestamp file contents so that file's mtime changes. 4139 std::string TimestampFilename = MF.getTimestampFilename(); 4140 std::error_code EC; 4141 llvm::raw_fd_ostream OS(TimestampFilename, EC, 4142 llvm::sys::fs::OF_TextWithCRLF); 4143 if (EC) 4144 return; 4145 OS << "Timestamp file\n"; 4146 OS.close(); 4147 OS.clear_error(); // Avoid triggering a fatal error. 4148 } 4149 4150 /// Given a cursor at the start of an AST file, scan ahead and drop the 4151 /// cursor into the start of the given block ID, returning false on success and 4152 /// true on failure. 4153 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4154 while (true) { 4155 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4156 if (!MaybeEntry) { 4157 // FIXME this drops errors on the floor. 4158 consumeError(MaybeEntry.takeError()); 4159 return true; 4160 } 4161 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4162 4163 switch (Entry.Kind) { 4164 case llvm::BitstreamEntry::Error: 4165 case llvm::BitstreamEntry::EndBlock: 4166 return true; 4167 4168 case llvm::BitstreamEntry::Record: 4169 // Ignore top-level records. 4170 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4171 break; 4172 else { 4173 // FIXME this drops errors on the floor. 4174 consumeError(Skipped.takeError()); 4175 return true; 4176 } 4177 4178 case llvm::BitstreamEntry::SubBlock: 4179 if (Entry.ID == BlockID) { 4180 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4181 // FIXME this drops the error on the floor. 4182 consumeError(std::move(Err)); 4183 return true; 4184 } 4185 // Found it! 4186 return false; 4187 } 4188 4189 if (llvm::Error Err = Cursor.SkipBlock()) { 4190 // FIXME this drops the error on the floor. 4191 consumeError(std::move(Err)); 4192 return true; 4193 } 4194 } 4195 } 4196 } 4197 4198 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4199 ModuleKind Type, 4200 SourceLocation ImportLoc, 4201 unsigned ClientLoadCapabilities, 4202 SmallVectorImpl<ImportedSubmodule> *Imported) { 4203 llvm::SaveAndRestore<SourceLocation> 4204 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4205 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII( 4206 CurrentDeserializingModuleKind, Type); 4207 4208 // Defer any pending actions until we get to the end of reading the AST file. 4209 Deserializing AnASTFile(this); 4210 4211 // Bump the generation number. 4212 unsigned PreviousGeneration = 0; 4213 if (ContextObj) 4214 PreviousGeneration = incrementGeneration(*ContextObj); 4215 4216 unsigned NumModules = ModuleMgr.size(); 4217 SmallVector<ImportedModule, 4> Loaded; 4218 if (ASTReadResult ReadResult = 4219 ReadASTCore(FileName, Type, ImportLoc, 4220 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(), 4221 ClientLoadCapabilities)) { 4222 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4223 PP.getLangOpts().Modules 4224 ? &PP.getHeaderSearchInfo().getModuleMap() 4225 : nullptr); 4226 4227 // If we find that any modules are unusable, the global index is going 4228 // to be out-of-date. Just remove it. 4229 GlobalIndex.reset(); 4230 ModuleMgr.setGlobalIndex(nullptr); 4231 return ReadResult; 4232 } 4233 4234 // Here comes stuff that we only do once the entire chain is loaded. Do *not* 4235 // remove modules from this point. Various fields are updated during reading 4236 // the AST block and removing the modules would result in dangling pointers. 4237 // They are generally only incidentally dereferenced, ie. a binary search 4238 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to 4239 // be dereferenced but it wouldn't actually be used. 4240 4241 // Load the AST blocks of all of the modules that we loaded. We can still 4242 // hit errors parsing the ASTs at this point. 4243 for (ImportedModule &M : Loaded) { 4244 ModuleFile &F = *M.Mod; 4245 4246 // Read the AST block. 4247 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) { 4248 Error(std::move(Err)); 4249 return Failure; 4250 } 4251 4252 // The AST block should always have a definition for the main module. 4253 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4254 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4255 return Failure; 4256 } 4257 4258 // Read the extension blocks. 4259 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4260 if (llvm::Error Err = ReadExtensionBlock(F)) { 4261 Error(std::move(Err)); 4262 return Failure; 4263 } 4264 } 4265 4266 // Once read, set the ModuleFile bit base offset and update the size in 4267 // bits of all files we've seen. 4268 F.GlobalBitOffset = TotalModulesSizeInBits; 4269 TotalModulesSizeInBits += F.SizeInBits; 4270 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4271 } 4272 4273 // Preload source locations and interesting indentifiers. 4274 for (ImportedModule &M : Loaded) { 4275 ModuleFile &F = *M.Mod; 4276 4277 // Preload SLocEntries. 4278 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4279 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4280 // Load it through the SourceManager and don't call ReadSLocEntry() 4281 // directly because the entry may have already been loaded in which case 4282 // calling ReadSLocEntry() directly would trigger an assertion in 4283 // SourceManager. 4284 SourceMgr.getLoadedSLocEntryByID(Index); 4285 } 4286 4287 // Map the original source file ID into the ID space of the current 4288 // compilation. 4289 if (F.OriginalSourceFileID.isValid()) { 4290 F.OriginalSourceFileID = FileID::get( 4291 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4292 } 4293 4294 // Preload all the pending interesting identifiers by marking them out of 4295 // date. 4296 for (auto Offset : F.PreloadIdentifierOffsets) { 4297 const unsigned char *Data = F.IdentifierTableData + Offset; 4298 4299 ASTIdentifierLookupTrait Trait(*this, F); 4300 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4301 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4302 auto &II = PP.getIdentifierTable().getOwn(Key); 4303 II.setOutOfDate(true); 4304 4305 // Mark this identifier as being from an AST file so that we can track 4306 // whether we need to serialize it. 4307 markIdentifierFromAST(*this, II); 4308 4309 // Associate the ID with the identifier so that the writer can reuse it. 4310 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4311 SetIdentifierInfo(ID, &II); 4312 } 4313 } 4314 4315 // Setup the import locations and notify the module manager that we've 4316 // committed to these module files. 4317 for (ImportedModule &M : Loaded) { 4318 ModuleFile &F = *M.Mod; 4319 4320 ModuleMgr.moduleFileAccepted(&F); 4321 4322 // Set the import location. 4323 F.DirectImportLoc = ImportLoc; 4324 // FIXME: We assume that locations from PCH / preamble do not need 4325 // any translation. 4326 if (!M.ImportedBy) 4327 F.ImportLoc = M.ImportLoc; 4328 else 4329 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4330 } 4331 4332 if (!PP.getLangOpts().CPlusPlus || 4333 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4334 Type != MK_PrebuiltModule)) { 4335 // Mark all of the identifiers in the identifier table as being out of date, 4336 // so that various accessors know to check the loaded modules when the 4337 // identifier is used. 4338 // 4339 // For C++ modules, we don't need information on many identifiers (just 4340 // those that provide macros or are poisoned), so we mark all of 4341 // the interesting ones via PreloadIdentifierOffsets. 4342 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4343 IdEnd = PP.getIdentifierTable().end(); 4344 Id != IdEnd; ++Id) 4345 Id->second->setOutOfDate(true); 4346 } 4347 // Mark selectors as out of date. 4348 for (auto Sel : SelectorGeneration) 4349 SelectorOutOfDate[Sel.first] = true; 4350 4351 // Resolve any unresolved module exports. 4352 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4353 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4354 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4355 Module *ResolvedMod = getSubmodule(GlobalID); 4356 4357 switch (Unresolved.Kind) { 4358 case UnresolvedModuleRef::Conflict: 4359 if (ResolvedMod) { 4360 Module::Conflict Conflict; 4361 Conflict.Other = ResolvedMod; 4362 Conflict.Message = Unresolved.String.str(); 4363 Unresolved.Mod->Conflicts.push_back(Conflict); 4364 } 4365 continue; 4366 4367 case UnresolvedModuleRef::Import: 4368 if (ResolvedMod) 4369 Unresolved.Mod->Imports.insert(ResolvedMod); 4370 continue; 4371 4372 case UnresolvedModuleRef::Export: 4373 if (ResolvedMod || Unresolved.IsWildcard) 4374 Unresolved.Mod->Exports.push_back( 4375 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4376 continue; 4377 } 4378 } 4379 UnresolvedModuleRefs.clear(); 4380 4381 if (Imported) 4382 Imported->append(ImportedModules.begin(), 4383 ImportedModules.end()); 4384 4385 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4386 // Might be unnecessary as use declarations are only used to build the 4387 // module itself. 4388 4389 if (ContextObj) 4390 InitializeContext(); 4391 4392 if (SemaObj) 4393 UpdateSema(); 4394 4395 if (DeserializationListener) 4396 DeserializationListener->ReaderInitialized(this); 4397 4398 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4399 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4400 // If this AST file is a precompiled preamble, then set the 4401 // preamble file ID of the source manager to the file source file 4402 // from which the preamble was built. 4403 if (Type == MK_Preamble) { 4404 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4405 } else if (Type == MK_MainFile) { 4406 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4407 } 4408 } 4409 4410 // For any Objective-C class definitions we have already loaded, make sure 4411 // that we load any additional categories. 4412 if (ContextObj) { 4413 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4414 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4415 ObjCClassesLoaded[I], 4416 PreviousGeneration); 4417 } 4418 } 4419 4420 if (PP.getHeaderSearchInfo() 4421 .getHeaderSearchOpts() 4422 .ModulesValidateOncePerBuildSession) { 4423 // Now we are certain that the module and all modules it depends on are 4424 // up to date. Create or update timestamp files for modules that are 4425 // located in the module cache (not for PCH files that could be anywhere 4426 // in the filesystem). 4427 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4428 ImportedModule &M = Loaded[I]; 4429 if (M.Mod->Kind == MK_ImplicitModule) { 4430 updateModuleTimestamp(*M.Mod); 4431 } 4432 } 4433 } 4434 4435 return Success; 4436 } 4437 4438 static ASTFileSignature readASTFileSignature(StringRef PCH); 4439 4440 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4441 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4442 // FIXME checking magic headers is done in other places such as 4443 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4444 // always done the same. Unify it all with a helper. 4445 if (!Stream.canSkipToPos(4)) 4446 return llvm::createStringError(std::errc::illegal_byte_sequence, 4447 "file too small to contain AST file magic"); 4448 for (unsigned C : {'C', 'P', 'C', 'H'}) 4449 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4450 if (Res.get() != C) 4451 return llvm::createStringError( 4452 std::errc::illegal_byte_sequence, 4453 "file doesn't start with AST file magic"); 4454 } else 4455 return Res.takeError(); 4456 return llvm::Error::success(); 4457 } 4458 4459 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4460 switch (Kind) { 4461 case MK_PCH: 4462 return 0; // PCH 4463 case MK_ImplicitModule: 4464 case MK_ExplicitModule: 4465 case MK_PrebuiltModule: 4466 return 1; // module 4467 case MK_MainFile: 4468 case MK_Preamble: 4469 return 2; // main source file 4470 } 4471 llvm_unreachable("unknown module kind"); 4472 } 4473 4474 ASTReader::ASTReadResult 4475 ASTReader::ReadASTCore(StringRef FileName, 4476 ModuleKind Type, 4477 SourceLocation ImportLoc, 4478 ModuleFile *ImportedBy, 4479 SmallVectorImpl<ImportedModule> &Loaded, 4480 off_t ExpectedSize, time_t ExpectedModTime, 4481 ASTFileSignature ExpectedSignature, 4482 unsigned ClientLoadCapabilities) { 4483 ModuleFile *M; 4484 std::string ErrorStr; 4485 ModuleManager::AddModuleResult AddResult 4486 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4487 getGeneration(), ExpectedSize, ExpectedModTime, 4488 ExpectedSignature, readASTFileSignature, 4489 M, ErrorStr); 4490 4491 switch (AddResult) { 4492 case ModuleManager::AlreadyLoaded: 4493 Diag(diag::remark_module_import) 4494 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4495 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4496 return Success; 4497 4498 case ModuleManager::NewlyLoaded: 4499 // Load module file below. 4500 break; 4501 4502 case ModuleManager::Missing: 4503 // The module file was missing; if the client can handle that, return 4504 // it. 4505 if (ClientLoadCapabilities & ARR_Missing) 4506 return Missing; 4507 4508 // Otherwise, return an error. 4509 Diag(diag::err_ast_file_not_found) 4510 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4511 << ErrorStr; 4512 return Failure; 4513 4514 case ModuleManager::OutOfDate: 4515 // We couldn't load the module file because it is out-of-date. If the 4516 // client can handle out-of-date, return it. 4517 if (ClientLoadCapabilities & ARR_OutOfDate) 4518 return OutOfDate; 4519 4520 // Otherwise, return an error. 4521 Diag(diag::err_ast_file_out_of_date) 4522 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4523 << ErrorStr; 4524 return Failure; 4525 } 4526 4527 assert(M && "Missing module file"); 4528 4529 bool ShouldFinalizePCM = false; 4530 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4531 auto &MC = getModuleManager().getModuleCache(); 4532 if (ShouldFinalizePCM) 4533 MC.finalizePCM(FileName); 4534 else 4535 MC.tryToDropPCM(FileName); 4536 }); 4537 ModuleFile &F = *M; 4538 BitstreamCursor &Stream = F.Stream; 4539 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4540 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4541 4542 // Sniff for the signature. 4543 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4544 Diag(diag::err_ast_file_invalid) 4545 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4546 return Failure; 4547 } 4548 4549 // This is used for compatibility with older PCH formats. 4550 bool HaveReadControlBlock = false; 4551 while (true) { 4552 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4553 if (!MaybeEntry) { 4554 Error(MaybeEntry.takeError()); 4555 return Failure; 4556 } 4557 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4558 4559 switch (Entry.Kind) { 4560 case llvm::BitstreamEntry::Error: 4561 case llvm::BitstreamEntry::Record: 4562 case llvm::BitstreamEntry::EndBlock: 4563 Error("invalid record at top-level of AST file"); 4564 return Failure; 4565 4566 case llvm::BitstreamEntry::SubBlock: 4567 break; 4568 } 4569 4570 switch (Entry.ID) { 4571 case CONTROL_BLOCK_ID: 4572 HaveReadControlBlock = true; 4573 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4574 case Success: 4575 // Check that we didn't try to load a non-module AST file as a module. 4576 // 4577 // FIXME: Should we also perform the converse check? Loading a module as 4578 // a PCH file sort of works, but it's a bit wonky. 4579 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4580 Type == MK_PrebuiltModule) && 4581 F.ModuleName.empty()) { 4582 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4583 if (Result != OutOfDate || 4584 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4585 Diag(diag::err_module_file_not_module) << FileName; 4586 return Result; 4587 } 4588 break; 4589 4590 case Failure: return Failure; 4591 case Missing: return Missing; 4592 case OutOfDate: return OutOfDate; 4593 case VersionMismatch: return VersionMismatch; 4594 case ConfigurationMismatch: return ConfigurationMismatch; 4595 case HadErrors: return HadErrors; 4596 } 4597 break; 4598 4599 case AST_BLOCK_ID: 4600 if (!HaveReadControlBlock) { 4601 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4602 Diag(diag::err_pch_version_too_old); 4603 return VersionMismatch; 4604 } 4605 4606 // Record that we've loaded this module. 4607 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4608 ShouldFinalizePCM = true; 4609 return Success; 4610 4611 case UNHASHED_CONTROL_BLOCK_ID: 4612 // This block is handled using look-ahead during ReadControlBlock. We 4613 // shouldn't get here! 4614 Error("malformed block record in AST file"); 4615 return Failure; 4616 4617 default: 4618 if (llvm::Error Err = Stream.SkipBlock()) { 4619 Error(std::move(Err)); 4620 return Failure; 4621 } 4622 break; 4623 } 4624 } 4625 4626 llvm_unreachable("unexpected break; expected return"); 4627 } 4628 4629 ASTReader::ASTReadResult 4630 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4631 unsigned ClientLoadCapabilities) { 4632 const HeaderSearchOptions &HSOpts = 4633 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4634 bool AllowCompatibleConfigurationMismatch = 4635 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4636 bool DisableValidation = shouldDisableValidationForFile(F); 4637 4638 ASTReadResult Result = readUnhashedControlBlockImpl( 4639 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4640 Listener.get(), 4641 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4642 4643 // If F was directly imported by another module, it's implicitly validated by 4644 // the importing module. 4645 if (DisableValidation || WasImportedBy || 4646 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4647 return Success; 4648 4649 if (Result == Failure) { 4650 Error("malformed block record in AST file"); 4651 return Failure; 4652 } 4653 4654 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4655 // If this module has already been finalized in the ModuleCache, we're stuck 4656 // with it; we can only load a single version of each module. 4657 // 4658 // This can happen when a module is imported in two contexts: in one, as a 4659 // user module; in another, as a system module (due to an import from 4660 // another module marked with the [system] flag). It usually indicates a 4661 // bug in the module map: this module should also be marked with [system]. 4662 // 4663 // If -Wno-system-headers (the default), and the first import is as a 4664 // system module, then validation will fail during the as-user import, 4665 // since -Werror flags won't have been validated. However, it's reasonable 4666 // to treat this consistently as a system module. 4667 // 4668 // If -Wsystem-headers, the PCM on disk was built with 4669 // -Wno-system-headers, and the first import is as a user module, then 4670 // validation will fail during the as-system import since the PCM on disk 4671 // doesn't guarantee that -Werror was respected. However, the -Werror 4672 // flags were checked during the initial as-user import. 4673 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4674 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4675 return Success; 4676 } 4677 } 4678 4679 return Result; 4680 } 4681 4682 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4683 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4684 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4685 bool ValidateDiagnosticOptions) { 4686 // Initialize a stream. 4687 BitstreamCursor Stream(StreamData); 4688 4689 // Sniff for the signature. 4690 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4691 // FIXME this drops the error on the floor. 4692 consumeError(std::move(Err)); 4693 return Failure; 4694 } 4695 4696 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4697 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4698 return Failure; 4699 4700 // Read all of the records in the options block. 4701 RecordData Record; 4702 ASTReadResult Result = Success; 4703 while (true) { 4704 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4705 if (!MaybeEntry) { 4706 // FIXME this drops the error on the floor. 4707 consumeError(MaybeEntry.takeError()); 4708 return Failure; 4709 } 4710 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4711 4712 switch (Entry.Kind) { 4713 case llvm::BitstreamEntry::Error: 4714 case llvm::BitstreamEntry::SubBlock: 4715 return Failure; 4716 4717 case llvm::BitstreamEntry::EndBlock: 4718 return Result; 4719 4720 case llvm::BitstreamEntry::Record: 4721 // The interesting case. 4722 break; 4723 } 4724 4725 // Read and process a record. 4726 Record.clear(); 4727 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4728 if (!MaybeRecordType) { 4729 // FIXME this drops the error. 4730 return Failure; 4731 } 4732 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4733 case SIGNATURE: 4734 if (F) 4735 F->Signature = ASTFileSignature::create(Record.begin(), Record.end()); 4736 break; 4737 case AST_BLOCK_HASH: 4738 if (F) 4739 F->ASTBlockHash = 4740 ASTFileSignature::create(Record.begin(), Record.end()); 4741 break; 4742 case DIAGNOSTIC_OPTIONS: { 4743 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4744 if (Listener && ValidateDiagnosticOptions && 4745 !AllowCompatibleConfigurationMismatch && 4746 ParseDiagnosticOptions(Record, Complain, *Listener)) 4747 Result = OutOfDate; // Don't return early. Read the signature. 4748 break; 4749 } 4750 case DIAG_PRAGMA_MAPPINGS: 4751 if (!F) 4752 break; 4753 if (F->PragmaDiagMappings.empty()) 4754 F->PragmaDiagMappings.swap(Record); 4755 else 4756 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4757 Record.begin(), Record.end()); 4758 break; 4759 } 4760 } 4761 } 4762 4763 /// Parse a record and blob containing module file extension metadata. 4764 static bool parseModuleFileExtensionMetadata( 4765 const SmallVectorImpl<uint64_t> &Record, 4766 StringRef Blob, 4767 ModuleFileExtensionMetadata &Metadata) { 4768 if (Record.size() < 4) return true; 4769 4770 Metadata.MajorVersion = Record[0]; 4771 Metadata.MinorVersion = Record[1]; 4772 4773 unsigned BlockNameLen = Record[2]; 4774 unsigned UserInfoLen = Record[3]; 4775 4776 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4777 4778 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4779 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4780 Blob.data() + BlockNameLen + UserInfoLen); 4781 return false; 4782 } 4783 4784 llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) { 4785 BitstreamCursor &Stream = F.Stream; 4786 4787 RecordData Record; 4788 while (true) { 4789 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4790 if (!MaybeEntry) 4791 return MaybeEntry.takeError(); 4792 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4793 4794 switch (Entry.Kind) { 4795 case llvm::BitstreamEntry::SubBlock: 4796 if (llvm::Error Err = Stream.SkipBlock()) 4797 return Err; 4798 continue; 4799 case llvm::BitstreamEntry::EndBlock: 4800 return llvm::Error::success(); 4801 case llvm::BitstreamEntry::Error: 4802 return llvm::createStringError(std::errc::illegal_byte_sequence, 4803 "malformed block record in AST file"); 4804 case llvm::BitstreamEntry::Record: 4805 break; 4806 } 4807 4808 Record.clear(); 4809 StringRef Blob; 4810 Expected<unsigned> MaybeRecCode = 4811 Stream.readRecord(Entry.ID, Record, &Blob); 4812 if (!MaybeRecCode) 4813 return MaybeRecCode.takeError(); 4814 switch (MaybeRecCode.get()) { 4815 case EXTENSION_METADATA: { 4816 ModuleFileExtensionMetadata Metadata; 4817 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 4818 return llvm::createStringError( 4819 std::errc::illegal_byte_sequence, 4820 "malformed EXTENSION_METADATA in AST file"); 4821 4822 // Find a module file extension with this block name. 4823 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4824 if (Known == ModuleFileExtensions.end()) break; 4825 4826 // Form a reader. 4827 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4828 F, Stream)) { 4829 F.ExtensionReaders.push_back(std::move(Reader)); 4830 } 4831 4832 break; 4833 } 4834 } 4835 } 4836 4837 return llvm::Error::success(); 4838 } 4839 4840 void ASTReader::InitializeContext() { 4841 assert(ContextObj && "no context to initialize"); 4842 ASTContext &Context = *ContextObj; 4843 4844 // If there's a listener, notify them that we "read" the translation unit. 4845 if (DeserializationListener) 4846 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4847 Context.getTranslationUnitDecl()); 4848 4849 // FIXME: Find a better way to deal with collisions between these 4850 // built-in types. Right now, we just ignore the problem. 4851 4852 // Load the special types. 4853 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4854 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4855 if (!Context.CFConstantStringTypeDecl) 4856 Context.setCFConstantStringType(GetType(String)); 4857 } 4858 4859 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4860 QualType FileType = GetType(File); 4861 if (FileType.isNull()) { 4862 Error("FILE type is NULL"); 4863 return; 4864 } 4865 4866 if (!Context.FILEDecl) { 4867 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4868 Context.setFILEDecl(Typedef->getDecl()); 4869 else { 4870 const TagType *Tag = FileType->getAs<TagType>(); 4871 if (!Tag) { 4872 Error("Invalid FILE type in AST file"); 4873 return; 4874 } 4875 Context.setFILEDecl(Tag->getDecl()); 4876 } 4877 } 4878 } 4879 4880 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4881 QualType Jmp_bufType = GetType(Jmp_buf); 4882 if (Jmp_bufType.isNull()) { 4883 Error("jmp_buf type is NULL"); 4884 return; 4885 } 4886 4887 if (!Context.jmp_bufDecl) { 4888 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4889 Context.setjmp_bufDecl(Typedef->getDecl()); 4890 else { 4891 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4892 if (!Tag) { 4893 Error("Invalid jmp_buf type in AST file"); 4894 return; 4895 } 4896 Context.setjmp_bufDecl(Tag->getDecl()); 4897 } 4898 } 4899 } 4900 4901 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4902 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4903 if (Sigjmp_bufType.isNull()) { 4904 Error("sigjmp_buf type is NULL"); 4905 return; 4906 } 4907 4908 if (!Context.sigjmp_bufDecl) { 4909 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4910 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4911 else { 4912 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4913 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4914 Context.setsigjmp_bufDecl(Tag->getDecl()); 4915 } 4916 } 4917 } 4918 4919 if (unsigned ObjCIdRedef 4920 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4921 if (Context.ObjCIdRedefinitionType.isNull()) 4922 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4923 } 4924 4925 if (unsigned ObjCClassRedef 4926 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4927 if (Context.ObjCClassRedefinitionType.isNull()) 4928 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4929 } 4930 4931 if (unsigned ObjCSelRedef 4932 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4933 if (Context.ObjCSelRedefinitionType.isNull()) 4934 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4935 } 4936 4937 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4938 QualType Ucontext_tType = GetType(Ucontext_t); 4939 if (Ucontext_tType.isNull()) { 4940 Error("ucontext_t type is NULL"); 4941 return; 4942 } 4943 4944 if (!Context.ucontext_tDecl) { 4945 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4946 Context.setucontext_tDecl(Typedef->getDecl()); 4947 else { 4948 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4949 assert(Tag && "Invalid ucontext_t type in AST file"); 4950 Context.setucontext_tDecl(Tag->getDecl()); 4951 } 4952 } 4953 } 4954 } 4955 4956 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4957 4958 // If there were any CUDA special declarations, deserialize them. 4959 if (!CUDASpecialDeclRefs.empty()) { 4960 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4961 Context.setcudaConfigureCallDecl( 4962 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4963 } 4964 4965 // Re-export any modules that were imported by a non-module AST file. 4966 // FIXME: This does not make macro-only imports visible again. 4967 for (auto &Import : ImportedModules) { 4968 if (Module *Imported = getSubmodule(Import.ID)) { 4969 makeModuleVisible(Imported, Module::AllVisible, 4970 /*ImportLoc=*/Import.ImportLoc); 4971 if (Import.ImportLoc.isValid()) 4972 PP.makeModuleVisible(Imported, Import.ImportLoc); 4973 // This updates visibility for Preprocessor only. For Sema, which can be 4974 // nullptr here, we do the same later, in UpdateSema(). 4975 } 4976 } 4977 } 4978 4979 void ASTReader::finalizeForWriting() { 4980 // Nothing to do for now. 4981 } 4982 4983 /// Reads and return the signature record from \p PCH's control block, or 4984 /// else returns 0. 4985 static ASTFileSignature readASTFileSignature(StringRef PCH) { 4986 BitstreamCursor Stream(PCH); 4987 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4988 // FIXME this drops the error on the floor. 4989 consumeError(std::move(Err)); 4990 return ASTFileSignature(); 4991 } 4992 4993 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4994 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4995 return ASTFileSignature(); 4996 4997 // Scan for SIGNATURE inside the diagnostic options block. 4998 ASTReader::RecordData Record; 4999 while (true) { 5000 Expected<llvm::BitstreamEntry> MaybeEntry = 5001 Stream.advanceSkippingSubblocks(); 5002 if (!MaybeEntry) { 5003 // FIXME this drops the error on the floor. 5004 consumeError(MaybeEntry.takeError()); 5005 return ASTFileSignature(); 5006 } 5007 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5008 5009 if (Entry.Kind != llvm::BitstreamEntry::Record) 5010 return ASTFileSignature(); 5011 5012 Record.clear(); 5013 StringRef Blob; 5014 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5015 if (!MaybeRecord) { 5016 // FIXME this drops the error on the floor. 5017 consumeError(MaybeRecord.takeError()); 5018 return ASTFileSignature(); 5019 } 5020 if (SIGNATURE == MaybeRecord.get()) 5021 return ASTFileSignature::create(Record.begin(), 5022 Record.begin() + ASTFileSignature::size); 5023 } 5024 } 5025 5026 /// Retrieve the name of the original source file name 5027 /// directly from the AST file, without actually loading the AST 5028 /// file. 5029 std::string ASTReader::getOriginalSourceFile( 5030 const std::string &ASTFileName, FileManager &FileMgr, 5031 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5032 // Open the AST file. 5033 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5034 if (!Buffer) { 5035 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5036 << ASTFileName << Buffer.getError().message(); 5037 return std::string(); 5038 } 5039 5040 // Initialize the stream 5041 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5042 5043 // Sniff for the signature. 5044 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5045 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5046 return std::string(); 5047 } 5048 5049 // Scan for the CONTROL_BLOCK_ID block. 5050 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5051 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5052 return std::string(); 5053 } 5054 5055 // Scan for ORIGINAL_FILE inside the control block. 5056 RecordData Record; 5057 while (true) { 5058 Expected<llvm::BitstreamEntry> MaybeEntry = 5059 Stream.advanceSkippingSubblocks(); 5060 if (!MaybeEntry) { 5061 // FIXME this drops errors on the floor. 5062 consumeError(MaybeEntry.takeError()); 5063 return std::string(); 5064 } 5065 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5066 5067 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5068 return std::string(); 5069 5070 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5071 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5072 return std::string(); 5073 } 5074 5075 Record.clear(); 5076 StringRef Blob; 5077 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5078 if (!MaybeRecord) { 5079 // FIXME this drops the errors on the floor. 5080 consumeError(MaybeRecord.takeError()); 5081 return std::string(); 5082 } 5083 if (ORIGINAL_FILE == MaybeRecord.get()) 5084 return Blob.str(); 5085 } 5086 } 5087 5088 namespace { 5089 5090 class SimplePCHValidator : public ASTReaderListener { 5091 const LangOptions &ExistingLangOpts; 5092 const TargetOptions &ExistingTargetOpts; 5093 const PreprocessorOptions &ExistingPPOpts; 5094 std::string ExistingModuleCachePath; 5095 FileManager &FileMgr; 5096 5097 public: 5098 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5099 const TargetOptions &ExistingTargetOpts, 5100 const PreprocessorOptions &ExistingPPOpts, 5101 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5102 : ExistingLangOpts(ExistingLangOpts), 5103 ExistingTargetOpts(ExistingTargetOpts), 5104 ExistingPPOpts(ExistingPPOpts), 5105 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5106 5107 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5108 bool AllowCompatibleDifferences) override { 5109 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5110 AllowCompatibleDifferences); 5111 } 5112 5113 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5114 bool AllowCompatibleDifferences) override { 5115 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5116 AllowCompatibleDifferences); 5117 } 5118 5119 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5120 StringRef SpecificModuleCachePath, 5121 bool Complain) override { 5122 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5123 ExistingModuleCachePath, nullptr, 5124 ExistingLangOpts, ExistingPPOpts); 5125 } 5126 5127 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5128 bool Complain, 5129 std::string &SuggestedPredefines) override { 5130 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5131 SuggestedPredefines, ExistingLangOpts); 5132 } 5133 }; 5134 5135 } // namespace 5136 5137 bool ASTReader::readASTFileControlBlock( 5138 StringRef Filename, FileManager &FileMgr, 5139 const PCHContainerReader &PCHContainerRdr, 5140 bool FindModuleFileExtensions, 5141 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5142 // Open the AST file. 5143 // FIXME: This allows use of the VFS; we do not allow use of the 5144 // VFS when actually loading a module. 5145 auto Buffer = FileMgr.getBufferForFile(Filename); 5146 if (!Buffer) { 5147 return true; 5148 } 5149 5150 // Initialize the stream 5151 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5152 BitstreamCursor Stream(Bytes); 5153 5154 // Sniff for the signature. 5155 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5156 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5157 return true; 5158 } 5159 5160 // Scan for the CONTROL_BLOCK_ID block. 5161 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5162 return true; 5163 5164 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5165 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5166 bool NeedsImports = Listener.needsImportVisitation(); 5167 BitstreamCursor InputFilesCursor; 5168 5169 RecordData Record; 5170 std::string ModuleDir; 5171 bool DoneWithControlBlock = false; 5172 while (!DoneWithControlBlock) { 5173 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5174 if (!MaybeEntry) { 5175 // FIXME this drops the error on the floor. 5176 consumeError(MaybeEntry.takeError()); 5177 return true; 5178 } 5179 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5180 5181 switch (Entry.Kind) { 5182 case llvm::BitstreamEntry::SubBlock: { 5183 switch (Entry.ID) { 5184 case OPTIONS_BLOCK_ID: { 5185 std::string IgnoredSuggestedPredefines; 5186 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5187 /*AllowCompatibleConfigurationMismatch*/ false, 5188 Listener, IgnoredSuggestedPredefines) != Success) 5189 return true; 5190 break; 5191 } 5192 5193 case INPUT_FILES_BLOCK_ID: 5194 InputFilesCursor = Stream; 5195 if (llvm::Error Err = Stream.SkipBlock()) { 5196 // FIXME this drops the error on the floor. 5197 consumeError(std::move(Err)); 5198 return true; 5199 } 5200 if (NeedsInputFiles && 5201 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5202 return true; 5203 break; 5204 5205 default: 5206 if (llvm::Error Err = Stream.SkipBlock()) { 5207 // FIXME this drops the error on the floor. 5208 consumeError(std::move(Err)); 5209 return true; 5210 } 5211 break; 5212 } 5213 5214 continue; 5215 } 5216 5217 case llvm::BitstreamEntry::EndBlock: 5218 DoneWithControlBlock = true; 5219 break; 5220 5221 case llvm::BitstreamEntry::Error: 5222 return true; 5223 5224 case llvm::BitstreamEntry::Record: 5225 break; 5226 } 5227 5228 if (DoneWithControlBlock) break; 5229 5230 Record.clear(); 5231 StringRef Blob; 5232 Expected<unsigned> MaybeRecCode = 5233 Stream.readRecord(Entry.ID, Record, &Blob); 5234 if (!MaybeRecCode) { 5235 // FIXME this drops the error. 5236 return Failure; 5237 } 5238 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5239 case METADATA: 5240 if (Record[0] != VERSION_MAJOR) 5241 return true; 5242 if (Listener.ReadFullVersionInformation(Blob)) 5243 return true; 5244 break; 5245 case MODULE_NAME: 5246 Listener.ReadModuleName(Blob); 5247 break; 5248 case MODULE_DIRECTORY: 5249 ModuleDir = std::string(Blob); 5250 break; 5251 case MODULE_MAP_FILE: { 5252 unsigned Idx = 0; 5253 auto Path = ReadString(Record, Idx); 5254 ResolveImportedPath(Path, ModuleDir); 5255 Listener.ReadModuleMapFile(Path); 5256 break; 5257 } 5258 case INPUT_FILE_OFFSETS: { 5259 if (!NeedsInputFiles) 5260 break; 5261 5262 unsigned NumInputFiles = Record[0]; 5263 unsigned NumUserFiles = Record[1]; 5264 const llvm::support::unaligned_uint64_t *InputFileOffs = 5265 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5266 for (unsigned I = 0; I != NumInputFiles; ++I) { 5267 // Go find this input file. 5268 bool isSystemFile = I >= NumUserFiles; 5269 5270 if (isSystemFile && !NeedsSystemInputFiles) 5271 break; // the rest are system input files 5272 5273 BitstreamCursor &Cursor = InputFilesCursor; 5274 SavedStreamPosition SavedPosition(Cursor); 5275 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5276 // FIXME this drops errors on the floor. 5277 consumeError(std::move(Err)); 5278 } 5279 5280 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5281 if (!MaybeCode) { 5282 // FIXME this drops errors on the floor. 5283 consumeError(MaybeCode.takeError()); 5284 } 5285 unsigned Code = MaybeCode.get(); 5286 5287 RecordData Record; 5288 StringRef Blob; 5289 bool shouldContinue = false; 5290 Expected<unsigned> MaybeRecordType = 5291 Cursor.readRecord(Code, Record, &Blob); 5292 if (!MaybeRecordType) { 5293 // FIXME this drops errors on the floor. 5294 consumeError(MaybeRecordType.takeError()); 5295 } 5296 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5297 case INPUT_FILE_HASH: 5298 break; 5299 case INPUT_FILE: 5300 bool Overridden = static_cast<bool>(Record[3]); 5301 std::string Filename = std::string(Blob); 5302 ResolveImportedPath(Filename, ModuleDir); 5303 shouldContinue = Listener.visitInputFile( 5304 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5305 break; 5306 } 5307 if (!shouldContinue) 5308 break; 5309 } 5310 break; 5311 } 5312 5313 case IMPORTS: { 5314 if (!NeedsImports) 5315 break; 5316 5317 unsigned Idx = 0, N = Record.size(); 5318 while (Idx < N) { 5319 // Read information about the AST file. 5320 Idx += 5321 1 + 1 + 1 + 1 + 5322 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature 5323 std::string ModuleName = ReadString(Record, Idx); 5324 std::string Filename = ReadString(Record, Idx); 5325 ResolveImportedPath(Filename, ModuleDir); 5326 Listener.visitImport(ModuleName, Filename); 5327 } 5328 break; 5329 } 5330 5331 default: 5332 // No other validation to perform. 5333 break; 5334 } 5335 } 5336 5337 // Look for module file extension blocks, if requested. 5338 if (FindModuleFileExtensions) { 5339 BitstreamCursor SavedStream = Stream; 5340 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5341 bool DoneWithExtensionBlock = false; 5342 while (!DoneWithExtensionBlock) { 5343 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5344 if (!MaybeEntry) { 5345 // FIXME this drops the error. 5346 return true; 5347 } 5348 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5349 5350 switch (Entry.Kind) { 5351 case llvm::BitstreamEntry::SubBlock: 5352 if (llvm::Error Err = Stream.SkipBlock()) { 5353 // FIXME this drops the error on the floor. 5354 consumeError(std::move(Err)); 5355 return true; 5356 } 5357 continue; 5358 5359 case llvm::BitstreamEntry::EndBlock: 5360 DoneWithExtensionBlock = true; 5361 continue; 5362 5363 case llvm::BitstreamEntry::Error: 5364 return true; 5365 5366 case llvm::BitstreamEntry::Record: 5367 break; 5368 } 5369 5370 Record.clear(); 5371 StringRef Blob; 5372 Expected<unsigned> MaybeRecCode = 5373 Stream.readRecord(Entry.ID, Record, &Blob); 5374 if (!MaybeRecCode) { 5375 // FIXME this drops the error. 5376 return true; 5377 } 5378 switch (MaybeRecCode.get()) { 5379 case EXTENSION_METADATA: { 5380 ModuleFileExtensionMetadata Metadata; 5381 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5382 return true; 5383 5384 Listener.readModuleFileExtension(Metadata); 5385 break; 5386 } 5387 } 5388 } 5389 } 5390 Stream = SavedStream; 5391 } 5392 5393 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5394 if (readUnhashedControlBlockImpl( 5395 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5396 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5397 ValidateDiagnosticOptions) != Success) 5398 return true; 5399 5400 return false; 5401 } 5402 5403 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5404 const PCHContainerReader &PCHContainerRdr, 5405 const LangOptions &LangOpts, 5406 const TargetOptions &TargetOpts, 5407 const PreprocessorOptions &PPOpts, 5408 StringRef ExistingModuleCachePath) { 5409 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5410 ExistingModuleCachePath, FileMgr); 5411 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5412 /*FindModuleFileExtensions=*/false, 5413 validator, 5414 /*ValidateDiagnosticOptions=*/true); 5415 } 5416 5417 llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F, 5418 unsigned ClientLoadCapabilities) { 5419 // Enter the submodule block. 5420 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) 5421 return Err; 5422 5423 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5424 bool First = true; 5425 Module *CurrentModule = nullptr; 5426 RecordData Record; 5427 while (true) { 5428 Expected<llvm::BitstreamEntry> MaybeEntry = 5429 F.Stream.advanceSkippingSubblocks(); 5430 if (!MaybeEntry) 5431 return MaybeEntry.takeError(); 5432 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5433 5434 switch (Entry.Kind) { 5435 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5436 case llvm::BitstreamEntry::Error: 5437 return llvm::createStringError(std::errc::illegal_byte_sequence, 5438 "malformed block record in AST file"); 5439 case llvm::BitstreamEntry::EndBlock: 5440 return llvm::Error::success(); 5441 case llvm::BitstreamEntry::Record: 5442 // The interesting case. 5443 break; 5444 } 5445 5446 // Read a record. 5447 StringRef Blob; 5448 Record.clear(); 5449 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5450 if (!MaybeKind) 5451 return MaybeKind.takeError(); 5452 unsigned Kind = MaybeKind.get(); 5453 5454 if ((Kind == SUBMODULE_METADATA) != First) 5455 return llvm::createStringError( 5456 std::errc::illegal_byte_sequence, 5457 "submodule metadata record should be at beginning of block"); 5458 First = false; 5459 5460 // Submodule information is only valid if we have a current module. 5461 // FIXME: Should we error on these cases? 5462 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5463 Kind != SUBMODULE_DEFINITION) 5464 continue; 5465 5466 switch (Kind) { 5467 default: // Default behavior: ignore. 5468 break; 5469 5470 case SUBMODULE_DEFINITION: { 5471 if (Record.size() < 12) 5472 return llvm::createStringError(std::errc::illegal_byte_sequence, 5473 "malformed module definition"); 5474 5475 StringRef Name = Blob; 5476 unsigned Idx = 0; 5477 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5478 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5479 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5480 bool IsFramework = Record[Idx++]; 5481 bool IsExplicit = Record[Idx++]; 5482 bool IsSystem = Record[Idx++]; 5483 bool IsExternC = Record[Idx++]; 5484 bool InferSubmodules = Record[Idx++]; 5485 bool InferExplicitSubmodules = Record[Idx++]; 5486 bool InferExportWildcard = Record[Idx++]; 5487 bool ConfigMacrosExhaustive = Record[Idx++]; 5488 bool ModuleMapIsPrivate = Record[Idx++]; 5489 5490 Module *ParentModule = nullptr; 5491 if (Parent) 5492 ParentModule = getSubmodule(Parent); 5493 5494 // Retrieve this (sub)module from the module map, creating it if 5495 // necessary. 5496 CurrentModule = 5497 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5498 .first; 5499 5500 // FIXME: set the definition loc for CurrentModule, or call 5501 // ModMap.setInferredModuleAllowedBy() 5502 5503 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5504 if (GlobalIndex >= SubmodulesLoaded.size() || 5505 SubmodulesLoaded[GlobalIndex]) 5506 return llvm::createStringError(std::errc::invalid_argument, 5507 "too many submodules"); 5508 5509 if (!ParentModule) { 5510 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5511 // Don't emit module relocation error if we have -fno-validate-pch 5512 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 5513 DisableValidationForModuleKind::Module) && 5514 CurFile != F.File) { 5515 auto ConflictError = 5516 PartialDiagnostic(diag::err_module_file_conflict, 5517 ContextObj->DiagAllocator) 5518 << CurrentModule->getTopLevelModuleName() << CurFile->getName() 5519 << F.File->getName(); 5520 return DiagnosticError::create(CurrentImportLoc, ConflictError); 5521 } 5522 } 5523 5524 F.DidReadTopLevelSubmodule = true; 5525 CurrentModule->setASTFile(F.File); 5526 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5527 } 5528 5529 CurrentModule->Kind = Kind; 5530 CurrentModule->Signature = F.Signature; 5531 CurrentModule->IsFromModuleFile = true; 5532 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5533 CurrentModule->IsExternC = IsExternC; 5534 CurrentModule->InferSubmodules = InferSubmodules; 5535 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5536 CurrentModule->InferExportWildcard = InferExportWildcard; 5537 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5538 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5539 if (DeserializationListener) 5540 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5541 5542 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5543 5544 // Clear out data that will be replaced by what is in the module file. 5545 CurrentModule->LinkLibraries.clear(); 5546 CurrentModule->ConfigMacros.clear(); 5547 CurrentModule->UnresolvedConflicts.clear(); 5548 CurrentModule->Conflicts.clear(); 5549 5550 // The module is available unless it's missing a requirement; relevant 5551 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5552 // Missing headers that were present when the module was built do not 5553 // make it unavailable -- if we got this far, this must be an explicitly 5554 // imported module file. 5555 CurrentModule->Requirements.clear(); 5556 CurrentModule->MissingHeaders.clear(); 5557 CurrentModule->IsUnimportable = 5558 ParentModule && ParentModule->IsUnimportable; 5559 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable; 5560 break; 5561 } 5562 5563 case SUBMODULE_UMBRELLA_HEADER: { 5564 // FIXME: This doesn't work for framework modules as `Filename` is the 5565 // name as written in the module file and does not include 5566 // `Headers/`, so this path will never exist. 5567 std::string Filename = std::string(Blob); 5568 ResolveImportedPath(F, Filename); 5569 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5570 if (!CurrentModule->getUmbrellaHeader()) { 5571 // FIXME: NameAsWritten 5572 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob, ""); 5573 } 5574 // Note that it's too late at this point to return out of date if the 5575 // name from the PCM doesn't match up with the one in the module map, 5576 // but also quite unlikely since we will have already checked the 5577 // modification time and size of the module map file itself. 5578 } 5579 break; 5580 } 5581 5582 case SUBMODULE_HEADER: 5583 case SUBMODULE_EXCLUDED_HEADER: 5584 case SUBMODULE_PRIVATE_HEADER: 5585 // We lazily associate headers with their modules via the HeaderInfo table. 5586 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5587 // of complete filenames or remove it entirely. 5588 break; 5589 5590 case SUBMODULE_TEXTUAL_HEADER: 5591 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5592 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5593 // them here. 5594 break; 5595 5596 case SUBMODULE_TOPHEADER: 5597 CurrentModule->addTopHeaderFilename(Blob); 5598 break; 5599 5600 case SUBMODULE_UMBRELLA_DIR: { 5601 // See comments in SUBMODULE_UMBRELLA_HEADER 5602 std::string Dirname = std::string(Blob); 5603 ResolveImportedPath(F, Dirname); 5604 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5605 if (!CurrentModule->getUmbrellaDir()) { 5606 // FIXME: NameAsWritten 5607 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob, ""); 5608 } 5609 } 5610 break; 5611 } 5612 5613 case SUBMODULE_METADATA: { 5614 F.BaseSubmoduleID = getTotalNumSubmodules(); 5615 F.LocalNumSubmodules = Record[0]; 5616 unsigned LocalBaseSubmoduleID = Record[1]; 5617 if (F.LocalNumSubmodules > 0) { 5618 // Introduce the global -> local mapping for submodules within this 5619 // module. 5620 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5621 5622 // Introduce the local -> global mapping for submodules within this 5623 // module. 5624 F.SubmoduleRemap.insertOrReplace( 5625 std::make_pair(LocalBaseSubmoduleID, 5626 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5627 5628 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5629 } 5630 break; 5631 } 5632 5633 case SUBMODULE_IMPORTS: 5634 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5635 UnresolvedModuleRef Unresolved; 5636 Unresolved.File = &F; 5637 Unresolved.Mod = CurrentModule; 5638 Unresolved.ID = Record[Idx]; 5639 Unresolved.Kind = UnresolvedModuleRef::Import; 5640 Unresolved.IsWildcard = false; 5641 UnresolvedModuleRefs.push_back(Unresolved); 5642 } 5643 break; 5644 5645 case SUBMODULE_EXPORTS: 5646 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5647 UnresolvedModuleRef Unresolved; 5648 Unresolved.File = &F; 5649 Unresolved.Mod = CurrentModule; 5650 Unresolved.ID = Record[Idx]; 5651 Unresolved.Kind = UnresolvedModuleRef::Export; 5652 Unresolved.IsWildcard = Record[Idx + 1]; 5653 UnresolvedModuleRefs.push_back(Unresolved); 5654 } 5655 5656 // Once we've loaded the set of exports, there's no reason to keep 5657 // the parsed, unresolved exports around. 5658 CurrentModule->UnresolvedExports.clear(); 5659 break; 5660 5661 case SUBMODULE_REQUIRES: 5662 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5663 PP.getTargetInfo()); 5664 break; 5665 5666 case SUBMODULE_LINK_LIBRARY: 5667 ModMap.resolveLinkAsDependencies(CurrentModule); 5668 CurrentModule->LinkLibraries.push_back( 5669 Module::LinkLibrary(std::string(Blob), Record[0])); 5670 break; 5671 5672 case SUBMODULE_CONFIG_MACRO: 5673 CurrentModule->ConfigMacros.push_back(Blob.str()); 5674 break; 5675 5676 case SUBMODULE_CONFLICT: { 5677 UnresolvedModuleRef Unresolved; 5678 Unresolved.File = &F; 5679 Unresolved.Mod = CurrentModule; 5680 Unresolved.ID = Record[0]; 5681 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5682 Unresolved.IsWildcard = false; 5683 Unresolved.String = Blob; 5684 UnresolvedModuleRefs.push_back(Unresolved); 5685 break; 5686 } 5687 5688 case SUBMODULE_INITIALIZERS: { 5689 if (!ContextObj) 5690 break; 5691 SmallVector<uint32_t, 16> Inits; 5692 for (auto &ID : Record) 5693 Inits.push_back(getGlobalDeclID(F, ID)); 5694 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5695 break; 5696 } 5697 5698 case SUBMODULE_EXPORT_AS: 5699 CurrentModule->ExportAsModule = Blob.str(); 5700 ModMap.addLinkAsDependency(CurrentModule); 5701 break; 5702 } 5703 } 5704 } 5705 5706 /// Parse the record that corresponds to a LangOptions data 5707 /// structure. 5708 /// 5709 /// This routine parses the language options from the AST file and then gives 5710 /// them to the AST listener if one is set. 5711 /// 5712 /// \returns true if the listener deems the file unacceptable, false otherwise. 5713 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5714 bool Complain, 5715 ASTReaderListener &Listener, 5716 bool AllowCompatibleDifferences) { 5717 LangOptions LangOpts; 5718 unsigned Idx = 0; 5719 #define LANGOPT(Name, Bits, Default, Description) \ 5720 LangOpts.Name = Record[Idx++]; 5721 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5722 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5723 #include "clang/Basic/LangOptions.def" 5724 #define SANITIZER(NAME, ID) \ 5725 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5726 #include "clang/Basic/Sanitizers.def" 5727 5728 for (unsigned N = Record[Idx++]; N; --N) 5729 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5730 5731 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5732 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5733 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5734 5735 LangOpts.CurrentModule = ReadString(Record, Idx); 5736 5737 // Comment options. 5738 for (unsigned N = Record[Idx++]; N; --N) { 5739 LangOpts.CommentOpts.BlockCommandNames.push_back( 5740 ReadString(Record, Idx)); 5741 } 5742 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5743 5744 // OpenMP offloading options. 5745 for (unsigned N = Record[Idx++]; N; --N) { 5746 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5747 } 5748 5749 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5750 5751 return Listener.ReadLanguageOptions(LangOpts, Complain, 5752 AllowCompatibleDifferences); 5753 } 5754 5755 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5756 ASTReaderListener &Listener, 5757 bool AllowCompatibleDifferences) { 5758 unsigned Idx = 0; 5759 TargetOptions TargetOpts; 5760 TargetOpts.Triple = ReadString(Record, Idx); 5761 TargetOpts.CPU = ReadString(Record, Idx); 5762 TargetOpts.TuneCPU = ReadString(Record, Idx); 5763 TargetOpts.ABI = ReadString(Record, Idx); 5764 for (unsigned N = Record[Idx++]; N; --N) { 5765 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5766 } 5767 for (unsigned N = Record[Idx++]; N; --N) { 5768 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5769 } 5770 5771 return Listener.ReadTargetOptions(TargetOpts, Complain, 5772 AllowCompatibleDifferences); 5773 } 5774 5775 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5776 ASTReaderListener &Listener) { 5777 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5778 unsigned Idx = 0; 5779 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5780 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5781 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5782 #include "clang/Basic/DiagnosticOptions.def" 5783 5784 for (unsigned N = Record[Idx++]; N; --N) 5785 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5786 for (unsigned N = Record[Idx++]; N; --N) 5787 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5788 5789 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5790 } 5791 5792 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5793 ASTReaderListener &Listener) { 5794 FileSystemOptions FSOpts; 5795 unsigned Idx = 0; 5796 FSOpts.WorkingDir = ReadString(Record, Idx); 5797 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5798 } 5799 5800 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5801 bool Complain, 5802 ASTReaderListener &Listener) { 5803 HeaderSearchOptions HSOpts; 5804 unsigned Idx = 0; 5805 HSOpts.Sysroot = ReadString(Record, Idx); 5806 5807 // Include entries. 5808 for (unsigned N = Record[Idx++]; N; --N) { 5809 std::string Path = ReadString(Record, Idx); 5810 frontend::IncludeDirGroup Group 5811 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5812 bool IsFramework = Record[Idx++]; 5813 bool IgnoreSysRoot = Record[Idx++]; 5814 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5815 IgnoreSysRoot); 5816 } 5817 5818 // System header prefixes. 5819 for (unsigned N = Record[Idx++]; N; --N) { 5820 std::string Prefix = ReadString(Record, Idx); 5821 bool IsSystemHeader = Record[Idx++]; 5822 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5823 } 5824 5825 HSOpts.ResourceDir = ReadString(Record, Idx); 5826 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5827 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5828 HSOpts.DisableModuleHash = Record[Idx++]; 5829 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5830 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5831 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++]; 5832 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5833 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5834 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5835 HSOpts.UseLibcxx = Record[Idx++]; 5836 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5837 5838 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5839 Complain); 5840 } 5841 5842 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5843 bool Complain, 5844 ASTReaderListener &Listener, 5845 std::string &SuggestedPredefines) { 5846 PreprocessorOptions PPOpts; 5847 unsigned Idx = 0; 5848 5849 // Macro definitions/undefs 5850 for (unsigned N = Record[Idx++]; N; --N) { 5851 std::string Macro = ReadString(Record, Idx); 5852 bool IsUndef = Record[Idx++]; 5853 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5854 } 5855 5856 // Includes 5857 for (unsigned N = Record[Idx++]; N; --N) { 5858 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5859 } 5860 5861 // Macro Includes 5862 for (unsigned N = Record[Idx++]; N; --N) { 5863 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5864 } 5865 5866 PPOpts.UsePredefines = Record[Idx++]; 5867 PPOpts.DetailedRecord = Record[Idx++]; 5868 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5869 PPOpts.ObjCXXARCStandardLibrary = 5870 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5871 SuggestedPredefines.clear(); 5872 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5873 SuggestedPredefines); 5874 } 5875 5876 std::pair<ModuleFile *, unsigned> 5877 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5878 GlobalPreprocessedEntityMapType::iterator 5879 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5880 assert(I != GlobalPreprocessedEntityMap.end() && 5881 "Corrupted global preprocessed entity map"); 5882 ModuleFile *M = I->second; 5883 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5884 return std::make_pair(M, LocalIndex); 5885 } 5886 5887 llvm::iterator_range<PreprocessingRecord::iterator> 5888 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5889 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5890 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5891 Mod.NumPreprocessedEntities); 5892 5893 return llvm::make_range(PreprocessingRecord::iterator(), 5894 PreprocessingRecord::iterator()); 5895 } 5896 5897 bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName, 5898 unsigned int ClientLoadCapabilities) { 5899 return ClientLoadCapabilities & ARR_OutOfDate && 5900 !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName); 5901 } 5902 5903 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5904 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5905 return llvm::make_range( 5906 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5907 ModuleDeclIterator(this, &Mod, 5908 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5909 } 5910 5911 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5912 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5913 assert(I != GlobalSkippedRangeMap.end() && 5914 "Corrupted global skipped range map"); 5915 ModuleFile *M = I->second; 5916 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5917 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5918 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5919 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5920 TranslateSourceLocation(*M, RawRange.getEnd())); 5921 assert(Range.isValid()); 5922 return Range; 5923 } 5924 5925 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5926 PreprocessedEntityID PPID = Index+1; 5927 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5928 ModuleFile &M = *PPInfo.first; 5929 unsigned LocalIndex = PPInfo.second; 5930 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5931 5932 if (!PP.getPreprocessingRecord()) { 5933 Error("no preprocessing record"); 5934 return nullptr; 5935 } 5936 5937 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5938 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5939 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5940 Error(std::move(Err)); 5941 return nullptr; 5942 } 5943 5944 Expected<llvm::BitstreamEntry> MaybeEntry = 5945 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5946 if (!MaybeEntry) { 5947 Error(MaybeEntry.takeError()); 5948 return nullptr; 5949 } 5950 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5951 5952 if (Entry.Kind != llvm::BitstreamEntry::Record) 5953 return nullptr; 5954 5955 // Read the record. 5956 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 5957 TranslateSourceLocation(M, PPOffs.getEnd())); 5958 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 5959 StringRef Blob; 5960 RecordData Record; 5961 Expected<unsigned> MaybeRecType = 5962 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 5963 if (!MaybeRecType) { 5964 Error(MaybeRecType.takeError()); 5965 return nullptr; 5966 } 5967 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 5968 case PPD_MACRO_EXPANSION: { 5969 bool isBuiltin = Record[0]; 5970 IdentifierInfo *Name = nullptr; 5971 MacroDefinitionRecord *Def = nullptr; 5972 if (isBuiltin) 5973 Name = getLocalIdentifier(M, Record[1]); 5974 else { 5975 PreprocessedEntityID GlobalID = 5976 getGlobalPreprocessedEntityID(M, Record[1]); 5977 Def = cast<MacroDefinitionRecord>( 5978 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 5979 } 5980 5981 MacroExpansion *ME; 5982 if (isBuiltin) 5983 ME = new (PPRec) MacroExpansion(Name, Range); 5984 else 5985 ME = new (PPRec) MacroExpansion(Def, Range); 5986 5987 return ME; 5988 } 5989 5990 case PPD_MACRO_DEFINITION: { 5991 // Decode the identifier info and then check again; if the macro is 5992 // still defined and associated with the identifier, 5993 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 5994 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 5995 5996 if (DeserializationListener) 5997 DeserializationListener->MacroDefinitionRead(PPID, MD); 5998 5999 return MD; 6000 } 6001 6002 case PPD_INCLUSION_DIRECTIVE: { 6003 const char *FullFileNameStart = Blob.data() + Record[0]; 6004 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 6005 const FileEntry *File = nullptr; 6006 if (!FullFileName.empty()) 6007 if (auto FE = PP.getFileManager().getFile(FullFileName)) 6008 File = *FE; 6009 6010 // FIXME: Stable encoding 6011 InclusionDirective::InclusionKind Kind 6012 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 6013 InclusionDirective *ID 6014 = new (PPRec) InclusionDirective(PPRec, Kind, 6015 StringRef(Blob.data(), Record[0]), 6016 Record[1], Record[3], 6017 File, 6018 Range); 6019 return ID; 6020 } 6021 } 6022 6023 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 6024 } 6025 6026 /// Find the next module that contains entities and return the ID 6027 /// of the first entry. 6028 /// 6029 /// \param SLocMapI points at a chunk of a module that contains no 6030 /// preprocessed entities or the entities it contains are not the ones we are 6031 /// looking for. 6032 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6033 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6034 ++SLocMapI; 6035 for (GlobalSLocOffsetMapType::const_iterator 6036 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6037 ModuleFile &M = *SLocMapI->second; 6038 if (M.NumPreprocessedEntities) 6039 return M.BasePreprocessedEntityID; 6040 } 6041 6042 return getTotalNumPreprocessedEntities(); 6043 } 6044 6045 namespace { 6046 6047 struct PPEntityComp { 6048 const ASTReader &Reader; 6049 ModuleFile &M; 6050 6051 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6052 6053 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6054 SourceLocation LHS = getLoc(L); 6055 SourceLocation RHS = getLoc(R); 6056 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6057 } 6058 6059 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6060 SourceLocation LHS = getLoc(L); 6061 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6062 } 6063 6064 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6065 SourceLocation RHS = getLoc(R); 6066 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6067 } 6068 6069 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6070 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6071 } 6072 }; 6073 6074 } // namespace 6075 6076 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6077 bool EndsAfter) const { 6078 if (SourceMgr.isLocalSourceLocation(Loc)) 6079 return getTotalNumPreprocessedEntities(); 6080 6081 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6082 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6083 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6084 "Corrupted global sloc offset map"); 6085 6086 if (SLocMapI->second->NumPreprocessedEntities == 0) 6087 return findNextPreprocessedEntity(SLocMapI); 6088 6089 ModuleFile &M = *SLocMapI->second; 6090 6091 using pp_iterator = const PPEntityOffset *; 6092 6093 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6094 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6095 6096 size_t Count = M.NumPreprocessedEntities; 6097 size_t Half; 6098 pp_iterator First = pp_begin; 6099 pp_iterator PPI; 6100 6101 if (EndsAfter) { 6102 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6103 PPEntityComp(*this, M)); 6104 } else { 6105 // Do a binary search manually instead of using std::lower_bound because 6106 // The end locations of entities may be unordered (when a macro expansion 6107 // is inside another macro argument), but for this case it is not important 6108 // whether we get the first macro expansion or its containing macro. 6109 while (Count > 0) { 6110 Half = Count / 2; 6111 PPI = First; 6112 std::advance(PPI, Half); 6113 if (SourceMgr.isBeforeInTranslationUnit( 6114 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6115 First = PPI; 6116 ++First; 6117 Count = Count - Half - 1; 6118 } else 6119 Count = Half; 6120 } 6121 } 6122 6123 if (PPI == pp_end) 6124 return findNextPreprocessedEntity(SLocMapI); 6125 6126 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6127 } 6128 6129 /// Returns a pair of [Begin, End) indices of preallocated 6130 /// preprocessed entities that \arg Range encompasses. 6131 std::pair<unsigned, unsigned> 6132 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6133 if (Range.isInvalid()) 6134 return std::make_pair(0,0); 6135 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6136 6137 PreprocessedEntityID BeginID = 6138 findPreprocessedEntity(Range.getBegin(), false); 6139 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6140 return std::make_pair(BeginID, EndID); 6141 } 6142 6143 /// Optionally returns true or false if the preallocated preprocessed 6144 /// entity with index \arg Index came from file \arg FID. 6145 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6146 FileID FID) { 6147 if (FID.isInvalid()) 6148 return false; 6149 6150 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6151 ModuleFile &M = *PPInfo.first; 6152 unsigned LocalIndex = PPInfo.second; 6153 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6154 6155 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6156 if (Loc.isInvalid()) 6157 return false; 6158 6159 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6160 return true; 6161 else 6162 return false; 6163 } 6164 6165 namespace { 6166 6167 /// Visitor used to search for information about a header file. 6168 class HeaderFileInfoVisitor { 6169 const FileEntry *FE; 6170 Optional<HeaderFileInfo> HFI; 6171 6172 public: 6173 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6174 6175 bool operator()(ModuleFile &M) { 6176 HeaderFileInfoLookupTable *Table 6177 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6178 if (!Table) 6179 return false; 6180 6181 // Look in the on-disk hash table for an entry for this file name. 6182 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6183 if (Pos == Table->end()) 6184 return false; 6185 6186 HFI = *Pos; 6187 return true; 6188 } 6189 6190 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6191 }; 6192 6193 } // namespace 6194 6195 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6196 HeaderFileInfoVisitor Visitor(FE); 6197 ModuleMgr.visit(Visitor); 6198 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6199 return *HFI; 6200 6201 return HeaderFileInfo(); 6202 } 6203 6204 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6205 using DiagState = DiagnosticsEngine::DiagState; 6206 SmallVector<DiagState *, 32> DiagStates; 6207 6208 for (ModuleFile &F : ModuleMgr) { 6209 unsigned Idx = 0; 6210 auto &Record = F.PragmaDiagMappings; 6211 if (Record.empty()) 6212 continue; 6213 6214 DiagStates.clear(); 6215 6216 auto ReadDiagState = 6217 [&](const DiagState &BasedOn, SourceLocation Loc, 6218 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6219 unsigned BackrefID = Record[Idx++]; 6220 if (BackrefID != 0) 6221 return DiagStates[BackrefID - 1]; 6222 6223 // A new DiagState was created here. 6224 Diag.DiagStates.push_back(BasedOn); 6225 DiagState *NewState = &Diag.DiagStates.back(); 6226 DiagStates.push_back(NewState); 6227 unsigned Size = Record[Idx++]; 6228 assert(Idx + Size * 2 <= Record.size() && 6229 "Invalid data, not enough diag/map pairs"); 6230 while (Size--) { 6231 unsigned DiagID = Record[Idx++]; 6232 DiagnosticMapping NewMapping = 6233 DiagnosticMapping::deserialize(Record[Idx++]); 6234 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6235 continue; 6236 6237 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6238 6239 // If this mapping was specified as a warning but the severity was 6240 // upgraded due to diagnostic settings, simulate the current diagnostic 6241 // settings (and use a warning). 6242 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6243 NewMapping.setSeverity(diag::Severity::Warning); 6244 NewMapping.setUpgradedFromWarning(false); 6245 } 6246 6247 Mapping = NewMapping; 6248 } 6249 return NewState; 6250 }; 6251 6252 // Read the first state. 6253 DiagState *FirstState; 6254 if (F.Kind == MK_ImplicitModule) { 6255 // Implicitly-built modules are reused with different diagnostic 6256 // settings. Use the initial diagnostic state from Diag to simulate this 6257 // compilation's diagnostic settings. 6258 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6259 DiagStates.push_back(FirstState); 6260 6261 // Skip the initial diagnostic state from the serialized module. 6262 assert(Record[1] == 0 && 6263 "Invalid data, unexpected backref in initial state"); 6264 Idx = 3 + Record[2] * 2; 6265 assert(Idx < Record.size() && 6266 "Invalid data, not enough state change pairs in initial state"); 6267 } else if (F.isModule()) { 6268 // For an explicit module, preserve the flags from the module build 6269 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6270 // -Wblah flags. 6271 unsigned Flags = Record[Idx++]; 6272 DiagState Initial; 6273 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6274 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6275 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6276 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6277 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6278 Initial.ExtBehavior = (diag::Severity)Flags; 6279 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6280 6281 assert(F.OriginalSourceFileID.isValid()); 6282 6283 // Set up the root buffer of the module to start with the initial 6284 // diagnostic state of the module itself, to cover files that contain no 6285 // explicit transitions (for which we did not serialize anything). 6286 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6287 .StateTransitions.push_back({FirstState, 0}); 6288 } else { 6289 // For prefix ASTs, start with whatever the user configured on the 6290 // command line. 6291 Idx++; // Skip flags. 6292 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6293 SourceLocation(), false); 6294 } 6295 6296 // Read the state transitions. 6297 unsigned NumLocations = Record[Idx++]; 6298 while (NumLocations--) { 6299 assert(Idx < Record.size() && 6300 "Invalid data, missing pragma diagnostic states"); 6301 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6302 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6303 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6304 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6305 unsigned Transitions = Record[Idx++]; 6306 6307 // Note that we don't need to set up Parent/ParentOffset here, because 6308 // we won't be changing the diagnostic state within imported FileIDs 6309 // (other than perhaps appending to the main source file, which has no 6310 // parent). 6311 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6312 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6313 for (unsigned I = 0; I != Transitions; ++I) { 6314 unsigned Offset = Record[Idx++]; 6315 auto *State = 6316 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6317 F.StateTransitions.push_back({State, Offset}); 6318 } 6319 } 6320 6321 // Read the final state. 6322 assert(Idx < Record.size() && 6323 "Invalid data, missing final pragma diagnostic state"); 6324 SourceLocation CurStateLoc = 6325 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6326 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6327 6328 if (!F.isModule()) { 6329 Diag.DiagStatesByLoc.CurDiagState = CurState; 6330 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6331 6332 // Preserve the property that the imaginary root file describes the 6333 // current state. 6334 FileID NullFile; 6335 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6336 if (T.empty()) 6337 T.push_back({CurState, 0}); 6338 else 6339 T[0].State = CurState; 6340 } 6341 6342 // Don't try to read these mappings again. 6343 Record.clear(); 6344 } 6345 } 6346 6347 /// Get the correct cursor and offset for loading a type. 6348 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6349 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6350 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6351 ModuleFile *M = I->second; 6352 return RecordLocation( 6353 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() + 6354 M->DeclsBlockStartOffset); 6355 } 6356 6357 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6358 switch (code) { 6359 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6360 case TYPE_##CODE_ID: return Type::CLASS_ID; 6361 #include "clang/Serialization/TypeBitCodes.def" 6362 default: return llvm::None; 6363 } 6364 } 6365 6366 /// Read and return the type with the given index.. 6367 /// 6368 /// The index is the type ID, shifted and minus the number of predefs. This 6369 /// routine actually reads the record corresponding to the type at the given 6370 /// location. It is a helper routine for GetType, which deals with reading type 6371 /// IDs. 6372 QualType ASTReader::readTypeRecord(unsigned Index) { 6373 assert(ContextObj && "reading type with no AST context"); 6374 ASTContext &Context = *ContextObj; 6375 RecordLocation Loc = TypeCursorForIndex(Index); 6376 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6377 6378 // Keep track of where we are in the stream, then jump back there 6379 // after reading this type. 6380 SavedStreamPosition SavedPosition(DeclsCursor); 6381 6382 ReadingKindTracker ReadingKind(Read_Type, *this); 6383 6384 // Note that we are loading a type record. 6385 Deserializing AType(this); 6386 6387 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6388 Error(std::move(Err)); 6389 return QualType(); 6390 } 6391 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6392 if (!RawCode) { 6393 Error(RawCode.takeError()); 6394 return QualType(); 6395 } 6396 6397 ASTRecordReader Record(*this, *Loc.F); 6398 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6399 if (!Code) { 6400 Error(Code.takeError()); 6401 return QualType(); 6402 } 6403 if (Code.get() == TYPE_EXT_QUAL) { 6404 QualType baseType = Record.readQualType(); 6405 Qualifiers quals = Record.readQualifiers(); 6406 return Context.getQualifiedType(baseType, quals); 6407 } 6408 6409 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6410 if (!maybeClass) { 6411 Error("Unexpected code for type"); 6412 return QualType(); 6413 } 6414 6415 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6416 return TypeReader.read(*maybeClass); 6417 } 6418 6419 namespace clang { 6420 6421 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6422 ASTRecordReader &Reader; 6423 6424 SourceLocation readSourceLocation() { 6425 return Reader.readSourceLocation(); 6426 } 6427 6428 TypeSourceInfo *GetTypeSourceInfo() { 6429 return Reader.readTypeSourceInfo(); 6430 } 6431 6432 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6433 return Reader.readNestedNameSpecifierLoc(); 6434 } 6435 6436 Attr *ReadAttr() { 6437 return Reader.readAttr(); 6438 } 6439 6440 public: 6441 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6442 6443 // We want compile-time assurance that we've enumerated all of 6444 // these, so unfortunately we have to declare them first, then 6445 // define them out-of-line. 6446 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6447 #define TYPELOC(CLASS, PARENT) \ 6448 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6449 #include "clang/AST/TypeLocNodes.def" 6450 6451 void VisitFunctionTypeLoc(FunctionTypeLoc); 6452 void VisitArrayTypeLoc(ArrayTypeLoc); 6453 }; 6454 6455 } // namespace clang 6456 6457 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6458 // nothing to do 6459 } 6460 6461 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6462 TL.setBuiltinLoc(readSourceLocation()); 6463 if (TL.needsExtraLocalData()) { 6464 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6465 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt())); 6466 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt())); 6467 TL.setModeAttr(Reader.readInt()); 6468 } 6469 } 6470 6471 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6472 TL.setNameLoc(readSourceLocation()); 6473 } 6474 6475 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6476 TL.setStarLoc(readSourceLocation()); 6477 } 6478 6479 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6480 // nothing to do 6481 } 6482 6483 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6484 // nothing to do 6485 } 6486 6487 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6488 TL.setExpansionLoc(readSourceLocation()); 6489 } 6490 6491 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6492 TL.setCaretLoc(readSourceLocation()); 6493 } 6494 6495 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6496 TL.setAmpLoc(readSourceLocation()); 6497 } 6498 6499 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6500 TL.setAmpAmpLoc(readSourceLocation()); 6501 } 6502 6503 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6504 TL.setStarLoc(readSourceLocation()); 6505 TL.setClassTInfo(GetTypeSourceInfo()); 6506 } 6507 6508 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6509 TL.setLBracketLoc(readSourceLocation()); 6510 TL.setRBracketLoc(readSourceLocation()); 6511 if (Reader.readBool()) 6512 TL.setSizeExpr(Reader.readExpr()); 6513 else 6514 TL.setSizeExpr(nullptr); 6515 } 6516 6517 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6518 VisitArrayTypeLoc(TL); 6519 } 6520 6521 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6522 VisitArrayTypeLoc(TL); 6523 } 6524 6525 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6526 VisitArrayTypeLoc(TL); 6527 } 6528 6529 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6530 DependentSizedArrayTypeLoc TL) { 6531 VisitArrayTypeLoc(TL); 6532 } 6533 6534 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6535 DependentAddressSpaceTypeLoc TL) { 6536 6537 TL.setAttrNameLoc(readSourceLocation()); 6538 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6539 TL.setAttrExprOperand(Reader.readExpr()); 6540 } 6541 6542 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6543 DependentSizedExtVectorTypeLoc TL) { 6544 TL.setNameLoc(readSourceLocation()); 6545 } 6546 6547 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6548 TL.setNameLoc(readSourceLocation()); 6549 } 6550 6551 void TypeLocReader::VisitDependentVectorTypeLoc( 6552 DependentVectorTypeLoc TL) { 6553 TL.setNameLoc(readSourceLocation()); 6554 } 6555 6556 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6557 TL.setNameLoc(readSourceLocation()); 6558 } 6559 6560 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) { 6561 TL.setAttrNameLoc(readSourceLocation()); 6562 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6563 TL.setAttrRowOperand(Reader.readExpr()); 6564 TL.setAttrColumnOperand(Reader.readExpr()); 6565 } 6566 6567 void TypeLocReader::VisitDependentSizedMatrixTypeLoc( 6568 DependentSizedMatrixTypeLoc TL) { 6569 TL.setAttrNameLoc(readSourceLocation()); 6570 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6571 TL.setAttrRowOperand(Reader.readExpr()); 6572 TL.setAttrColumnOperand(Reader.readExpr()); 6573 } 6574 6575 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6576 TL.setLocalRangeBegin(readSourceLocation()); 6577 TL.setLParenLoc(readSourceLocation()); 6578 TL.setRParenLoc(readSourceLocation()); 6579 TL.setExceptionSpecRange(Reader.readSourceRange()); 6580 TL.setLocalRangeEnd(readSourceLocation()); 6581 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6582 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6583 } 6584 } 6585 6586 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6587 VisitFunctionTypeLoc(TL); 6588 } 6589 6590 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6591 VisitFunctionTypeLoc(TL); 6592 } 6593 6594 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6595 TL.setNameLoc(readSourceLocation()); 6596 } 6597 6598 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6599 TL.setNameLoc(readSourceLocation()); 6600 } 6601 6602 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6603 TL.setTypeofLoc(readSourceLocation()); 6604 TL.setLParenLoc(readSourceLocation()); 6605 TL.setRParenLoc(readSourceLocation()); 6606 } 6607 6608 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6609 TL.setTypeofLoc(readSourceLocation()); 6610 TL.setLParenLoc(readSourceLocation()); 6611 TL.setRParenLoc(readSourceLocation()); 6612 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6613 } 6614 6615 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6616 TL.setNameLoc(readSourceLocation()); 6617 } 6618 6619 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6620 TL.setKWLoc(readSourceLocation()); 6621 TL.setLParenLoc(readSourceLocation()); 6622 TL.setRParenLoc(readSourceLocation()); 6623 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6624 } 6625 6626 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6627 TL.setNameLoc(readSourceLocation()); 6628 if (Reader.readBool()) { 6629 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6630 TL.setTemplateKWLoc(readSourceLocation()); 6631 TL.setConceptNameLoc(readSourceLocation()); 6632 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6633 TL.setLAngleLoc(readSourceLocation()); 6634 TL.setRAngleLoc(readSourceLocation()); 6635 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6636 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6637 TL.getTypePtr()->getArg(i).getKind())); 6638 } 6639 } 6640 6641 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6642 DeducedTemplateSpecializationTypeLoc TL) { 6643 TL.setTemplateNameLoc(readSourceLocation()); 6644 } 6645 6646 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6647 TL.setNameLoc(readSourceLocation()); 6648 } 6649 6650 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6651 TL.setNameLoc(readSourceLocation()); 6652 } 6653 6654 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6655 TL.setAttr(ReadAttr()); 6656 } 6657 6658 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6659 TL.setNameLoc(readSourceLocation()); 6660 } 6661 6662 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6663 SubstTemplateTypeParmTypeLoc TL) { 6664 TL.setNameLoc(readSourceLocation()); 6665 } 6666 6667 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6668 SubstTemplateTypeParmPackTypeLoc TL) { 6669 TL.setNameLoc(readSourceLocation()); 6670 } 6671 6672 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6673 TemplateSpecializationTypeLoc TL) { 6674 TL.setTemplateKeywordLoc(readSourceLocation()); 6675 TL.setTemplateNameLoc(readSourceLocation()); 6676 TL.setLAngleLoc(readSourceLocation()); 6677 TL.setRAngleLoc(readSourceLocation()); 6678 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6679 TL.setArgLocInfo( 6680 i, 6681 Reader.readTemplateArgumentLocInfo( 6682 TL.getTypePtr()->getArg(i).getKind())); 6683 } 6684 6685 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6686 TL.setLParenLoc(readSourceLocation()); 6687 TL.setRParenLoc(readSourceLocation()); 6688 } 6689 6690 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6691 TL.setElaboratedKeywordLoc(readSourceLocation()); 6692 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6693 } 6694 6695 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6696 TL.setNameLoc(readSourceLocation()); 6697 } 6698 6699 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6700 TL.setElaboratedKeywordLoc(readSourceLocation()); 6701 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6702 TL.setNameLoc(readSourceLocation()); 6703 } 6704 6705 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6706 DependentTemplateSpecializationTypeLoc TL) { 6707 TL.setElaboratedKeywordLoc(readSourceLocation()); 6708 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6709 TL.setTemplateKeywordLoc(readSourceLocation()); 6710 TL.setTemplateNameLoc(readSourceLocation()); 6711 TL.setLAngleLoc(readSourceLocation()); 6712 TL.setRAngleLoc(readSourceLocation()); 6713 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6714 TL.setArgLocInfo( 6715 I, 6716 Reader.readTemplateArgumentLocInfo( 6717 TL.getTypePtr()->getArg(I).getKind())); 6718 } 6719 6720 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6721 TL.setEllipsisLoc(readSourceLocation()); 6722 } 6723 6724 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6725 TL.setNameLoc(readSourceLocation()); 6726 } 6727 6728 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6729 if (TL.getNumProtocols()) { 6730 TL.setProtocolLAngleLoc(readSourceLocation()); 6731 TL.setProtocolRAngleLoc(readSourceLocation()); 6732 } 6733 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6734 TL.setProtocolLoc(i, readSourceLocation()); 6735 } 6736 6737 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6738 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6739 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6740 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6741 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6742 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6743 TL.setProtocolLAngleLoc(readSourceLocation()); 6744 TL.setProtocolRAngleLoc(readSourceLocation()); 6745 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6746 TL.setProtocolLoc(i, readSourceLocation()); 6747 } 6748 6749 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6750 TL.setStarLoc(readSourceLocation()); 6751 } 6752 6753 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6754 TL.setKWLoc(readSourceLocation()); 6755 TL.setLParenLoc(readSourceLocation()); 6756 TL.setRParenLoc(readSourceLocation()); 6757 } 6758 6759 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6760 TL.setKWLoc(readSourceLocation()); 6761 } 6762 6763 void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) { 6764 TL.setNameLoc(readSourceLocation()); 6765 } 6766 void TypeLocReader::VisitDependentExtIntTypeLoc( 6767 clang::DependentExtIntTypeLoc TL) { 6768 TL.setNameLoc(readSourceLocation()); 6769 } 6770 6771 6772 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6773 TypeLocReader TLR(*this); 6774 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6775 TLR.Visit(TL); 6776 } 6777 6778 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6779 QualType InfoTy = readType(); 6780 if (InfoTy.isNull()) 6781 return nullptr; 6782 6783 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6784 readTypeLoc(TInfo->getTypeLoc()); 6785 return TInfo; 6786 } 6787 6788 QualType ASTReader::GetType(TypeID ID) { 6789 assert(ContextObj && "reading type with no AST context"); 6790 ASTContext &Context = *ContextObj; 6791 6792 unsigned FastQuals = ID & Qualifiers::FastMask; 6793 unsigned Index = ID >> Qualifiers::FastWidth; 6794 6795 if (Index < NUM_PREDEF_TYPE_IDS) { 6796 QualType T; 6797 switch ((PredefinedTypeIDs)Index) { 6798 case PREDEF_TYPE_NULL_ID: 6799 return QualType(); 6800 case PREDEF_TYPE_VOID_ID: 6801 T = Context.VoidTy; 6802 break; 6803 case PREDEF_TYPE_BOOL_ID: 6804 T = Context.BoolTy; 6805 break; 6806 case PREDEF_TYPE_CHAR_U_ID: 6807 case PREDEF_TYPE_CHAR_S_ID: 6808 // FIXME: Check that the signedness of CharTy is correct! 6809 T = Context.CharTy; 6810 break; 6811 case PREDEF_TYPE_UCHAR_ID: 6812 T = Context.UnsignedCharTy; 6813 break; 6814 case PREDEF_TYPE_USHORT_ID: 6815 T = Context.UnsignedShortTy; 6816 break; 6817 case PREDEF_TYPE_UINT_ID: 6818 T = Context.UnsignedIntTy; 6819 break; 6820 case PREDEF_TYPE_ULONG_ID: 6821 T = Context.UnsignedLongTy; 6822 break; 6823 case PREDEF_TYPE_ULONGLONG_ID: 6824 T = Context.UnsignedLongLongTy; 6825 break; 6826 case PREDEF_TYPE_UINT128_ID: 6827 T = Context.UnsignedInt128Ty; 6828 break; 6829 case PREDEF_TYPE_SCHAR_ID: 6830 T = Context.SignedCharTy; 6831 break; 6832 case PREDEF_TYPE_WCHAR_ID: 6833 T = Context.WCharTy; 6834 break; 6835 case PREDEF_TYPE_SHORT_ID: 6836 T = Context.ShortTy; 6837 break; 6838 case PREDEF_TYPE_INT_ID: 6839 T = Context.IntTy; 6840 break; 6841 case PREDEF_TYPE_LONG_ID: 6842 T = Context.LongTy; 6843 break; 6844 case PREDEF_TYPE_LONGLONG_ID: 6845 T = Context.LongLongTy; 6846 break; 6847 case PREDEF_TYPE_INT128_ID: 6848 T = Context.Int128Ty; 6849 break; 6850 case PREDEF_TYPE_BFLOAT16_ID: 6851 T = Context.BFloat16Ty; 6852 break; 6853 case PREDEF_TYPE_HALF_ID: 6854 T = Context.HalfTy; 6855 break; 6856 case PREDEF_TYPE_FLOAT_ID: 6857 T = Context.FloatTy; 6858 break; 6859 case PREDEF_TYPE_DOUBLE_ID: 6860 T = Context.DoubleTy; 6861 break; 6862 case PREDEF_TYPE_LONGDOUBLE_ID: 6863 T = Context.LongDoubleTy; 6864 break; 6865 case PREDEF_TYPE_SHORT_ACCUM_ID: 6866 T = Context.ShortAccumTy; 6867 break; 6868 case PREDEF_TYPE_ACCUM_ID: 6869 T = Context.AccumTy; 6870 break; 6871 case PREDEF_TYPE_LONG_ACCUM_ID: 6872 T = Context.LongAccumTy; 6873 break; 6874 case PREDEF_TYPE_USHORT_ACCUM_ID: 6875 T = Context.UnsignedShortAccumTy; 6876 break; 6877 case PREDEF_TYPE_UACCUM_ID: 6878 T = Context.UnsignedAccumTy; 6879 break; 6880 case PREDEF_TYPE_ULONG_ACCUM_ID: 6881 T = Context.UnsignedLongAccumTy; 6882 break; 6883 case PREDEF_TYPE_SHORT_FRACT_ID: 6884 T = Context.ShortFractTy; 6885 break; 6886 case PREDEF_TYPE_FRACT_ID: 6887 T = Context.FractTy; 6888 break; 6889 case PREDEF_TYPE_LONG_FRACT_ID: 6890 T = Context.LongFractTy; 6891 break; 6892 case PREDEF_TYPE_USHORT_FRACT_ID: 6893 T = Context.UnsignedShortFractTy; 6894 break; 6895 case PREDEF_TYPE_UFRACT_ID: 6896 T = Context.UnsignedFractTy; 6897 break; 6898 case PREDEF_TYPE_ULONG_FRACT_ID: 6899 T = Context.UnsignedLongFractTy; 6900 break; 6901 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6902 T = Context.SatShortAccumTy; 6903 break; 6904 case PREDEF_TYPE_SAT_ACCUM_ID: 6905 T = Context.SatAccumTy; 6906 break; 6907 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6908 T = Context.SatLongAccumTy; 6909 break; 6910 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6911 T = Context.SatUnsignedShortAccumTy; 6912 break; 6913 case PREDEF_TYPE_SAT_UACCUM_ID: 6914 T = Context.SatUnsignedAccumTy; 6915 break; 6916 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6917 T = Context.SatUnsignedLongAccumTy; 6918 break; 6919 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6920 T = Context.SatShortFractTy; 6921 break; 6922 case PREDEF_TYPE_SAT_FRACT_ID: 6923 T = Context.SatFractTy; 6924 break; 6925 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6926 T = Context.SatLongFractTy; 6927 break; 6928 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6929 T = Context.SatUnsignedShortFractTy; 6930 break; 6931 case PREDEF_TYPE_SAT_UFRACT_ID: 6932 T = Context.SatUnsignedFractTy; 6933 break; 6934 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6935 T = Context.SatUnsignedLongFractTy; 6936 break; 6937 case PREDEF_TYPE_FLOAT16_ID: 6938 T = Context.Float16Ty; 6939 break; 6940 case PREDEF_TYPE_FLOAT128_ID: 6941 T = Context.Float128Ty; 6942 break; 6943 case PREDEF_TYPE_IBM128_ID: 6944 T = Context.Ibm128Ty; 6945 break; 6946 case PREDEF_TYPE_OVERLOAD_ID: 6947 T = Context.OverloadTy; 6948 break; 6949 case PREDEF_TYPE_BOUND_MEMBER: 6950 T = Context.BoundMemberTy; 6951 break; 6952 case PREDEF_TYPE_PSEUDO_OBJECT: 6953 T = Context.PseudoObjectTy; 6954 break; 6955 case PREDEF_TYPE_DEPENDENT_ID: 6956 T = Context.DependentTy; 6957 break; 6958 case PREDEF_TYPE_UNKNOWN_ANY: 6959 T = Context.UnknownAnyTy; 6960 break; 6961 case PREDEF_TYPE_NULLPTR_ID: 6962 T = Context.NullPtrTy; 6963 break; 6964 case PREDEF_TYPE_CHAR8_ID: 6965 T = Context.Char8Ty; 6966 break; 6967 case PREDEF_TYPE_CHAR16_ID: 6968 T = Context.Char16Ty; 6969 break; 6970 case PREDEF_TYPE_CHAR32_ID: 6971 T = Context.Char32Ty; 6972 break; 6973 case PREDEF_TYPE_OBJC_ID: 6974 T = Context.ObjCBuiltinIdTy; 6975 break; 6976 case PREDEF_TYPE_OBJC_CLASS: 6977 T = Context.ObjCBuiltinClassTy; 6978 break; 6979 case PREDEF_TYPE_OBJC_SEL: 6980 T = Context.ObjCBuiltinSelTy; 6981 break; 6982 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6983 case PREDEF_TYPE_##Id##_ID: \ 6984 T = Context.SingletonId; \ 6985 break; 6986 #include "clang/Basic/OpenCLImageTypes.def" 6987 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 6988 case PREDEF_TYPE_##Id##_ID: \ 6989 T = Context.Id##Ty; \ 6990 break; 6991 #include "clang/Basic/OpenCLExtensionTypes.def" 6992 case PREDEF_TYPE_SAMPLER_ID: 6993 T = Context.OCLSamplerTy; 6994 break; 6995 case PREDEF_TYPE_EVENT_ID: 6996 T = Context.OCLEventTy; 6997 break; 6998 case PREDEF_TYPE_CLK_EVENT_ID: 6999 T = Context.OCLClkEventTy; 7000 break; 7001 case PREDEF_TYPE_QUEUE_ID: 7002 T = Context.OCLQueueTy; 7003 break; 7004 case PREDEF_TYPE_RESERVE_ID_ID: 7005 T = Context.OCLReserveIDTy; 7006 break; 7007 case PREDEF_TYPE_AUTO_DEDUCT: 7008 T = Context.getAutoDeductType(); 7009 break; 7010 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 7011 T = Context.getAutoRRefDeductType(); 7012 break; 7013 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 7014 T = Context.ARCUnbridgedCastTy; 7015 break; 7016 case PREDEF_TYPE_BUILTIN_FN: 7017 T = Context.BuiltinFnTy; 7018 break; 7019 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX: 7020 T = Context.IncompleteMatrixIdxTy; 7021 break; 7022 case PREDEF_TYPE_OMP_ARRAY_SECTION: 7023 T = Context.OMPArraySectionTy; 7024 break; 7025 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 7026 T = Context.OMPArraySectionTy; 7027 break; 7028 case PREDEF_TYPE_OMP_ITERATOR: 7029 T = Context.OMPIteratorTy; 7030 break; 7031 #define SVE_TYPE(Name, Id, SingletonId) \ 7032 case PREDEF_TYPE_##Id##_ID: \ 7033 T = Context.SingletonId; \ 7034 break; 7035 #include "clang/Basic/AArch64SVEACLETypes.def" 7036 #define PPC_VECTOR_TYPE(Name, Id, Size) \ 7037 case PREDEF_TYPE_##Id##_ID: \ 7038 T = Context.Id##Ty; \ 7039 break; 7040 #include "clang/Basic/PPCTypes.def" 7041 #define RVV_TYPE(Name, Id, SingletonId) \ 7042 case PREDEF_TYPE_##Id##_ID: \ 7043 T = Context.SingletonId; \ 7044 break; 7045 #include "clang/Basic/RISCVVTypes.def" 7046 } 7047 7048 assert(!T.isNull() && "Unknown predefined type"); 7049 return T.withFastQualifiers(FastQuals); 7050 } 7051 7052 Index -= NUM_PREDEF_TYPE_IDS; 7053 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 7054 if (TypesLoaded[Index].isNull()) { 7055 TypesLoaded[Index] = readTypeRecord(Index); 7056 if (TypesLoaded[Index].isNull()) 7057 return QualType(); 7058 7059 TypesLoaded[Index]->setFromAST(); 7060 if (DeserializationListener) 7061 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 7062 TypesLoaded[Index]); 7063 } 7064 7065 return TypesLoaded[Index].withFastQualifiers(FastQuals); 7066 } 7067 7068 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 7069 return GetType(getGlobalTypeID(F, LocalID)); 7070 } 7071 7072 serialization::TypeID 7073 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7074 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7075 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7076 7077 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7078 return LocalID; 7079 7080 if (!F.ModuleOffsetMap.empty()) 7081 ReadModuleOffsetMap(F); 7082 7083 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7084 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7085 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7086 7087 unsigned GlobalIndex = LocalIndex + I->second; 7088 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7089 } 7090 7091 TemplateArgumentLocInfo 7092 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7093 switch (Kind) { 7094 case TemplateArgument::Expression: 7095 return readExpr(); 7096 case TemplateArgument::Type: 7097 return readTypeSourceInfo(); 7098 case TemplateArgument::Template: { 7099 NestedNameSpecifierLoc QualifierLoc = 7100 readNestedNameSpecifierLoc(); 7101 SourceLocation TemplateNameLoc = readSourceLocation(); 7102 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7103 TemplateNameLoc, SourceLocation()); 7104 } 7105 case TemplateArgument::TemplateExpansion: { 7106 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7107 SourceLocation TemplateNameLoc = readSourceLocation(); 7108 SourceLocation EllipsisLoc = readSourceLocation(); 7109 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7110 TemplateNameLoc, EllipsisLoc); 7111 } 7112 case TemplateArgument::Null: 7113 case TemplateArgument::Integral: 7114 case TemplateArgument::Declaration: 7115 case TemplateArgument::NullPtr: 7116 case TemplateArgument::Pack: 7117 // FIXME: Is this right? 7118 return TemplateArgumentLocInfo(); 7119 } 7120 llvm_unreachable("unexpected template argument loc"); 7121 } 7122 7123 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7124 TemplateArgument Arg = readTemplateArgument(); 7125 7126 if (Arg.getKind() == TemplateArgument::Expression) { 7127 if (readBool()) // bool InfoHasSameExpr. 7128 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7129 } 7130 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7131 } 7132 7133 const ASTTemplateArgumentListInfo * 7134 ASTRecordReader::readASTTemplateArgumentListInfo() { 7135 SourceLocation LAngleLoc = readSourceLocation(); 7136 SourceLocation RAngleLoc = readSourceLocation(); 7137 unsigned NumArgsAsWritten = readInt(); 7138 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7139 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7140 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7141 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7142 } 7143 7144 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7145 return GetDecl(ID); 7146 } 7147 7148 void ASTReader::CompleteRedeclChain(const Decl *D) { 7149 if (NumCurrentElementsDeserializing) { 7150 // We arrange to not care about the complete redeclaration chain while we're 7151 // deserializing. Just remember that the AST has marked this one as complete 7152 // but that it's not actually complete yet, so we know we still need to 7153 // complete it later. 7154 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7155 return; 7156 } 7157 7158 if (!D->getDeclContext()) { 7159 assert(isa<TranslationUnitDecl>(D) && "Not a TU?"); 7160 return; 7161 } 7162 7163 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7164 7165 // If this is a named declaration, complete it by looking it up 7166 // within its context. 7167 // 7168 // FIXME: Merging a function definition should merge 7169 // all mergeable entities within it. 7170 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7171 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7172 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7173 if (!getContext().getLangOpts().CPlusPlus && 7174 isa<TranslationUnitDecl>(DC)) { 7175 // Outside of C++, we don't have a lookup table for the TU, so update 7176 // the identifier instead. (For C++ modules, we don't store decls 7177 // in the serialized identifier table, so we do the lookup in the TU.) 7178 auto *II = Name.getAsIdentifierInfo(); 7179 assert(II && "non-identifier name in C?"); 7180 if (II->isOutOfDate()) 7181 updateOutOfDateIdentifier(*II); 7182 } else 7183 DC->lookup(Name); 7184 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7185 // Find all declarations of this kind from the relevant context. 7186 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7187 auto *DC = cast<DeclContext>(DCDecl); 7188 SmallVector<Decl*, 8> Decls; 7189 FindExternalLexicalDecls( 7190 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7191 } 7192 } 7193 } 7194 7195 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7196 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7197 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7198 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7199 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7200 if (auto *Template = FD->getPrimaryTemplate()) 7201 Template->LoadLazySpecializations(); 7202 } 7203 } 7204 7205 CXXCtorInitializer ** 7206 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7207 RecordLocation Loc = getLocalBitOffset(Offset); 7208 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7209 SavedStreamPosition SavedPosition(Cursor); 7210 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7211 Error(std::move(Err)); 7212 return nullptr; 7213 } 7214 ReadingKindTracker ReadingKind(Read_Decl, *this); 7215 7216 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7217 if (!MaybeCode) { 7218 Error(MaybeCode.takeError()); 7219 return nullptr; 7220 } 7221 unsigned Code = MaybeCode.get(); 7222 7223 ASTRecordReader Record(*this, *Loc.F); 7224 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7225 if (!MaybeRecCode) { 7226 Error(MaybeRecCode.takeError()); 7227 return nullptr; 7228 } 7229 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7230 Error("malformed AST file: missing C++ ctor initializers"); 7231 return nullptr; 7232 } 7233 7234 return Record.readCXXCtorInitializers(); 7235 } 7236 7237 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7238 assert(ContextObj && "reading base specifiers with no AST context"); 7239 ASTContext &Context = *ContextObj; 7240 7241 RecordLocation Loc = getLocalBitOffset(Offset); 7242 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7243 SavedStreamPosition SavedPosition(Cursor); 7244 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7245 Error(std::move(Err)); 7246 return nullptr; 7247 } 7248 ReadingKindTracker ReadingKind(Read_Decl, *this); 7249 7250 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7251 if (!MaybeCode) { 7252 Error(MaybeCode.takeError()); 7253 return nullptr; 7254 } 7255 unsigned Code = MaybeCode.get(); 7256 7257 ASTRecordReader Record(*this, *Loc.F); 7258 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7259 if (!MaybeRecCode) { 7260 Error(MaybeCode.takeError()); 7261 return nullptr; 7262 } 7263 unsigned RecCode = MaybeRecCode.get(); 7264 7265 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7266 Error("malformed AST file: missing C++ base specifiers"); 7267 return nullptr; 7268 } 7269 7270 unsigned NumBases = Record.readInt(); 7271 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7272 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7273 for (unsigned I = 0; I != NumBases; ++I) 7274 Bases[I] = Record.readCXXBaseSpecifier(); 7275 return Bases; 7276 } 7277 7278 serialization::DeclID 7279 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7280 if (LocalID < NUM_PREDEF_DECL_IDS) 7281 return LocalID; 7282 7283 if (!F.ModuleOffsetMap.empty()) 7284 ReadModuleOffsetMap(F); 7285 7286 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7287 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7288 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7289 7290 return LocalID + I->second; 7291 } 7292 7293 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7294 ModuleFile &M) const { 7295 // Predefined decls aren't from any module. 7296 if (ID < NUM_PREDEF_DECL_IDS) 7297 return false; 7298 7299 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7300 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7301 } 7302 7303 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7304 if (!D->isFromASTFile()) 7305 return nullptr; 7306 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7307 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7308 return I->second; 7309 } 7310 7311 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7312 if (ID < NUM_PREDEF_DECL_IDS) 7313 return SourceLocation(); 7314 7315 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7316 7317 if (Index > DeclsLoaded.size()) { 7318 Error("declaration ID out-of-range for AST file"); 7319 return SourceLocation(); 7320 } 7321 7322 if (Decl *D = DeclsLoaded[Index]) 7323 return D->getLocation(); 7324 7325 SourceLocation Loc; 7326 DeclCursorForID(ID, Loc); 7327 return Loc; 7328 } 7329 7330 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7331 switch (ID) { 7332 case PREDEF_DECL_NULL_ID: 7333 return nullptr; 7334 7335 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7336 return Context.getTranslationUnitDecl(); 7337 7338 case PREDEF_DECL_OBJC_ID_ID: 7339 return Context.getObjCIdDecl(); 7340 7341 case PREDEF_DECL_OBJC_SEL_ID: 7342 return Context.getObjCSelDecl(); 7343 7344 case PREDEF_DECL_OBJC_CLASS_ID: 7345 return Context.getObjCClassDecl(); 7346 7347 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7348 return Context.getObjCProtocolDecl(); 7349 7350 case PREDEF_DECL_INT_128_ID: 7351 return Context.getInt128Decl(); 7352 7353 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7354 return Context.getUInt128Decl(); 7355 7356 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7357 return Context.getObjCInstanceTypeDecl(); 7358 7359 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7360 return Context.getBuiltinVaListDecl(); 7361 7362 case PREDEF_DECL_VA_LIST_TAG: 7363 return Context.getVaListTagDecl(); 7364 7365 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7366 return Context.getBuiltinMSVaListDecl(); 7367 7368 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7369 return Context.getMSGuidTagDecl(); 7370 7371 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7372 return Context.getExternCContextDecl(); 7373 7374 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7375 return Context.getMakeIntegerSeqDecl(); 7376 7377 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7378 return Context.getCFConstantStringDecl(); 7379 7380 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7381 return Context.getCFConstantStringTagDecl(); 7382 7383 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7384 return Context.getTypePackElementDecl(); 7385 } 7386 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7387 } 7388 7389 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7390 assert(ContextObj && "reading decl with no AST context"); 7391 if (ID < NUM_PREDEF_DECL_IDS) { 7392 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7393 if (D) { 7394 // Track that we have merged the declaration with ID \p ID into the 7395 // pre-existing predefined declaration \p D. 7396 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7397 if (Merged.empty()) 7398 Merged.push_back(ID); 7399 } 7400 return D; 7401 } 7402 7403 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7404 7405 if (Index >= DeclsLoaded.size()) { 7406 assert(0 && "declaration ID out-of-range for AST file"); 7407 Error("declaration ID out-of-range for AST file"); 7408 return nullptr; 7409 } 7410 7411 return DeclsLoaded[Index]; 7412 } 7413 7414 Decl *ASTReader::GetDecl(DeclID ID) { 7415 if (ID < NUM_PREDEF_DECL_IDS) 7416 return GetExistingDecl(ID); 7417 7418 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7419 7420 if (Index >= DeclsLoaded.size()) { 7421 assert(0 && "declaration ID out-of-range for AST file"); 7422 Error("declaration ID out-of-range for AST file"); 7423 return nullptr; 7424 } 7425 7426 if (!DeclsLoaded[Index]) { 7427 ReadDeclRecord(ID); 7428 if (DeserializationListener) 7429 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7430 } 7431 7432 return DeclsLoaded[Index]; 7433 } 7434 7435 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7436 DeclID GlobalID) { 7437 if (GlobalID < NUM_PREDEF_DECL_IDS) 7438 return GlobalID; 7439 7440 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7441 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7442 ModuleFile *Owner = I->second; 7443 7444 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7445 = M.GlobalToLocalDeclIDs.find(Owner); 7446 if (Pos == M.GlobalToLocalDeclIDs.end()) 7447 return 0; 7448 7449 return GlobalID - Owner->BaseDeclID + Pos->second; 7450 } 7451 7452 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7453 const RecordData &Record, 7454 unsigned &Idx) { 7455 if (Idx >= Record.size()) { 7456 Error("Corrupted AST file"); 7457 return 0; 7458 } 7459 7460 return getGlobalDeclID(F, Record[Idx++]); 7461 } 7462 7463 /// Resolve the offset of a statement into a statement. 7464 /// 7465 /// This operation will read a new statement from the external 7466 /// source each time it is called, and is meant to be used via a 7467 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7468 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7469 // Switch case IDs are per Decl. 7470 ClearSwitchCaseIDs(); 7471 7472 // Offset here is a global offset across the entire chain. 7473 RecordLocation Loc = getLocalBitOffset(Offset); 7474 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7475 Error(std::move(Err)); 7476 return nullptr; 7477 } 7478 assert(NumCurrentElementsDeserializing == 0 && 7479 "should not be called while already deserializing"); 7480 Deserializing D(this); 7481 return ReadStmtFromStream(*Loc.F); 7482 } 7483 7484 void ASTReader::FindExternalLexicalDecls( 7485 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7486 SmallVectorImpl<Decl *> &Decls) { 7487 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7488 7489 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7490 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7491 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7492 auto K = (Decl::Kind)+LexicalDecls[I]; 7493 if (!IsKindWeWant(K)) 7494 continue; 7495 7496 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7497 7498 // Don't add predefined declarations to the lexical context more 7499 // than once. 7500 if (ID < NUM_PREDEF_DECL_IDS) { 7501 if (PredefsVisited[ID]) 7502 continue; 7503 7504 PredefsVisited[ID] = true; 7505 } 7506 7507 if (Decl *D = GetLocalDecl(*M, ID)) { 7508 assert(D->getKind() == K && "wrong kind for lexical decl"); 7509 if (!DC->isDeclInLexicalTraversal(D)) 7510 Decls.push_back(D); 7511 } 7512 } 7513 }; 7514 7515 if (isa<TranslationUnitDecl>(DC)) { 7516 for (auto Lexical : TULexicalDecls) 7517 Visit(Lexical.first, Lexical.second); 7518 } else { 7519 auto I = LexicalDecls.find(DC); 7520 if (I != LexicalDecls.end()) 7521 Visit(I->second.first, I->second.second); 7522 } 7523 7524 ++NumLexicalDeclContextsRead; 7525 } 7526 7527 namespace { 7528 7529 class DeclIDComp { 7530 ASTReader &Reader; 7531 ModuleFile &Mod; 7532 7533 public: 7534 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7535 7536 bool operator()(LocalDeclID L, LocalDeclID R) const { 7537 SourceLocation LHS = getLocation(L); 7538 SourceLocation RHS = getLocation(R); 7539 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7540 } 7541 7542 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7543 SourceLocation RHS = getLocation(R); 7544 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7545 } 7546 7547 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7548 SourceLocation LHS = getLocation(L); 7549 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7550 } 7551 7552 SourceLocation getLocation(LocalDeclID ID) const { 7553 return Reader.getSourceManager().getFileLoc( 7554 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7555 } 7556 }; 7557 7558 } // namespace 7559 7560 void ASTReader::FindFileRegionDecls(FileID File, 7561 unsigned Offset, unsigned Length, 7562 SmallVectorImpl<Decl *> &Decls) { 7563 SourceManager &SM = getSourceManager(); 7564 7565 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7566 if (I == FileDeclIDs.end()) 7567 return; 7568 7569 FileDeclsInfo &DInfo = I->second; 7570 if (DInfo.Decls.empty()) 7571 return; 7572 7573 SourceLocation 7574 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7575 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7576 7577 DeclIDComp DIDComp(*this, *DInfo.Mod); 7578 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7579 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7580 if (BeginIt != DInfo.Decls.begin()) 7581 --BeginIt; 7582 7583 // If we are pointing at a top-level decl inside an objc container, we need 7584 // to backtrack until we find it otherwise we will fail to report that the 7585 // region overlaps with an objc container. 7586 while (BeginIt != DInfo.Decls.begin() && 7587 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7588 ->isTopLevelDeclInObjCContainer()) 7589 --BeginIt; 7590 7591 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7592 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7593 if (EndIt != DInfo.Decls.end()) 7594 ++EndIt; 7595 7596 for (ArrayRef<serialization::LocalDeclID>::iterator 7597 DIt = BeginIt; DIt != EndIt; ++DIt) 7598 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7599 } 7600 7601 bool 7602 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7603 DeclarationName Name) { 7604 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7605 "DeclContext has no visible decls in storage"); 7606 if (!Name) 7607 return false; 7608 7609 auto It = Lookups.find(DC); 7610 if (It == Lookups.end()) 7611 return false; 7612 7613 Deserializing LookupResults(this); 7614 7615 // Load the list of declarations. 7616 SmallVector<NamedDecl *, 64> Decls; 7617 llvm::SmallPtrSet<NamedDecl *, 8> Found; 7618 for (DeclID ID : It->second.Table.find(Name)) { 7619 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7620 if (ND->getDeclName() == Name && Found.insert(ND).second) 7621 Decls.push_back(ND); 7622 } 7623 7624 ++NumVisibleDeclContextsRead; 7625 SetExternalVisibleDeclsForName(DC, Name, Decls); 7626 return !Decls.empty(); 7627 } 7628 7629 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7630 if (!DC->hasExternalVisibleStorage()) 7631 return; 7632 7633 auto It = Lookups.find(DC); 7634 assert(It != Lookups.end() && 7635 "have external visible storage but no lookup tables"); 7636 7637 DeclsMap Decls; 7638 7639 for (DeclID ID : It->second.Table.findAll()) { 7640 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7641 Decls[ND->getDeclName()].push_back(ND); 7642 } 7643 7644 ++NumVisibleDeclContextsRead; 7645 7646 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7647 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7648 } 7649 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7650 } 7651 7652 const serialization::reader::DeclContextLookupTable * 7653 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7654 auto I = Lookups.find(Primary); 7655 return I == Lookups.end() ? nullptr : &I->second; 7656 } 7657 7658 /// Under non-PCH compilation the consumer receives the objc methods 7659 /// before receiving the implementation, and codegen depends on this. 7660 /// We simulate this by deserializing and passing to consumer the methods of the 7661 /// implementation before passing the deserialized implementation decl. 7662 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7663 ASTConsumer *Consumer) { 7664 assert(ImplD && Consumer); 7665 7666 for (auto *I : ImplD->methods()) 7667 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7668 7669 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7670 } 7671 7672 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7673 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7674 PassObjCImplDeclToConsumer(ImplD, Consumer); 7675 else 7676 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7677 } 7678 7679 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7680 this->Consumer = Consumer; 7681 7682 if (Consumer) 7683 PassInterestingDeclsToConsumer(); 7684 7685 if (DeserializationListener) 7686 DeserializationListener->ReaderInitialized(this); 7687 } 7688 7689 void ASTReader::PrintStats() { 7690 std::fprintf(stderr, "*** AST File Statistics:\n"); 7691 7692 unsigned NumTypesLoaded 7693 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7694 QualType()); 7695 unsigned NumDeclsLoaded 7696 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7697 (Decl *)nullptr); 7698 unsigned NumIdentifiersLoaded 7699 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7700 IdentifiersLoaded.end(), 7701 (IdentifierInfo *)nullptr); 7702 unsigned NumMacrosLoaded 7703 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7704 MacrosLoaded.end(), 7705 (MacroInfo *)nullptr); 7706 unsigned NumSelectorsLoaded 7707 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7708 SelectorsLoaded.end(), 7709 Selector()); 7710 7711 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7712 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7713 NumSLocEntriesRead, TotalNumSLocEntries, 7714 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7715 if (!TypesLoaded.empty()) 7716 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7717 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7718 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7719 if (!DeclsLoaded.empty()) 7720 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7721 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7722 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7723 if (!IdentifiersLoaded.empty()) 7724 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7725 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7726 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7727 if (!MacrosLoaded.empty()) 7728 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7729 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7730 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7731 if (!SelectorsLoaded.empty()) 7732 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7733 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7734 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7735 if (TotalNumStatements) 7736 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7737 NumStatementsRead, TotalNumStatements, 7738 ((float)NumStatementsRead/TotalNumStatements * 100)); 7739 if (TotalNumMacros) 7740 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7741 NumMacrosRead, TotalNumMacros, 7742 ((float)NumMacrosRead/TotalNumMacros * 100)); 7743 if (TotalLexicalDeclContexts) 7744 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7745 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7746 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7747 * 100)); 7748 if (TotalVisibleDeclContexts) 7749 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7750 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7751 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7752 * 100)); 7753 if (TotalNumMethodPoolEntries) 7754 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7755 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7756 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7757 * 100)); 7758 if (NumMethodPoolLookups) 7759 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7760 NumMethodPoolHits, NumMethodPoolLookups, 7761 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7762 if (NumMethodPoolTableLookups) 7763 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7764 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7765 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7766 * 100.0)); 7767 if (NumIdentifierLookupHits) 7768 std::fprintf(stderr, 7769 " %u / %u identifier table lookups succeeded (%f%%)\n", 7770 NumIdentifierLookupHits, NumIdentifierLookups, 7771 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7772 7773 if (GlobalIndex) { 7774 std::fprintf(stderr, "\n"); 7775 GlobalIndex->printStats(); 7776 } 7777 7778 std::fprintf(stderr, "\n"); 7779 dump(); 7780 std::fprintf(stderr, "\n"); 7781 } 7782 7783 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7784 LLVM_DUMP_METHOD static void 7785 dumpModuleIDMap(StringRef Name, 7786 const ContinuousRangeMap<Key, ModuleFile *, 7787 InitialCapacity> &Map) { 7788 if (Map.begin() == Map.end()) 7789 return; 7790 7791 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7792 7793 llvm::errs() << Name << ":\n"; 7794 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7795 I != IEnd; ++I) { 7796 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7797 << "\n"; 7798 } 7799 } 7800 7801 LLVM_DUMP_METHOD void ASTReader::dump() { 7802 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7803 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7804 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7805 dumpModuleIDMap("Global type map", GlobalTypeMap); 7806 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7807 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7808 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7809 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7810 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7811 dumpModuleIDMap("Global preprocessed entity map", 7812 GlobalPreprocessedEntityMap); 7813 7814 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7815 for (ModuleFile &M : ModuleMgr) 7816 M.dump(); 7817 } 7818 7819 /// Return the amount of memory used by memory buffers, breaking down 7820 /// by heap-backed versus mmap'ed memory. 7821 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7822 for (ModuleFile &I : ModuleMgr) { 7823 if (llvm::MemoryBuffer *buf = I.Buffer) { 7824 size_t bytes = buf->getBufferSize(); 7825 switch (buf->getBufferKind()) { 7826 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7827 sizes.malloc_bytes += bytes; 7828 break; 7829 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7830 sizes.mmap_bytes += bytes; 7831 break; 7832 } 7833 } 7834 } 7835 } 7836 7837 void ASTReader::InitializeSema(Sema &S) { 7838 SemaObj = &S; 7839 S.addExternalSource(this); 7840 7841 // Makes sure any declarations that were deserialized "too early" 7842 // still get added to the identifier's declaration chains. 7843 for (uint64_t ID : PreloadedDeclIDs) { 7844 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7845 pushExternalDeclIntoScope(D, D->getDeclName()); 7846 } 7847 PreloadedDeclIDs.clear(); 7848 7849 // FIXME: What happens if these are changed by a module import? 7850 if (!FPPragmaOptions.empty()) { 7851 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7852 FPOptionsOverride NewOverrides = 7853 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]); 7854 SemaObj->CurFPFeatures = 7855 NewOverrides.applyOverrides(SemaObj->getLangOpts()); 7856 } 7857 7858 SemaObj->OpenCLFeatures = OpenCLExtensions; 7859 7860 UpdateSema(); 7861 } 7862 7863 void ASTReader::UpdateSema() { 7864 assert(SemaObj && "no Sema to update"); 7865 7866 // Load the offsets of the declarations that Sema references. 7867 // They will be lazily deserialized when needed. 7868 if (!SemaDeclRefs.empty()) { 7869 assert(SemaDeclRefs.size() % 3 == 0); 7870 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7871 if (!SemaObj->StdNamespace) 7872 SemaObj->StdNamespace = SemaDeclRefs[I]; 7873 if (!SemaObj->StdBadAlloc) 7874 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7875 if (!SemaObj->StdAlignValT) 7876 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7877 } 7878 SemaDeclRefs.clear(); 7879 } 7880 7881 // Update the state of pragmas. Use the same API as if we had encountered the 7882 // pragma in the source. 7883 if(OptimizeOffPragmaLocation.isValid()) 7884 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7885 if (PragmaMSStructState != -1) 7886 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7887 if (PointersToMembersPragmaLocation.isValid()) { 7888 SemaObj->ActOnPragmaMSPointersToMembers( 7889 (LangOptions::PragmaMSPointersToMembersKind) 7890 PragmaMSPointersToMembersState, 7891 PointersToMembersPragmaLocation); 7892 } 7893 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7894 7895 if (PragmaAlignPackCurrentValue) { 7896 // The bottom of the stack might have a default value. It must be adjusted 7897 // to the current value to ensure that the packing state is preserved after 7898 // popping entries that were included/imported from a PCH/module. 7899 bool DropFirst = false; 7900 if (!PragmaAlignPackStack.empty() && 7901 PragmaAlignPackStack.front().Location.isInvalid()) { 7902 assert(PragmaAlignPackStack.front().Value == 7903 SemaObj->AlignPackStack.DefaultValue && 7904 "Expected a default alignment value"); 7905 SemaObj->AlignPackStack.Stack.emplace_back( 7906 PragmaAlignPackStack.front().SlotLabel, 7907 SemaObj->AlignPackStack.CurrentValue, 7908 SemaObj->AlignPackStack.CurrentPragmaLocation, 7909 PragmaAlignPackStack.front().PushLocation); 7910 DropFirst = true; 7911 } 7912 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack) 7913 .drop_front(DropFirst ? 1 : 0)) { 7914 SemaObj->AlignPackStack.Stack.emplace_back( 7915 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7916 } 7917 if (PragmaAlignPackCurrentLocation.isInvalid()) { 7918 assert(*PragmaAlignPackCurrentValue == 7919 SemaObj->AlignPackStack.DefaultValue && 7920 "Expected a default align and pack value"); 7921 // Keep the current values. 7922 } else { 7923 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue; 7924 SemaObj->AlignPackStack.CurrentPragmaLocation = 7925 PragmaAlignPackCurrentLocation; 7926 } 7927 } 7928 if (FpPragmaCurrentValue) { 7929 // The bottom of the stack might have a default value. It must be adjusted 7930 // to the current value to ensure that fp-pragma state is preserved after 7931 // popping entries that were included/imported from a PCH/module. 7932 bool DropFirst = false; 7933 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7934 assert(FpPragmaStack.front().Value == 7935 SemaObj->FpPragmaStack.DefaultValue && 7936 "Expected a default pragma float_control value"); 7937 SemaObj->FpPragmaStack.Stack.emplace_back( 7938 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7939 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7940 FpPragmaStack.front().PushLocation); 7941 DropFirst = true; 7942 } 7943 for (const auto &Entry : 7944 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7945 SemaObj->FpPragmaStack.Stack.emplace_back( 7946 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7947 if (FpPragmaCurrentLocation.isInvalid()) { 7948 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 7949 "Expected a default pragma float_control value"); 7950 // Keep the current values. 7951 } else { 7952 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 7953 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 7954 } 7955 } 7956 7957 // For non-modular AST files, restore visiblity of modules. 7958 for (auto &Import : ImportedModules) { 7959 if (Import.ImportLoc.isInvalid()) 7960 continue; 7961 if (Module *Imported = getSubmodule(Import.ID)) { 7962 SemaObj->makeModuleVisible(Imported, Import.ImportLoc); 7963 } 7964 } 7965 } 7966 7967 IdentifierInfo *ASTReader::get(StringRef Name) { 7968 // Note that we are loading an identifier. 7969 Deserializing AnIdentifier(this); 7970 7971 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7972 NumIdentifierLookups, 7973 NumIdentifierLookupHits); 7974 7975 // We don't need to do identifier table lookups in C++ modules (we preload 7976 // all interesting declarations, and don't need to use the scope for name 7977 // lookups). Perform the lookup in PCH files, though, since we don't build 7978 // a complete initial identifier table if we're carrying on from a PCH. 7979 if (PP.getLangOpts().CPlusPlus) { 7980 for (auto F : ModuleMgr.pch_modules()) 7981 if (Visitor(*F)) 7982 break; 7983 } else { 7984 // If there is a global index, look there first to determine which modules 7985 // provably do not have any results for this identifier. 7986 GlobalModuleIndex::HitSet Hits; 7987 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7988 if (!loadGlobalIndex()) { 7989 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7990 HitsPtr = &Hits; 7991 } 7992 } 7993 7994 ModuleMgr.visit(Visitor, HitsPtr); 7995 } 7996 7997 IdentifierInfo *II = Visitor.getIdentifierInfo(); 7998 markIdentifierUpToDate(II); 7999 return II; 8000 } 8001 8002 namespace clang { 8003 8004 /// An identifier-lookup iterator that enumerates all of the 8005 /// identifiers stored within a set of AST files. 8006 class ASTIdentifierIterator : public IdentifierIterator { 8007 /// The AST reader whose identifiers are being enumerated. 8008 const ASTReader &Reader; 8009 8010 /// The current index into the chain of AST files stored in 8011 /// the AST reader. 8012 unsigned Index; 8013 8014 /// The current position within the identifier lookup table 8015 /// of the current AST file. 8016 ASTIdentifierLookupTable::key_iterator Current; 8017 8018 /// The end position within the identifier lookup table of 8019 /// the current AST file. 8020 ASTIdentifierLookupTable::key_iterator End; 8021 8022 /// Whether to skip any modules in the ASTReader. 8023 bool SkipModules; 8024 8025 public: 8026 explicit ASTIdentifierIterator(const ASTReader &Reader, 8027 bool SkipModules = false); 8028 8029 StringRef Next() override; 8030 }; 8031 8032 } // namespace clang 8033 8034 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 8035 bool SkipModules) 8036 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8037 } 8038 8039 StringRef ASTIdentifierIterator::Next() { 8040 while (Current == End) { 8041 // If we have exhausted all of our AST files, we're done. 8042 if (Index == 0) 8043 return StringRef(); 8044 8045 --Index; 8046 ModuleFile &F = Reader.ModuleMgr[Index]; 8047 if (SkipModules && F.isModule()) 8048 continue; 8049 8050 ASTIdentifierLookupTable *IdTable = 8051 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8052 Current = IdTable->key_begin(); 8053 End = IdTable->key_end(); 8054 } 8055 8056 // We have any identifiers remaining in the current AST file; return 8057 // the next one. 8058 StringRef Result = *Current; 8059 ++Current; 8060 return Result; 8061 } 8062 8063 namespace { 8064 8065 /// A utility for appending two IdentifierIterators. 8066 class ChainedIdentifierIterator : public IdentifierIterator { 8067 std::unique_ptr<IdentifierIterator> Current; 8068 std::unique_ptr<IdentifierIterator> Queued; 8069 8070 public: 8071 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8072 std::unique_ptr<IdentifierIterator> Second) 8073 : Current(std::move(First)), Queued(std::move(Second)) {} 8074 8075 StringRef Next() override { 8076 if (!Current) 8077 return StringRef(); 8078 8079 StringRef result = Current->Next(); 8080 if (!result.empty()) 8081 return result; 8082 8083 // Try the queued iterator, which may itself be empty. 8084 Current.reset(); 8085 std::swap(Current, Queued); 8086 return Next(); 8087 } 8088 }; 8089 8090 } // namespace 8091 8092 IdentifierIterator *ASTReader::getIdentifiers() { 8093 if (!loadGlobalIndex()) { 8094 std::unique_ptr<IdentifierIterator> ReaderIter( 8095 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8096 std::unique_ptr<IdentifierIterator> ModulesIter( 8097 GlobalIndex->createIdentifierIterator()); 8098 return new ChainedIdentifierIterator(std::move(ReaderIter), 8099 std::move(ModulesIter)); 8100 } 8101 8102 return new ASTIdentifierIterator(*this); 8103 } 8104 8105 namespace clang { 8106 namespace serialization { 8107 8108 class ReadMethodPoolVisitor { 8109 ASTReader &Reader; 8110 Selector Sel; 8111 unsigned PriorGeneration; 8112 unsigned InstanceBits = 0; 8113 unsigned FactoryBits = 0; 8114 bool InstanceHasMoreThanOneDecl = false; 8115 bool FactoryHasMoreThanOneDecl = false; 8116 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8117 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8118 8119 public: 8120 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8121 unsigned PriorGeneration) 8122 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8123 8124 bool operator()(ModuleFile &M) { 8125 if (!M.SelectorLookupTable) 8126 return false; 8127 8128 // If we've already searched this module file, skip it now. 8129 if (M.Generation <= PriorGeneration) 8130 return true; 8131 8132 ++Reader.NumMethodPoolTableLookups; 8133 ASTSelectorLookupTable *PoolTable 8134 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8135 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8136 if (Pos == PoolTable->end()) 8137 return false; 8138 8139 ++Reader.NumMethodPoolTableHits; 8140 ++Reader.NumSelectorsRead; 8141 // FIXME: Not quite happy with the statistics here. We probably should 8142 // disable this tracking when called via LoadSelector. 8143 // Also, should entries without methods count as misses? 8144 ++Reader.NumMethodPoolEntriesRead; 8145 ASTSelectorLookupTrait::data_type Data = *Pos; 8146 if (Reader.DeserializationListener) 8147 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8148 8149 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8150 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8151 InstanceBits = Data.InstanceBits; 8152 FactoryBits = Data.FactoryBits; 8153 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8154 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8155 return true; 8156 } 8157 8158 /// Retrieve the instance methods found by this visitor. 8159 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8160 return InstanceMethods; 8161 } 8162 8163 /// Retrieve the instance methods found by this visitor. 8164 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8165 return FactoryMethods; 8166 } 8167 8168 unsigned getInstanceBits() const { return InstanceBits; } 8169 unsigned getFactoryBits() const { return FactoryBits; } 8170 8171 bool instanceHasMoreThanOneDecl() const { 8172 return InstanceHasMoreThanOneDecl; 8173 } 8174 8175 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8176 }; 8177 8178 } // namespace serialization 8179 } // namespace clang 8180 8181 /// Add the given set of methods to the method list. 8182 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8183 ObjCMethodList &List) { 8184 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8185 S.addMethodToGlobalList(&List, Methods[I]); 8186 } 8187 } 8188 8189 void ASTReader::ReadMethodPool(Selector Sel) { 8190 // Get the selector generation and update it to the current generation. 8191 unsigned &Generation = SelectorGeneration[Sel]; 8192 unsigned PriorGeneration = Generation; 8193 Generation = getGeneration(); 8194 SelectorOutOfDate[Sel] = false; 8195 8196 // Search for methods defined with this selector. 8197 ++NumMethodPoolLookups; 8198 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8199 ModuleMgr.visit(Visitor); 8200 8201 if (Visitor.getInstanceMethods().empty() && 8202 Visitor.getFactoryMethods().empty()) 8203 return; 8204 8205 ++NumMethodPoolHits; 8206 8207 if (!getSema()) 8208 return; 8209 8210 Sema &S = *getSema(); 8211 Sema::GlobalMethodPool::iterator Pos = 8212 S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethodPool::Lists())) 8213 .first; 8214 8215 Pos->second.first.setBits(Visitor.getInstanceBits()); 8216 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8217 Pos->second.second.setBits(Visitor.getFactoryBits()); 8218 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8219 8220 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8221 // when building a module we keep every method individually and may need to 8222 // update hasMoreThanOneDecl as we add the methods. 8223 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8224 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8225 } 8226 8227 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8228 if (SelectorOutOfDate[Sel]) 8229 ReadMethodPool(Sel); 8230 } 8231 8232 void ASTReader::ReadKnownNamespaces( 8233 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8234 Namespaces.clear(); 8235 8236 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8237 if (NamespaceDecl *Namespace 8238 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8239 Namespaces.push_back(Namespace); 8240 } 8241 } 8242 8243 void ASTReader::ReadUndefinedButUsed( 8244 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8245 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8246 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8247 SourceLocation Loc = 8248 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8249 Undefined.insert(std::make_pair(D, Loc)); 8250 } 8251 } 8252 8253 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8254 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8255 Exprs) { 8256 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8257 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8258 uint64_t Count = DelayedDeleteExprs[Idx++]; 8259 for (uint64_t C = 0; C < Count; ++C) { 8260 SourceLocation DeleteLoc = 8261 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8262 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8263 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8264 } 8265 } 8266 } 8267 8268 void ASTReader::ReadTentativeDefinitions( 8269 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8270 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8271 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8272 if (Var) 8273 TentativeDefs.push_back(Var); 8274 } 8275 TentativeDefinitions.clear(); 8276 } 8277 8278 void ASTReader::ReadUnusedFileScopedDecls( 8279 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8280 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8281 DeclaratorDecl *D 8282 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8283 if (D) 8284 Decls.push_back(D); 8285 } 8286 UnusedFileScopedDecls.clear(); 8287 } 8288 8289 void ASTReader::ReadDelegatingConstructors( 8290 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8291 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8292 CXXConstructorDecl *D 8293 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8294 if (D) 8295 Decls.push_back(D); 8296 } 8297 DelegatingCtorDecls.clear(); 8298 } 8299 8300 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8301 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8302 TypedefNameDecl *D 8303 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8304 if (D) 8305 Decls.push_back(D); 8306 } 8307 ExtVectorDecls.clear(); 8308 } 8309 8310 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8311 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8312 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8313 ++I) { 8314 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8315 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8316 if (D) 8317 Decls.insert(D); 8318 } 8319 UnusedLocalTypedefNameCandidates.clear(); 8320 } 8321 8322 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8323 llvm::SmallSetVector<Decl *, 4> &Decls) { 8324 for (auto I : DeclsToCheckForDeferredDiags) { 8325 auto *D = dyn_cast_or_null<Decl>(GetDecl(I)); 8326 if (D) 8327 Decls.insert(D); 8328 } 8329 DeclsToCheckForDeferredDiags.clear(); 8330 } 8331 8332 void ASTReader::ReadReferencedSelectors( 8333 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8334 if (ReferencedSelectorsData.empty()) 8335 return; 8336 8337 // If there are @selector references added them to its pool. This is for 8338 // implementation of -Wselector. 8339 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8340 unsigned I = 0; 8341 while (I < DataSize) { 8342 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8343 SourceLocation SelLoc 8344 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8345 Sels.push_back(std::make_pair(Sel, SelLoc)); 8346 } 8347 ReferencedSelectorsData.clear(); 8348 } 8349 8350 void ASTReader::ReadWeakUndeclaredIdentifiers( 8351 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8352 if (WeakUndeclaredIdentifiers.empty()) 8353 return; 8354 8355 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8356 IdentifierInfo *WeakId 8357 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8358 IdentifierInfo *AliasId 8359 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8360 SourceLocation Loc 8361 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8362 bool Used = WeakUndeclaredIdentifiers[I++]; 8363 WeakInfo WI(AliasId, Loc); 8364 WI.setUsed(Used); 8365 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8366 } 8367 WeakUndeclaredIdentifiers.clear(); 8368 } 8369 8370 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8371 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8372 ExternalVTableUse VT; 8373 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8374 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8375 VT.DefinitionRequired = VTableUses[Idx++]; 8376 VTables.push_back(VT); 8377 } 8378 8379 VTableUses.clear(); 8380 } 8381 8382 void ASTReader::ReadPendingInstantiations( 8383 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8384 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8385 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8386 SourceLocation Loc 8387 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8388 8389 Pending.push_back(std::make_pair(D, Loc)); 8390 } 8391 PendingInstantiations.clear(); 8392 } 8393 8394 void ASTReader::ReadLateParsedTemplates( 8395 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8396 &LPTMap) { 8397 for (auto &LPT : LateParsedTemplates) { 8398 ModuleFile *FMod = LPT.first; 8399 RecordDataImpl &LateParsed = LPT.second; 8400 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; 8401 /* In loop */) { 8402 FunctionDecl *FD = 8403 cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++])); 8404 8405 auto LT = std::make_unique<LateParsedTemplate>(); 8406 LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]); 8407 8408 ModuleFile *F = getOwningModuleFile(LT->D); 8409 assert(F && "No module"); 8410 8411 unsigned TokN = LateParsed[Idx++]; 8412 LT->Toks.reserve(TokN); 8413 for (unsigned T = 0; T < TokN; ++T) 8414 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx)); 8415 8416 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8417 } 8418 } 8419 8420 LateParsedTemplates.clear(); 8421 } 8422 8423 void ASTReader::LoadSelector(Selector Sel) { 8424 // It would be complicated to avoid reading the methods anyway. So don't. 8425 ReadMethodPool(Sel); 8426 } 8427 8428 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8429 assert(ID && "Non-zero identifier ID required"); 8430 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8431 IdentifiersLoaded[ID - 1] = II; 8432 if (DeserializationListener) 8433 DeserializationListener->IdentifierRead(ID, II); 8434 } 8435 8436 /// Set the globally-visible declarations associated with the given 8437 /// identifier. 8438 /// 8439 /// If the AST reader is currently in a state where the given declaration IDs 8440 /// cannot safely be resolved, they are queued until it is safe to resolve 8441 /// them. 8442 /// 8443 /// \param II an IdentifierInfo that refers to one or more globally-visible 8444 /// declarations. 8445 /// 8446 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8447 /// visible at global scope. 8448 /// 8449 /// \param Decls if non-null, this vector will be populated with the set of 8450 /// deserialized declarations. These declarations will not be pushed into 8451 /// scope. 8452 void 8453 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8454 const SmallVectorImpl<uint32_t> &DeclIDs, 8455 SmallVectorImpl<Decl *> *Decls) { 8456 if (NumCurrentElementsDeserializing && !Decls) { 8457 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8458 return; 8459 } 8460 8461 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8462 if (!SemaObj) { 8463 // Queue this declaration so that it will be added to the 8464 // translation unit scope and identifier's declaration chain 8465 // once a Sema object is known. 8466 PreloadedDeclIDs.push_back(DeclIDs[I]); 8467 continue; 8468 } 8469 8470 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8471 8472 // If we're simply supposed to record the declarations, do so now. 8473 if (Decls) { 8474 Decls->push_back(D); 8475 continue; 8476 } 8477 8478 // Introduce this declaration into the translation-unit scope 8479 // and add it to the declaration chain for this identifier, so 8480 // that (unqualified) name lookup will find it. 8481 pushExternalDeclIntoScope(D, II); 8482 } 8483 } 8484 8485 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8486 if (ID == 0) 8487 return nullptr; 8488 8489 if (IdentifiersLoaded.empty()) { 8490 Error("no identifier table in AST file"); 8491 return nullptr; 8492 } 8493 8494 ID -= 1; 8495 if (!IdentifiersLoaded[ID]) { 8496 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8497 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8498 ModuleFile *M = I->second; 8499 unsigned Index = ID - M->BaseIdentifierID; 8500 const unsigned char *Data = 8501 M->IdentifierTableData + M->IdentifierOffsets[Index]; 8502 8503 ASTIdentifierLookupTrait Trait(*this, *M); 8504 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 8505 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 8506 auto &II = PP.getIdentifierTable().get(Key); 8507 IdentifiersLoaded[ID] = &II; 8508 markIdentifierFromAST(*this, II); 8509 if (DeserializationListener) 8510 DeserializationListener->IdentifierRead(ID + 1, &II); 8511 } 8512 8513 return IdentifiersLoaded[ID]; 8514 } 8515 8516 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8517 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8518 } 8519 8520 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8521 if (LocalID < NUM_PREDEF_IDENT_IDS) 8522 return LocalID; 8523 8524 if (!M.ModuleOffsetMap.empty()) 8525 ReadModuleOffsetMap(M); 8526 8527 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8528 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8529 assert(I != M.IdentifierRemap.end() 8530 && "Invalid index into identifier index remap"); 8531 8532 return LocalID + I->second; 8533 } 8534 8535 MacroInfo *ASTReader::getMacro(MacroID ID) { 8536 if (ID == 0) 8537 return nullptr; 8538 8539 if (MacrosLoaded.empty()) { 8540 Error("no macro table in AST file"); 8541 return nullptr; 8542 } 8543 8544 ID -= NUM_PREDEF_MACRO_IDS; 8545 if (!MacrosLoaded[ID]) { 8546 GlobalMacroMapType::iterator I 8547 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8548 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8549 ModuleFile *M = I->second; 8550 unsigned Index = ID - M->BaseMacroID; 8551 MacrosLoaded[ID] = 8552 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8553 8554 if (DeserializationListener) 8555 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8556 MacrosLoaded[ID]); 8557 } 8558 8559 return MacrosLoaded[ID]; 8560 } 8561 8562 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8563 if (LocalID < NUM_PREDEF_MACRO_IDS) 8564 return LocalID; 8565 8566 if (!M.ModuleOffsetMap.empty()) 8567 ReadModuleOffsetMap(M); 8568 8569 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8570 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8571 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8572 8573 return LocalID + I->second; 8574 } 8575 8576 serialization::SubmoduleID 8577 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8578 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8579 return LocalID; 8580 8581 if (!M.ModuleOffsetMap.empty()) 8582 ReadModuleOffsetMap(M); 8583 8584 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8585 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8586 assert(I != M.SubmoduleRemap.end() 8587 && "Invalid index into submodule index remap"); 8588 8589 return LocalID + I->second; 8590 } 8591 8592 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8593 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8594 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8595 return nullptr; 8596 } 8597 8598 if (GlobalID > SubmodulesLoaded.size()) { 8599 Error("submodule ID out of range in AST file"); 8600 return nullptr; 8601 } 8602 8603 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8604 } 8605 8606 Module *ASTReader::getModule(unsigned ID) { 8607 return getSubmodule(ID); 8608 } 8609 8610 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8611 if (ID & 1) { 8612 // It's a module, look it up by submodule ID. 8613 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8614 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8615 } else { 8616 // It's a prefix (preamble, PCH, ...). Look it up by index. 8617 unsigned IndexFromEnd = ID >> 1; 8618 assert(IndexFromEnd && "got reference to unknown module file"); 8619 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8620 } 8621 } 8622 8623 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8624 if (!F) 8625 return 1; 8626 8627 // For a file representing a module, use the submodule ID of the top-level 8628 // module as the file ID. For any other kind of file, the number of such 8629 // files loaded beforehand will be the same on reload. 8630 // FIXME: Is this true even if we have an explicit module file and a PCH? 8631 if (F->isModule()) 8632 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8633 8634 auto PCHModules = getModuleManager().pch_modules(); 8635 auto I = llvm::find(PCHModules, F); 8636 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8637 return (I - PCHModules.end()) << 1; 8638 } 8639 8640 llvm::Optional<ASTSourceDescriptor> 8641 ASTReader::getSourceDescriptor(unsigned ID) { 8642 if (Module *M = getSubmodule(ID)) 8643 return ASTSourceDescriptor(*M); 8644 8645 // If there is only a single PCH, return it instead. 8646 // Chained PCH are not supported. 8647 const auto &PCHChain = ModuleMgr.pch_modules(); 8648 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8649 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8650 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8651 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8652 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8653 MF.Signature); 8654 } 8655 return None; 8656 } 8657 8658 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8659 auto I = DefinitionSource.find(FD); 8660 if (I == DefinitionSource.end()) 8661 return EK_ReplyHazy; 8662 return I->second ? EK_Never : EK_Always; 8663 } 8664 8665 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8666 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8667 } 8668 8669 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8670 if (ID == 0) 8671 return Selector(); 8672 8673 if (ID > SelectorsLoaded.size()) { 8674 Error("selector ID out of range in AST file"); 8675 return Selector(); 8676 } 8677 8678 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8679 // Load this selector from the selector table. 8680 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8681 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8682 ModuleFile &M = *I->second; 8683 ASTSelectorLookupTrait Trait(*this, M); 8684 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8685 SelectorsLoaded[ID - 1] = 8686 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8687 if (DeserializationListener) 8688 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8689 } 8690 8691 return SelectorsLoaded[ID - 1]; 8692 } 8693 8694 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8695 return DecodeSelector(ID); 8696 } 8697 8698 uint32_t ASTReader::GetNumExternalSelectors() { 8699 // ID 0 (the null selector) is considered an external selector. 8700 return getTotalNumSelectors() + 1; 8701 } 8702 8703 serialization::SelectorID 8704 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8705 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8706 return LocalID; 8707 8708 if (!M.ModuleOffsetMap.empty()) 8709 ReadModuleOffsetMap(M); 8710 8711 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8712 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8713 assert(I != M.SelectorRemap.end() 8714 && "Invalid index into selector index remap"); 8715 8716 return LocalID + I->second; 8717 } 8718 8719 DeclarationNameLoc 8720 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8721 switch (Name.getNameKind()) { 8722 case DeclarationName::CXXConstructorName: 8723 case DeclarationName::CXXDestructorName: 8724 case DeclarationName::CXXConversionFunctionName: 8725 return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo()); 8726 8727 case DeclarationName::CXXOperatorName: 8728 return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange()); 8729 8730 case DeclarationName::CXXLiteralOperatorName: 8731 return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc( 8732 readSourceLocation()); 8733 8734 case DeclarationName::Identifier: 8735 case DeclarationName::ObjCZeroArgSelector: 8736 case DeclarationName::ObjCOneArgSelector: 8737 case DeclarationName::ObjCMultiArgSelector: 8738 case DeclarationName::CXXUsingDirective: 8739 case DeclarationName::CXXDeductionGuideName: 8740 break; 8741 } 8742 return DeclarationNameLoc(); 8743 } 8744 8745 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8746 DeclarationNameInfo NameInfo; 8747 NameInfo.setName(readDeclarationName()); 8748 NameInfo.setLoc(readSourceLocation()); 8749 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8750 return NameInfo; 8751 } 8752 8753 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8754 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8755 unsigned NumTPLists = readInt(); 8756 Info.NumTemplParamLists = NumTPLists; 8757 if (NumTPLists) { 8758 Info.TemplParamLists = 8759 new (getContext()) TemplateParameterList *[NumTPLists]; 8760 for (unsigned i = 0; i != NumTPLists; ++i) 8761 Info.TemplParamLists[i] = readTemplateParameterList(); 8762 } 8763 } 8764 8765 TemplateParameterList * 8766 ASTRecordReader::readTemplateParameterList() { 8767 SourceLocation TemplateLoc = readSourceLocation(); 8768 SourceLocation LAngleLoc = readSourceLocation(); 8769 SourceLocation RAngleLoc = readSourceLocation(); 8770 8771 unsigned NumParams = readInt(); 8772 SmallVector<NamedDecl *, 16> Params; 8773 Params.reserve(NumParams); 8774 while (NumParams--) 8775 Params.push_back(readDeclAs<NamedDecl>()); 8776 8777 bool HasRequiresClause = readBool(); 8778 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8779 8780 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8781 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8782 return TemplateParams; 8783 } 8784 8785 void ASTRecordReader::readTemplateArgumentList( 8786 SmallVectorImpl<TemplateArgument> &TemplArgs, 8787 bool Canonicalize) { 8788 unsigned NumTemplateArgs = readInt(); 8789 TemplArgs.reserve(NumTemplateArgs); 8790 while (NumTemplateArgs--) 8791 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8792 } 8793 8794 /// Read a UnresolvedSet structure. 8795 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8796 unsigned NumDecls = readInt(); 8797 Set.reserve(getContext(), NumDecls); 8798 while (NumDecls--) { 8799 DeclID ID = readDeclID(); 8800 AccessSpecifier AS = (AccessSpecifier) readInt(); 8801 Set.addLazyDecl(getContext(), ID, AS); 8802 } 8803 } 8804 8805 CXXBaseSpecifier 8806 ASTRecordReader::readCXXBaseSpecifier() { 8807 bool isVirtual = readBool(); 8808 bool isBaseOfClass = readBool(); 8809 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8810 bool inheritConstructors = readBool(); 8811 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8812 SourceRange Range = readSourceRange(); 8813 SourceLocation EllipsisLoc = readSourceLocation(); 8814 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8815 EllipsisLoc); 8816 Result.setInheritConstructors(inheritConstructors); 8817 return Result; 8818 } 8819 8820 CXXCtorInitializer ** 8821 ASTRecordReader::readCXXCtorInitializers() { 8822 ASTContext &Context = getContext(); 8823 unsigned NumInitializers = readInt(); 8824 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8825 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8826 for (unsigned i = 0; i != NumInitializers; ++i) { 8827 TypeSourceInfo *TInfo = nullptr; 8828 bool IsBaseVirtual = false; 8829 FieldDecl *Member = nullptr; 8830 IndirectFieldDecl *IndirectMember = nullptr; 8831 8832 CtorInitializerType Type = (CtorInitializerType) readInt(); 8833 switch (Type) { 8834 case CTOR_INITIALIZER_BASE: 8835 TInfo = readTypeSourceInfo(); 8836 IsBaseVirtual = readBool(); 8837 break; 8838 8839 case CTOR_INITIALIZER_DELEGATING: 8840 TInfo = readTypeSourceInfo(); 8841 break; 8842 8843 case CTOR_INITIALIZER_MEMBER: 8844 Member = readDeclAs<FieldDecl>(); 8845 break; 8846 8847 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8848 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8849 break; 8850 } 8851 8852 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8853 Expr *Init = readExpr(); 8854 SourceLocation LParenLoc = readSourceLocation(); 8855 SourceLocation RParenLoc = readSourceLocation(); 8856 8857 CXXCtorInitializer *BOMInit; 8858 if (Type == CTOR_INITIALIZER_BASE) 8859 BOMInit = new (Context) 8860 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8861 RParenLoc, MemberOrEllipsisLoc); 8862 else if (Type == CTOR_INITIALIZER_DELEGATING) 8863 BOMInit = new (Context) 8864 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8865 else if (Member) 8866 BOMInit = new (Context) 8867 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8868 Init, RParenLoc); 8869 else 8870 BOMInit = new (Context) 8871 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8872 LParenLoc, Init, RParenLoc); 8873 8874 if (/*IsWritten*/readBool()) { 8875 unsigned SourceOrder = readInt(); 8876 BOMInit->setSourceOrder(SourceOrder); 8877 } 8878 8879 CtorInitializers[i] = BOMInit; 8880 } 8881 8882 return CtorInitializers; 8883 } 8884 8885 NestedNameSpecifierLoc 8886 ASTRecordReader::readNestedNameSpecifierLoc() { 8887 ASTContext &Context = getContext(); 8888 unsigned N = readInt(); 8889 NestedNameSpecifierLocBuilder Builder; 8890 for (unsigned I = 0; I != N; ++I) { 8891 auto Kind = readNestedNameSpecifierKind(); 8892 switch (Kind) { 8893 case NestedNameSpecifier::Identifier: { 8894 IdentifierInfo *II = readIdentifier(); 8895 SourceRange Range = readSourceRange(); 8896 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8897 break; 8898 } 8899 8900 case NestedNameSpecifier::Namespace: { 8901 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8902 SourceRange Range = readSourceRange(); 8903 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8904 break; 8905 } 8906 8907 case NestedNameSpecifier::NamespaceAlias: { 8908 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8909 SourceRange Range = readSourceRange(); 8910 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8911 break; 8912 } 8913 8914 case NestedNameSpecifier::TypeSpec: 8915 case NestedNameSpecifier::TypeSpecWithTemplate: { 8916 bool Template = readBool(); 8917 TypeSourceInfo *T = readTypeSourceInfo(); 8918 if (!T) 8919 return NestedNameSpecifierLoc(); 8920 SourceLocation ColonColonLoc = readSourceLocation(); 8921 8922 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8923 Builder.Extend(Context, 8924 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8925 T->getTypeLoc(), ColonColonLoc); 8926 break; 8927 } 8928 8929 case NestedNameSpecifier::Global: { 8930 SourceLocation ColonColonLoc = readSourceLocation(); 8931 Builder.MakeGlobal(Context, ColonColonLoc); 8932 break; 8933 } 8934 8935 case NestedNameSpecifier::Super: { 8936 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8937 SourceRange Range = readSourceRange(); 8938 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8939 break; 8940 } 8941 } 8942 } 8943 8944 return Builder.getWithLocInContext(Context); 8945 } 8946 8947 SourceRange 8948 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8949 unsigned &Idx) { 8950 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8951 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8952 return SourceRange(beg, end); 8953 } 8954 8955 /// Read a floating-point value 8956 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 8957 return llvm::APFloat(Sem, readAPInt()); 8958 } 8959 8960 // Read a string 8961 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8962 unsigned Len = Record[Idx++]; 8963 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8964 Idx += Len; 8965 return Result; 8966 } 8967 8968 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8969 unsigned &Idx) { 8970 std::string Filename = ReadString(Record, Idx); 8971 ResolveImportedPath(F, Filename); 8972 return Filename; 8973 } 8974 8975 std::string ASTReader::ReadPath(StringRef BaseDirectory, 8976 const RecordData &Record, unsigned &Idx) { 8977 std::string Filename = ReadString(Record, Idx); 8978 if (!BaseDirectory.empty()) 8979 ResolveImportedPath(Filename, BaseDirectory); 8980 return Filename; 8981 } 8982 8983 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8984 unsigned &Idx) { 8985 unsigned Major = Record[Idx++]; 8986 unsigned Minor = Record[Idx++]; 8987 unsigned Subminor = Record[Idx++]; 8988 if (Minor == 0) 8989 return VersionTuple(Major); 8990 if (Subminor == 0) 8991 return VersionTuple(Major, Minor - 1); 8992 return VersionTuple(Major, Minor - 1, Subminor - 1); 8993 } 8994 8995 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 8996 const RecordData &Record, 8997 unsigned &Idx) { 8998 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 8999 return CXXTemporary::Create(getContext(), Decl); 9000 } 9001 9002 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9003 return Diag(CurrentImportLoc, DiagID); 9004 } 9005 9006 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9007 return Diags.Report(Loc, DiagID); 9008 } 9009 9010 /// Retrieve the identifier table associated with the 9011 /// preprocessor. 9012 IdentifierTable &ASTReader::getIdentifierTable() { 9013 return PP.getIdentifierTable(); 9014 } 9015 9016 /// Record that the given ID maps to the given switch-case 9017 /// statement. 9018 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9019 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9020 "Already have a SwitchCase with this ID"); 9021 (*CurrSwitchCaseStmts)[ID] = SC; 9022 } 9023 9024 /// Retrieve the switch-case statement with the given ID. 9025 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9026 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9027 return (*CurrSwitchCaseStmts)[ID]; 9028 } 9029 9030 void ASTReader::ClearSwitchCaseIDs() { 9031 CurrSwitchCaseStmts->clear(); 9032 } 9033 9034 void ASTReader::ReadComments() { 9035 ASTContext &Context = getContext(); 9036 std::vector<RawComment *> Comments; 9037 for (SmallVectorImpl<std::pair<BitstreamCursor, 9038 serialization::ModuleFile *>>::iterator 9039 I = CommentsCursors.begin(), 9040 E = CommentsCursors.end(); 9041 I != E; ++I) { 9042 Comments.clear(); 9043 BitstreamCursor &Cursor = I->first; 9044 serialization::ModuleFile &F = *I->second; 9045 SavedStreamPosition SavedPosition(Cursor); 9046 9047 RecordData Record; 9048 while (true) { 9049 Expected<llvm::BitstreamEntry> MaybeEntry = 9050 Cursor.advanceSkippingSubblocks( 9051 BitstreamCursor::AF_DontPopBlockAtEnd); 9052 if (!MaybeEntry) { 9053 Error(MaybeEntry.takeError()); 9054 return; 9055 } 9056 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9057 9058 switch (Entry.Kind) { 9059 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9060 case llvm::BitstreamEntry::Error: 9061 Error("malformed block record in AST file"); 9062 return; 9063 case llvm::BitstreamEntry::EndBlock: 9064 goto NextCursor; 9065 case llvm::BitstreamEntry::Record: 9066 // The interesting case. 9067 break; 9068 } 9069 9070 // Read a record. 9071 Record.clear(); 9072 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9073 if (!MaybeComment) { 9074 Error(MaybeComment.takeError()); 9075 return; 9076 } 9077 switch ((CommentRecordTypes)MaybeComment.get()) { 9078 case COMMENTS_RAW_COMMENT: { 9079 unsigned Idx = 0; 9080 SourceRange SR = ReadSourceRange(F, Record, Idx); 9081 RawComment::CommentKind Kind = 9082 (RawComment::CommentKind) Record[Idx++]; 9083 bool IsTrailingComment = Record[Idx++]; 9084 bool IsAlmostTrailingComment = Record[Idx++]; 9085 Comments.push_back(new (Context) RawComment( 9086 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9087 break; 9088 } 9089 } 9090 } 9091 NextCursor: 9092 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9093 FileToOffsetToComment; 9094 for (RawComment *C : Comments) { 9095 SourceLocation CommentLoc = C->getBeginLoc(); 9096 if (CommentLoc.isValid()) { 9097 std::pair<FileID, unsigned> Loc = 9098 SourceMgr.getDecomposedLoc(CommentLoc); 9099 if (Loc.first.isValid()) 9100 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9101 } 9102 } 9103 } 9104 } 9105 9106 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9107 bool IncludeSystem, bool Complain, 9108 llvm::function_ref<void(const serialization::InputFile &IF, 9109 bool isSystem)> Visitor) { 9110 unsigned NumUserInputs = MF.NumUserInputFiles; 9111 unsigned NumInputs = MF.InputFilesLoaded.size(); 9112 assert(NumUserInputs <= NumInputs); 9113 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9114 for (unsigned I = 0; I < N; ++I) { 9115 bool IsSystem = I >= NumUserInputs; 9116 InputFile IF = getInputFile(MF, I+1, Complain); 9117 Visitor(IF, IsSystem); 9118 } 9119 } 9120 9121 void ASTReader::visitTopLevelModuleMaps( 9122 serialization::ModuleFile &MF, 9123 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9124 unsigned NumInputs = MF.InputFilesLoaded.size(); 9125 for (unsigned I = 0; I < NumInputs; ++I) { 9126 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9127 if (IFI.TopLevelModuleMap) 9128 // FIXME: This unnecessarily re-reads the InputFileInfo. 9129 if (auto FE = getInputFile(MF, I + 1).getFile()) 9130 Visitor(FE); 9131 } 9132 } 9133 9134 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9135 // If we know the owning module, use it. 9136 if (Module *M = D->getImportedOwningModule()) 9137 return M->getFullModuleName(); 9138 9139 // Otherwise, use the name of the top-level module the decl is within. 9140 if (ModuleFile *M = getOwningModuleFile(D)) 9141 return M->ModuleName; 9142 9143 // Not from a module. 9144 return {}; 9145 } 9146 9147 void ASTReader::finishPendingActions() { 9148 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9149 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9150 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9151 !PendingUpdateRecords.empty()) { 9152 // If any identifiers with corresponding top-level declarations have 9153 // been loaded, load those declarations now. 9154 using TopLevelDeclsMap = 9155 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9156 TopLevelDeclsMap TopLevelDecls; 9157 9158 while (!PendingIdentifierInfos.empty()) { 9159 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9160 SmallVector<uint32_t, 4> DeclIDs = 9161 std::move(PendingIdentifierInfos.back().second); 9162 PendingIdentifierInfos.pop_back(); 9163 9164 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9165 } 9166 9167 // Load each function type that we deferred loading because it was a 9168 // deduced type that might refer to a local type declared within itself. 9169 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9170 auto *FD = PendingFunctionTypes[I].first; 9171 FD->setType(GetType(PendingFunctionTypes[I].second)); 9172 9173 // If we gave a function a deduced return type, remember that we need to 9174 // propagate that along the redeclaration chain. 9175 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9176 if (DT && DT->isDeduced()) 9177 PendingDeducedTypeUpdates.insert( 9178 {FD->getCanonicalDecl(), FD->getReturnType()}); 9179 } 9180 PendingFunctionTypes.clear(); 9181 9182 // For each decl chain that we wanted to complete while deserializing, mark 9183 // it as "still needs to be completed". 9184 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9185 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9186 } 9187 PendingIncompleteDeclChains.clear(); 9188 9189 // Load pending declaration chains. 9190 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9191 loadPendingDeclChain(PendingDeclChains[I].first, 9192 PendingDeclChains[I].second); 9193 PendingDeclChains.clear(); 9194 9195 // Make the most recent of the top-level declarations visible. 9196 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9197 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9198 IdentifierInfo *II = TLD->first; 9199 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9200 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9201 } 9202 } 9203 9204 // Load any pending macro definitions. 9205 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9206 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9207 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9208 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9209 // Initialize the macro history from chained-PCHs ahead of module imports. 9210 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9211 ++IDIdx) { 9212 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9213 if (!Info.M->isModule()) 9214 resolvePendingMacro(II, Info); 9215 } 9216 // Handle module imports. 9217 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9218 ++IDIdx) { 9219 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9220 if (Info.M->isModule()) 9221 resolvePendingMacro(II, Info); 9222 } 9223 } 9224 PendingMacroIDs.clear(); 9225 9226 // Wire up the DeclContexts for Decls that we delayed setting until 9227 // recursive loading is completed. 9228 while (!PendingDeclContextInfos.empty()) { 9229 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9230 PendingDeclContextInfos.pop_front(); 9231 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9232 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9233 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9234 } 9235 9236 // Perform any pending declaration updates. 9237 while (!PendingUpdateRecords.empty()) { 9238 auto Update = PendingUpdateRecords.pop_back_val(); 9239 ReadingKindTracker ReadingKind(Read_Decl, *this); 9240 loadDeclUpdateRecords(Update); 9241 } 9242 } 9243 9244 // At this point, all update records for loaded decls are in place, so any 9245 // fake class definitions should have become real. 9246 assert(PendingFakeDefinitionData.empty() && 9247 "faked up a class definition but never saw the real one"); 9248 9249 // If we deserialized any C++ or Objective-C class definitions, any 9250 // Objective-C protocol definitions, or any redeclarable templates, make sure 9251 // that all redeclarations point to the definitions. Note that this can only 9252 // happen now, after the redeclaration chains have been fully wired. 9253 for (Decl *D : PendingDefinitions) { 9254 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9255 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9256 // Make sure that the TagType points at the definition. 9257 const_cast<TagType*>(TagT)->decl = TD; 9258 } 9259 9260 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9261 for (auto *R = getMostRecentExistingDecl(RD); R; 9262 R = R->getPreviousDecl()) { 9263 assert((R == D) == 9264 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9265 "declaration thinks it's the definition but it isn't"); 9266 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9267 } 9268 } 9269 9270 continue; 9271 } 9272 9273 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9274 // Make sure that the ObjCInterfaceType points at the definition. 9275 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9276 ->Decl = ID; 9277 9278 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9279 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9280 9281 continue; 9282 } 9283 9284 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9285 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9286 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9287 9288 continue; 9289 } 9290 9291 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9292 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9293 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9294 } 9295 PendingDefinitions.clear(); 9296 9297 // Load the bodies of any functions or methods we've encountered. We do 9298 // this now (delayed) so that we can be sure that the declaration chains 9299 // have been fully wired up (hasBody relies on this). 9300 // FIXME: We shouldn't require complete redeclaration chains here. 9301 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9302 PBEnd = PendingBodies.end(); 9303 PB != PBEnd; ++PB) { 9304 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9305 // For a function defined inline within a class template, force the 9306 // canonical definition to be the one inside the canonical definition of 9307 // the template. This ensures that we instantiate from a correct view 9308 // of the template. 9309 // 9310 // Sadly we can't do this more generally: we can't be sure that all 9311 // copies of an arbitrary class definition will have the same members 9312 // defined (eg, some member functions may not be instantiated, and some 9313 // special members may or may not have been implicitly defined). 9314 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9315 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9316 continue; 9317 9318 // FIXME: Check for =delete/=default? 9319 // FIXME: Complain about ODR violations here? 9320 const FunctionDecl *Defn = nullptr; 9321 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9322 FD->setLazyBody(PB->second); 9323 } else { 9324 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9325 mergeDefinitionVisibility(NonConstDefn, FD); 9326 9327 if (!FD->isLateTemplateParsed() && 9328 !NonConstDefn->isLateTemplateParsed() && 9329 FD->getODRHash() != NonConstDefn->getODRHash()) { 9330 if (!isa<CXXMethodDecl>(FD)) { 9331 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9332 } else if (FD->getLexicalParent()->isFileContext() && 9333 NonConstDefn->getLexicalParent()->isFileContext()) { 9334 // Only diagnose out-of-line method definitions. If they are 9335 // in class definitions, then an error will be generated when 9336 // processing the class bodies. 9337 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9338 } 9339 } 9340 } 9341 continue; 9342 } 9343 9344 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9345 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9346 MD->setLazyBody(PB->second); 9347 } 9348 PendingBodies.clear(); 9349 9350 // Do some cleanup. 9351 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9352 getContext().deduplicateMergedDefinitonsFor(ND); 9353 PendingMergedDefinitionsToDeduplicate.clear(); 9354 } 9355 9356 void ASTReader::diagnoseOdrViolations() { 9357 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9358 PendingFunctionOdrMergeFailures.empty() && 9359 PendingEnumOdrMergeFailures.empty()) 9360 return; 9361 9362 // Trigger the import of the full definition of each class that had any 9363 // odr-merging problems, so we can produce better diagnostics for them. 9364 // These updates may in turn find and diagnose some ODR failures, so take 9365 // ownership of the set first. 9366 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9367 PendingOdrMergeFailures.clear(); 9368 for (auto &Merge : OdrMergeFailures) { 9369 Merge.first->buildLookup(); 9370 Merge.first->decls_begin(); 9371 Merge.first->bases_begin(); 9372 Merge.first->vbases_begin(); 9373 for (auto &RecordPair : Merge.second) { 9374 auto *RD = RecordPair.first; 9375 RD->decls_begin(); 9376 RD->bases_begin(); 9377 RD->vbases_begin(); 9378 } 9379 } 9380 9381 // Trigger the import of functions. 9382 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9383 PendingFunctionOdrMergeFailures.clear(); 9384 for (auto &Merge : FunctionOdrMergeFailures) { 9385 Merge.first->buildLookup(); 9386 Merge.first->decls_begin(); 9387 Merge.first->getBody(); 9388 for (auto &FD : Merge.second) { 9389 FD->buildLookup(); 9390 FD->decls_begin(); 9391 FD->getBody(); 9392 } 9393 } 9394 9395 // Trigger the import of enums. 9396 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9397 PendingEnumOdrMergeFailures.clear(); 9398 for (auto &Merge : EnumOdrMergeFailures) { 9399 Merge.first->decls_begin(); 9400 for (auto &Enum : Merge.second) { 9401 Enum->decls_begin(); 9402 } 9403 } 9404 9405 // For each declaration from a merged context, check that the canonical 9406 // definition of that context also contains a declaration of the same 9407 // entity. 9408 // 9409 // Caution: this loop does things that might invalidate iterators into 9410 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9411 while (!PendingOdrMergeChecks.empty()) { 9412 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9413 9414 // FIXME: Skip over implicit declarations for now. This matters for things 9415 // like implicitly-declared special member functions. This isn't entirely 9416 // correct; we can end up with multiple unmerged declarations of the same 9417 // implicit entity. 9418 if (D->isImplicit()) 9419 continue; 9420 9421 DeclContext *CanonDef = D->getDeclContext(); 9422 9423 bool Found = false; 9424 const Decl *DCanon = D->getCanonicalDecl(); 9425 9426 for (auto RI : D->redecls()) { 9427 if (RI->getLexicalDeclContext() == CanonDef) { 9428 Found = true; 9429 break; 9430 } 9431 } 9432 if (Found) 9433 continue; 9434 9435 // Quick check failed, time to do the slow thing. Note, we can't just 9436 // look up the name of D in CanonDef here, because the member that is 9437 // in CanonDef might not be found by name lookup (it might have been 9438 // replaced by a more recent declaration in the lookup table), and we 9439 // can't necessarily find it in the redeclaration chain because it might 9440 // be merely mergeable, not redeclarable. 9441 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9442 for (auto *CanonMember : CanonDef->decls()) { 9443 if (CanonMember->getCanonicalDecl() == DCanon) { 9444 // This can happen if the declaration is merely mergeable and not 9445 // actually redeclarable (we looked for redeclarations earlier). 9446 // 9447 // FIXME: We should be able to detect this more efficiently, without 9448 // pulling in all of the members of CanonDef. 9449 Found = true; 9450 break; 9451 } 9452 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9453 if (ND->getDeclName() == D->getDeclName()) 9454 Candidates.push_back(ND); 9455 } 9456 9457 if (!Found) { 9458 // The AST doesn't like TagDecls becoming invalid after they've been 9459 // completed. We only really need to mark FieldDecls as invalid here. 9460 if (!isa<TagDecl>(D)) 9461 D->setInvalidDecl(); 9462 9463 // Ensure we don't accidentally recursively enter deserialization while 9464 // we're producing our diagnostic. 9465 Deserializing RecursionGuard(this); 9466 9467 std::string CanonDefModule = 9468 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9469 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9470 << D << getOwningModuleNameForDiagnostic(D) 9471 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9472 9473 if (Candidates.empty()) 9474 Diag(cast<Decl>(CanonDef)->getLocation(), 9475 diag::note_module_odr_violation_no_possible_decls) << D; 9476 else { 9477 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9478 Diag(Candidates[I]->getLocation(), 9479 diag::note_module_odr_violation_possible_decl) 9480 << Candidates[I]; 9481 } 9482 9483 DiagnosedOdrMergeFailures.insert(CanonDef); 9484 } 9485 } 9486 9487 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9488 EnumOdrMergeFailures.empty()) 9489 return; 9490 9491 // Ensure we don't accidentally recursively enter deserialization while 9492 // we're producing our diagnostics. 9493 Deserializing RecursionGuard(this); 9494 9495 // Common code for hashing helpers. 9496 ODRHash Hash; 9497 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9498 Hash.clear(); 9499 Hash.AddQualType(Ty); 9500 return Hash.CalculateHash(); 9501 }; 9502 9503 auto ComputeODRHash = [&Hash](const Stmt *S) { 9504 assert(S); 9505 Hash.clear(); 9506 Hash.AddStmt(S); 9507 return Hash.CalculateHash(); 9508 }; 9509 9510 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9511 assert(D); 9512 Hash.clear(); 9513 Hash.AddSubDecl(D); 9514 return Hash.CalculateHash(); 9515 }; 9516 9517 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9518 Hash.clear(); 9519 Hash.AddTemplateArgument(TA); 9520 return Hash.CalculateHash(); 9521 }; 9522 9523 auto ComputeTemplateParameterListODRHash = 9524 [&Hash](const TemplateParameterList *TPL) { 9525 assert(TPL); 9526 Hash.clear(); 9527 Hash.AddTemplateParameterList(TPL); 9528 return Hash.CalculateHash(); 9529 }; 9530 9531 // Used with err_module_odr_violation_mismatch_decl and 9532 // note_module_odr_violation_mismatch_decl 9533 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed 9534 enum ODRMismatchDecl { 9535 EndOfClass, 9536 PublicSpecifer, 9537 PrivateSpecifer, 9538 ProtectedSpecifer, 9539 StaticAssert, 9540 Field, 9541 CXXMethod, 9542 TypeAlias, 9543 TypeDef, 9544 Var, 9545 Friend, 9546 FunctionTemplate, 9547 Other 9548 }; 9549 9550 // Used with err_module_odr_violation_mismatch_decl_diff and 9551 // note_module_odr_violation_mismatch_decl_diff 9552 enum ODRMismatchDeclDifference { 9553 StaticAssertCondition, 9554 StaticAssertMessage, 9555 StaticAssertOnlyMessage, 9556 FieldName, 9557 FieldTypeName, 9558 FieldSingleBitField, 9559 FieldDifferentWidthBitField, 9560 FieldSingleMutable, 9561 FieldSingleInitializer, 9562 FieldDifferentInitializers, 9563 MethodName, 9564 MethodDeleted, 9565 MethodDefaulted, 9566 MethodVirtual, 9567 MethodStatic, 9568 MethodVolatile, 9569 MethodConst, 9570 MethodInline, 9571 MethodNumberParameters, 9572 MethodParameterType, 9573 MethodParameterName, 9574 MethodParameterSingleDefaultArgument, 9575 MethodParameterDifferentDefaultArgument, 9576 MethodNoTemplateArguments, 9577 MethodDifferentNumberTemplateArguments, 9578 MethodDifferentTemplateArgument, 9579 MethodSingleBody, 9580 MethodDifferentBody, 9581 TypedefName, 9582 TypedefType, 9583 VarName, 9584 VarType, 9585 VarSingleInitializer, 9586 VarDifferentInitializer, 9587 VarConstexpr, 9588 FriendTypeFunction, 9589 FriendType, 9590 FriendFunction, 9591 FunctionTemplateDifferentNumberParameters, 9592 FunctionTemplateParameterDifferentKind, 9593 FunctionTemplateParameterName, 9594 FunctionTemplateParameterSingleDefaultArgument, 9595 FunctionTemplateParameterDifferentDefaultArgument, 9596 FunctionTemplateParameterDifferentType, 9597 FunctionTemplatePackParameter, 9598 }; 9599 9600 // These lambdas have the common portions of the ODR diagnostics. This 9601 // has the same return as Diag(), so addition parameters can be passed 9602 // in with operator<< 9603 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9604 SourceLocation Loc, SourceRange Range, 9605 ODRMismatchDeclDifference DiffType) { 9606 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9607 << FirstRecord << FirstModule.empty() << FirstModule << Range 9608 << DiffType; 9609 }; 9610 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9611 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9612 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9613 << SecondModule << Range << DiffType; 9614 }; 9615 9616 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9617 &ComputeQualTypeODRHash, &ComputeODRHash]( 9618 NamedDecl *FirstRecord, StringRef FirstModule, 9619 StringRef SecondModule, FieldDecl *FirstField, 9620 FieldDecl *SecondField) { 9621 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9622 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9623 if (FirstII->getName() != SecondII->getName()) { 9624 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9625 FirstField->getSourceRange(), FieldName) 9626 << FirstII; 9627 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9628 SecondField->getSourceRange(), FieldName) 9629 << SecondII; 9630 9631 return true; 9632 } 9633 9634 assert(getContext().hasSameType(FirstField->getType(), 9635 SecondField->getType())); 9636 9637 QualType FirstType = FirstField->getType(); 9638 QualType SecondType = SecondField->getType(); 9639 if (ComputeQualTypeODRHash(FirstType) != 9640 ComputeQualTypeODRHash(SecondType)) { 9641 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9642 FirstField->getSourceRange(), FieldTypeName) 9643 << FirstII << FirstType; 9644 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9645 SecondField->getSourceRange(), FieldTypeName) 9646 << SecondII << SecondType; 9647 9648 return true; 9649 } 9650 9651 const bool IsFirstBitField = FirstField->isBitField(); 9652 const bool IsSecondBitField = SecondField->isBitField(); 9653 if (IsFirstBitField != IsSecondBitField) { 9654 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9655 FirstField->getSourceRange(), FieldSingleBitField) 9656 << FirstII << IsFirstBitField; 9657 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9658 SecondField->getSourceRange(), FieldSingleBitField) 9659 << SecondII << IsSecondBitField; 9660 return true; 9661 } 9662 9663 if (IsFirstBitField && IsSecondBitField) { 9664 unsigned FirstBitWidthHash = 9665 ComputeODRHash(FirstField->getBitWidth()); 9666 unsigned SecondBitWidthHash = 9667 ComputeODRHash(SecondField->getBitWidth()); 9668 if (FirstBitWidthHash != SecondBitWidthHash) { 9669 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9670 FirstField->getSourceRange(), 9671 FieldDifferentWidthBitField) 9672 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9673 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9674 SecondField->getSourceRange(), 9675 FieldDifferentWidthBitField) 9676 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9677 return true; 9678 } 9679 } 9680 9681 if (!PP.getLangOpts().CPlusPlus) 9682 return false; 9683 9684 const bool IsFirstMutable = FirstField->isMutable(); 9685 const bool IsSecondMutable = SecondField->isMutable(); 9686 if (IsFirstMutable != IsSecondMutable) { 9687 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9688 FirstField->getSourceRange(), FieldSingleMutable) 9689 << FirstII << IsFirstMutable; 9690 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9691 SecondField->getSourceRange(), FieldSingleMutable) 9692 << SecondII << IsSecondMutable; 9693 return true; 9694 } 9695 9696 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9697 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9698 if ((!FirstInitializer && SecondInitializer) || 9699 (FirstInitializer && !SecondInitializer)) { 9700 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9701 FirstField->getSourceRange(), FieldSingleInitializer) 9702 << FirstII << (FirstInitializer != nullptr); 9703 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9704 SecondField->getSourceRange(), FieldSingleInitializer) 9705 << SecondII << (SecondInitializer != nullptr); 9706 return true; 9707 } 9708 9709 if (FirstInitializer && SecondInitializer) { 9710 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9711 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9712 if (FirstInitHash != SecondInitHash) { 9713 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9714 FirstField->getSourceRange(), 9715 FieldDifferentInitializers) 9716 << FirstII << FirstInitializer->getSourceRange(); 9717 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9718 SecondField->getSourceRange(), 9719 FieldDifferentInitializers) 9720 << SecondII << SecondInitializer->getSourceRange(); 9721 return true; 9722 } 9723 } 9724 9725 return false; 9726 }; 9727 9728 auto ODRDiagTypeDefOrAlias = 9729 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9730 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9731 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9732 bool IsTypeAlias) { 9733 auto FirstName = FirstTD->getDeclName(); 9734 auto SecondName = SecondTD->getDeclName(); 9735 if (FirstName != SecondName) { 9736 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9737 FirstTD->getSourceRange(), TypedefName) 9738 << IsTypeAlias << FirstName; 9739 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9740 SecondTD->getSourceRange(), TypedefName) 9741 << IsTypeAlias << SecondName; 9742 return true; 9743 } 9744 9745 QualType FirstType = FirstTD->getUnderlyingType(); 9746 QualType SecondType = SecondTD->getUnderlyingType(); 9747 if (ComputeQualTypeODRHash(FirstType) != 9748 ComputeQualTypeODRHash(SecondType)) { 9749 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9750 FirstTD->getSourceRange(), TypedefType) 9751 << IsTypeAlias << FirstName << FirstType; 9752 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9753 SecondTD->getSourceRange(), TypedefType) 9754 << IsTypeAlias << SecondName << SecondType; 9755 return true; 9756 } 9757 9758 return false; 9759 }; 9760 9761 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9762 &ComputeQualTypeODRHash, &ComputeODRHash, 9763 this](NamedDecl *FirstRecord, StringRef FirstModule, 9764 StringRef SecondModule, VarDecl *FirstVD, 9765 VarDecl *SecondVD) { 9766 auto FirstName = FirstVD->getDeclName(); 9767 auto SecondName = SecondVD->getDeclName(); 9768 if (FirstName != SecondName) { 9769 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9770 FirstVD->getSourceRange(), VarName) 9771 << FirstName; 9772 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9773 SecondVD->getSourceRange(), VarName) 9774 << SecondName; 9775 return true; 9776 } 9777 9778 QualType FirstType = FirstVD->getType(); 9779 QualType SecondType = SecondVD->getType(); 9780 if (ComputeQualTypeODRHash(FirstType) != 9781 ComputeQualTypeODRHash(SecondType)) { 9782 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9783 FirstVD->getSourceRange(), VarType) 9784 << FirstName << FirstType; 9785 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9786 SecondVD->getSourceRange(), VarType) 9787 << SecondName << SecondType; 9788 return true; 9789 } 9790 9791 if (!PP.getLangOpts().CPlusPlus) 9792 return false; 9793 9794 const Expr *FirstInit = FirstVD->getInit(); 9795 const Expr *SecondInit = SecondVD->getInit(); 9796 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9797 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9798 FirstVD->getSourceRange(), VarSingleInitializer) 9799 << FirstName << (FirstInit == nullptr) 9800 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9801 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9802 SecondVD->getSourceRange(), VarSingleInitializer) 9803 << SecondName << (SecondInit == nullptr) 9804 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9805 return true; 9806 } 9807 9808 if (FirstInit && SecondInit && 9809 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9810 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9811 FirstVD->getSourceRange(), VarDifferentInitializer) 9812 << FirstName << FirstInit->getSourceRange(); 9813 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9814 SecondVD->getSourceRange(), VarDifferentInitializer) 9815 << SecondName << SecondInit->getSourceRange(); 9816 return true; 9817 } 9818 9819 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9820 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9821 if (FirstIsConstexpr != SecondIsConstexpr) { 9822 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9823 FirstVD->getSourceRange(), VarConstexpr) 9824 << FirstName << FirstIsConstexpr; 9825 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9826 SecondVD->getSourceRange(), VarConstexpr) 9827 << SecondName << SecondIsConstexpr; 9828 return true; 9829 } 9830 return false; 9831 }; 9832 9833 auto DifferenceSelector = [](Decl *D) { 9834 assert(D && "valid Decl required"); 9835 switch (D->getKind()) { 9836 default: 9837 return Other; 9838 case Decl::AccessSpec: 9839 switch (D->getAccess()) { 9840 case AS_public: 9841 return PublicSpecifer; 9842 case AS_private: 9843 return PrivateSpecifer; 9844 case AS_protected: 9845 return ProtectedSpecifer; 9846 case AS_none: 9847 break; 9848 } 9849 llvm_unreachable("Invalid access specifier"); 9850 case Decl::StaticAssert: 9851 return StaticAssert; 9852 case Decl::Field: 9853 return Field; 9854 case Decl::CXXMethod: 9855 case Decl::CXXConstructor: 9856 case Decl::CXXDestructor: 9857 return CXXMethod; 9858 case Decl::TypeAlias: 9859 return TypeAlias; 9860 case Decl::Typedef: 9861 return TypeDef; 9862 case Decl::Var: 9863 return Var; 9864 case Decl::Friend: 9865 return Friend; 9866 case Decl::FunctionTemplate: 9867 return FunctionTemplate; 9868 } 9869 }; 9870 9871 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9872 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9873 RecordDecl *Record, 9874 const DeclContext *DC) { 9875 for (auto *D : Record->decls()) { 9876 if (!ODRHash::isDeclToBeProcessed(D, DC)) 9877 continue; 9878 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9879 } 9880 }; 9881 9882 struct DiffResult { 9883 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9884 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9885 }; 9886 9887 // If there is a diagnoseable difference, FirstDiffType and 9888 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9889 // filled in if not EndOfClass. 9890 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9891 DeclHashes &SecondHashes) { 9892 DiffResult DR; 9893 auto FirstIt = FirstHashes.begin(); 9894 auto SecondIt = SecondHashes.begin(); 9895 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9896 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9897 FirstIt->second == SecondIt->second) { 9898 ++FirstIt; 9899 ++SecondIt; 9900 continue; 9901 } 9902 9903 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9904 DR.SecondDecl = 9905 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9906 9907 DR.FirstDiffType = 9908 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9909 DR.SecondDiffType = 9910 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 9911 return DR; 9912 } 9913 return DR; 9914 }; 9915 9916 // Use this to diagnose that an unexpected Decl was encountered 9917 // or no difference was detected. This causes a generic error 9918 // message to be emitted. 9919 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 9920 StringRef FirstModule, 9921 NamedDecl *SecondRecord, 9922 StringRef SecondModule) { 9923 Diag(FirstRecord->getLocation(), 9924 diag::err_module_odr_violation_different_definitions) 9925 << FirstRecord << FirstModule.empty() << FirstModule; 9926 9927 if (DR.FirstDecl) { 9928 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 9929 << FirstRecord << DR.FirstDecl->getSourceRange(); 9930 } 9931 9932 Diag(SecondRecord->getLocation(), 9933 diag::note_module_odr_violation_different_definitions) 9934 << SecondModule; 9935 9936 if (DR.SecondDecl) { 9937 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 9938 << DR.SecondDecl->getSourceRange(); 9939 } 9940 }; 9941 9942 auto DiagnoseODRMismatch = 9943 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 9944 NamedDecl *SecondRecord, StringRef SecondModule) { 9945 SourceLocation FirstLoc; 9946 SourceRange FirstRange; 9947 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 9948 if (DR.FirstDiffType == EndOfClass && FirstTag) { 9949 FirstLoc = FirstTag->getBraceRange().getEnd(); 9950 } else { 9951 FirstLoc = DR.FirstDecl->getLocation(); 9952 FirstRange = DR.FirstDecl->getSourceRange(); 9953 } 9954 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9955 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9956 << DR.FirstDiffType; 9957 9958 SourceLocation SecondLoc; 9959 SourceRange SecondRange; 9960 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 9961 if (DR.SecondDiffType == EndOfClass && SecondTag) { 9962 SecondLoc = SecondTag->getBraceRange().getEnd(); 9963 } else { 9964 SecondLoc = DR.SecondDecl->getLocation(); 9965 SecondRange = DR.SecondDecl->getSourceRange(); 9966 } 9967 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 9968 << SecondModule << SecondRange << DR.SecondDiffType; 9969 }; 9970 9971 // Issue any pending ODR-failure diagnostics. 9972 for (auto &Merge : OdrMergeFailures) { 9973 // If we've already pointed out a specific problem with this class, don't 9974 // bother issuing a general "something's different" diagnostic. 9975 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 9976 continue; 9977 9978 bool Diagnosed = false; 9979 CXXRecordDecl *FirstRecord = Merge.first; 9980 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 9981 for (auto &RecordPair : Merge.second) { 9982 CXXRecordDecl *SecondRecord = RecordPair.first; 9983 // Multiple different declarations got merged together; tell the user 9984 // where they came from. 9985 if (FirstRecord == SecondRecord) 9986 continue; 9987 9988 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 9989 9990 auto *FirstDD = FirstRecord->DefinitionData; 9991 auto *SecondDD = RecordPair.second; 9992 9993 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 9994 9995 // Diagnostics from DefinitionData are emitted here. 9996 if (FirstDD != SecondDD) { 9997 enum ODRDefinitionDataDifference { 9998 NumBases, 9999 NumVBases, 10000 BaseType, 10001 BaseVirtual, 10002 BaseAccess, 10003 }; 10004 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 10005 this](SourceLocation Loc, SourceRange Range, 10006 ODRDefinitionDataDifference DiffType) { 10007 return Diag(Loc, diag::err_module_odr_violation_definition_data) 10008 << FirstRecord << FirstModule.empty() << FirstModule << Range 10009 << DiffType; 10010 }; 10011 auto ODRDiagBaseNote = [&SecondModule, 10012 this](SourceLocation Loc, SourceRange Range, 10013 ODRDefinitionDataDifference DiffType) { 10014 return Diag(Loc, diag::note_module_odr_violation_definition_data) 10015 << SecondModule << Range << DiffType; 10016 }; 10017 10018 unsigned FirstNumBases = FirstDD->NumBases; 10019 unsigned FirstNumVBases = FirstDD->NumVBases; 10020 unsigned SecondNumBases = SecondDD->NumBases; 10021 unsigned SecondNumVBases = SecondDD->NumVBases; 10022 10023 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 10024 unsigned NumBases = DD->NumBases; 10025 if (NumBases == 0) return SourceRange(); 10026 auto bases = DD->bases(); 10027 return SourceRange(bases[0].getBeginLoc(), 10028 bases[NumBases - 1].getEndLoc()); 10029 }; 10030 10031 if (FirstNumBases != SecondNumBases) { 10032 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10033 NumBases) 10034 << FirstNumBases; 10035 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10036 NumBases) 10037 << SecondNumBases; 10038 Diagnosed = true; 10039 break; 10040 } 10041 10042 if (FirstNumVBases != SecondNumVBases) { 10043 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10044 NumVBases) 10045 << FirstNumVBases; 10046 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10047 NumVBases) 10048 << SecondNumVBases; 10049 Diagnosed = true; 10050 break; 10051 } 10052 10053 auto FirstBases = FirstDD->bases(); 10054 auto SecondBases = SecondDD->bases(); 10055 unsigned i = 0; 10056 for (i = 0; i < FirstNumBases; ++i) { 10057 auto FirstBase = FirstBases[i]; 10058 auto SecondBase = SecondBases[i]; 10059 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10060 ComputeQualTypeODRHash(SecondBase.getType())) { 10061 ODRDiagBaseError(FirstRecord->getLocation(), 10062 FirstBase.getSourceRange(), BaseType) 10063 << (i + 1) << FirstBase.getType(); 10064 ODRDiagBaseNote(SecondRecord->getLocation(), 10065 SecondBase.getSourceRange(), BaseType) 10066 << (i + 1) << SecondBase.getType(); 10067 break; 10068 } 10069 10070 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10071 ODRDiagBaseError(FirstRecord->getLocation(), 10072 FirstBase.getSourceRange(), BaseVirtual) 10073 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10074 ODRDiagBaseNote(SecondRecord->getLocation(), 10075 SecondBase.getSourceRange(), BaseVirtual) 10076 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10077 break; 10078 } 10079 10080 if (FirstBase.getAccessSpecifierAsWritten() != 10081 SecondBase.getAccessSpecifierAsWritten()) { 10082 ODRDiagBaseError(FirstRecord->getLocation(), 10083 FirstBase.getSourceRange(), BaseAccess) 10084 << (i + 1) << FirstBase.getType() 10085 << (int)FirstBase.getAccessSpecifierAsWritten(); 10086 ODRDiagBaseNote(SecondRecord->getLocation(), 10087 SecondBase.getSourceRange(), BaseAccess) 10088 << (i + 1) << SecondBase.getType() 10089 << (int)SecondBase.getAccessSpecifierAsWritten(); 10090 break; 10091 } 10092 } 10093 10094 if (i != FirstNumBases) { 10095 Diagnosed = true; 10096 break; 10097 } 10098 } 10099 10100 const ClassTemplateDecl *FirstTemplate = 10101 FirstRecord->getDescribedClassTemplate(); 10102 const ClassTemplateDecl *SecondTemplate = 10103 SecondRecord->getDescribedClassTemplate(); 10104 10105 assert(!FirstTemplate == !SecondTemplate && 10106 "Both pointers should be null or non-null"); 10107 10108 enum ODRTemplateDifference { 10109 ParamEmptyName, 10110 ParamName, 10111 ParamSingleDefaultArgument, 10112 ParamDifferentDefaultArgument, 10113 }; 10114 10115 if (FirstTemplate && SecondTemplate) { 10116 DeclHashes FirstTemplateHashes; 10117 DeclHashes SecondTemplateHashes; 10118 10119 auto PopulateTemplateParameterHashs = 10120 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10121 const ClassTemplateDecl *TD) { 10122 for (auto *D : TD->getTemplateParameters()->asArray()) { 10123 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10124 } 10125 }; 10126 10127 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10128 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10129 10130 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10131 "Number of template parameters should be equal."); 10132 10133 auto FirstIt = FirstTemplateHashes.begin(); 10134 auto FirstEnd = FirstTemplateHashes.end(); 10135 auto SecondIt = SecondTemplateHashes.begin(); 10136 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10137 if (FirstIt->second == SecondIt->second) 10138 continue; 10139 10140 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( 10141 SourceLocation Loc, SourceRange Range, 10142 ODRTemplateDifference DiffType) { 10143 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 10144 << FirstRecord << FirstModule.empty() << FirstModule << Range 10145 << DiffType; 10146 }; 10147 auto ODRDiagTemplateNote = [&SecondModule, this]( 10148 SourceLocation Loc, SourceRange Range, 10149 ODRTemplateDifference DiffType) { 10150 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 10151 << SecondModule << Range << DiffType; 10152 }; 10153 10154 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10155 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10156 10157 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10158 "Parameter Decl's should be the same kind."); 10159 10160 DeclarationName FirstName = FirstDecl->getDeclName(); 10161 DeclarationName SecondName = SecondDecl->getDeclName(); 10162 10163 if (FirstName != SecondName) { 10164 const bool FirstNameEmpty = 10165 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10166 const bool SecondNameEmpty = 10167 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 10168 assert((!FirstNameEmpty || !SecondNameEmpty) && 10169 "Both template parameters cannot be unnamed."); 10170 ODRDiagTemplateError(FirstDecl->getLocation(), 10171 FirstDecl->getSourceRange(), 10172 FirstNameEmpty ? ParamEmptyName : ParamName) 10173 << FirstName; 10174 ODRDiagTemplateNote(SecondDecl->getLocation(), 10175 SecondDecl->getSourceRange(), 10176 SecondNameEmpty ? ParamEmptyName : ParamName) 10177 << SecondName; 10178 break; 10179 } 10180 10181 switch (FirstDecl->getKind()) { 10182 default: 10183 llvm_unreachable("Invalid template parameter type."); 10184 case Decl::TemplateTypeParm: { 10185 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 10186 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 10187 const bool HasFirstDefaultArgument = 10188 FirstParam->hasDefaultArgument() && 10189 !FirstParam->defaultArgumentWasInherited(); 10190 const bool HasSecondDefaultArgument = 10191 SecondParam->hasDefaultArgument() && 10192 !SecondParam->defaultArgumentWasInherited(); 10193 10194 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10195 ODRDiagTemplateError(FirstDecl->getLocation(), 10196 FirstDecl->getSourceRange(), 10197 ParamSingleDefaultArgument) 10198 << HasFirstDefaultArgument; 10199 ODRDiagTemplateNote(SecondDecl->getLocation(), 10200 SecondDecl->getSourceRange(), 10201 ParamSingleDefaultArgument) 10202 << HasSecondDefaultArgument; 10203 break; 10204 } 10205 10206 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10207 "Expecting default arguments."); 10208 10209 ODRDiagTemplateError(FirstDecl->getLocation(), 10210 FirstDecl->getSourceRange(), 10211 ParamDifferentDefaultArgument); 10212 ODRDiagTemplateNote(SecondDecl->getLocation(), 10213 SecondDecl->getSourceRange(), 10214 ParamDifferentDefaultArgument); 10215 10216 break; 10217 } 10218 case Decl::NonTypeTemplateParm: { 10219 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 10220 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 10221 const bool HasFirstDefaultArgument = 10222 FirstParam->hasDefaultArgument() && 10223 !FirstParam->defaultArgumentWasInherited(); 10224 const bool HasSecondDefaultArgument = 10225 SecondParam->hasDefaultArgument() && 10226 !SecondParam->defaultArgumentWasInherited(); 10227 10228 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10229 ODRDiagTemplateError(FirstDecl->getLocation(), 10230 FirstDecl->getSourceRange(), 10231 ParamSingleDefaultArgument) 10232 << HasFirstDefaultArgument; 10233 ODRDiagTemplateNote(SecondDecl->getLocation(), 10234 SecondDecl->getSourceRange(), 10235 ParamSingleDefaultArgument) 10236 << HasSecondDefaultArgument; 10237 break; 10238 } 10239 10240 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10241 "Expecting default arguments."); 10242 10243 ODRDiagTemplateError(FirstDecl->getLocation(), 10244 FirstDecl->getSourceRange(), 10245 ParamDifferentDefaultArgument); 10246 ODRDiagTemplateNote(SecondDecl->getLocation(), 10247 SecondDecl->getSourceRange(), 10248 ParamDifferentDefaultArgument); 10249 10250 break; 10251 } 10252 case Decl::TemplateTemplateParm: { 10253 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 10254 const auto *SecondParam = 10255 cast<TemplateTemplateParmDecl>(SecondDecl); 10256 const bool HasFirstDefaultArgument = 10257 FirstParam->hasDefaultArgument() && 10258 !FirstParam->defaultArgumentWasInherited(); 10259 const bool HasSecondDefaultArgument = 10260 SecondParam->hasDefaultArgument() && 10261 !SecondParam->defaultArgumentWasInherited(); 10262 10263 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10264 ODRDiagTemplateError(FirstDecl->getLocation(), 10265 FirstDecl->getSourceRange(), 10266 ParamSingleDefaultArgument) 10267 << HasFirstDefaultArgument; 10268 ODRDiagTemplateNote(SecondDecl->getLocation(), 10269 SecondDecl->getSourceRange(), 10270 ParamSingleDefaultArgument) 10271 << HasSecondDefaultArgument; 10272 break; 10273 } 10274 10275 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10276 "Expecting default arguments."); 10277 10278 ODRDiagTemplateError(FirstDecl->getLocation(), 10279 FirstDecl->getSourceRange(), 10280 ParamDifferentDefaultArgument); 10281 ODRDiagTemplateNote(SecondDecl->getLocation(), 10282 SecondDecl->getSourceRange(), 10283 ParamDifferentDefaultArgument); 10284 10285 break; 10286 } 10287 } 10288 10289 break; 10290 } 10291 10292 if (FirstIt != FirstEnd) { 10293 Diagnosed = true; 10294 break; 10295 } 10296 } 10297 10298 DeclHashes FirstHashes; 10299 DeclHashes SecondHashes; 10300 const DeclContext *DC = FirstRecord; 10301 PopulateHashes(FirstHashes, FirstRecord, DC); 10302 PopulateHashes(SecondHashes, SecondRecord, DC); 10303 10304 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10305 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10306 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10307 Decl *FirstDecl = DR.FirstDecl; 10308 Decl *SecondDecl = DR.SecondDecl; 10309 10310 if (FirstDiffType == Other || SecondDiffType == Other) { 10311 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10312 SecondModule); 10313 Diagnosed = true; 10314 break; 10315 } 10316 10317 if (FirstDiffType != SecondDiffType) { 10318 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10319 SecondModule); 10320 Diagnosed = true; 10321 break; 10322 } 10323 10324 assert(FirstDiffType == SecondDiffType); 10325 10326 switch (FirstDiffType) { 10327 case Other: 10328 case EndOfClass: 10329 case PublicSpecifer: 10330 case PrivateSpecifer: 10331 case ProtectedSpecifer: 10332 llvm_unreachable("Invalid diff type"); 10333 10334 case StaticAssert: { 10335 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10336 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10337 10338 Expr *FirstExpr = FirstSA->getAssertExpr(); 10339 Expr *SecondExpr = SecondSA->getAssertExpr(); 10340 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10341 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10342 if (FirstODRHash != SecondODRHash) { 10343 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10344 FirstExpr->getSourceRange(), StaticAssertCondition); 10345 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10346 SecondExpr->getSourceRange(), StaticAssertCondition); 10347 Diagnosed = true; 10348 break; 10349 } 10350 10351 StringLiteral *FirstStr = FirstSA->getMessage(); 10352 StringLiteral *SecondStr = SecondSA->getMessage(); 10353 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10354 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10355 SourceLocation FirstLoc, SecondLoc; 10356 SourceRange FirstRange, SecondRange; 10357 if (FirstStr) { 10358 FirstLoc = FirstStr->getBeginLoc(); 10359 FirstRange = FirstStr->getSourceRange(); 10360 } else { 10361 FirstLoc = FirstSA->getBeginLoc(); 10362 FirstRange = FirstSA->getSourceRange(); 10363 } 10364 if (SecondStr) { 10365 SecondLoc = SecondStr->getBeginLoc(); 10366 SecondRange = SecondStr->getSourceRange(); 10367 } else { 10368 SecondLoc = SecondSA->getBeginLoc(); 10369 SecondRange = SecondSA->getSourceRange(); 10370 } 10371 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10372 StaticAssertOnlyMessage) 10373 << (FirstStr == nullptr); 10374 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10375 StaticAssertOnlyMessage) 10376 << (SecondStr == nullptr); 10377 Diagnosed = true; 10378 break; 10379 } 10380 10381 if (FirstStr && SecondStr && 10382 FirstStr->getString() != SecondStr->getString()) { 10383 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10384 FirstStr->getSourceRange(), StaticAssertMessage); 10385 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10386 SecondStr->getSourceRange(), StaticAssertMessage); 10387 Diagnosed = true; 10388 break; 10389 } 10390 break; 10391 } 10392 case Field: { 10393 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10394 cast<FieldDecl>(FirstDecl), 10395 cast<FieldDecl>(SecondDecl)); 10396 break; 10397 } 10398 case CXXMethod: { 10399 enum { 10400 DiagMethod, 10401 DiagConstructor, 10402 DiagDestructor, 10403 } FirstMethodType, 10404 SecondMethodType; 10405 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10406 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10407 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10408 return DiagMethod; 10409 }; 10410 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10411 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10412 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10413 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10414 auto FirstName = FirstMethod->getDeclName(); 10415 auto SecondName = SecondMethod->getDeclName(); 10416 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10417 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10418 FirstMethod->getSourceRange(), MethodName) 10419 << FirstMethodType << FirstName; 10420 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10421 SecondMethod->getSourceRange(), MethodName) 10422 << SecondMethodType << SecondName; 10423 10424 Diagnosed = true; 10425 break; 10426 } 10427 10428 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10429 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10430 if (FirstDeleted != SecondDeleted) { 10431 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10432 FirstMethod->getSourceRange(), MethodDeleted) 10433 << FirstMethodType << FirstName << FirstDeleted; 10434 10435 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10436 SecondMethod->getSourceRange(), MethodDeleted) 10437 << SecondMethodType << SecondName << SecondDeleted; 10438 Diagnosed = true; 10439 break; 10440 } 10441 10442 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10443 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10444 if (FirstDefaulted != SecondDefaulted) { 10445 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10446 FirstMethod->getSourceRange(), MethodDefaulted) 10447 << FirstMethodType << FirstName << FirstDefaulted; 10448 10449 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10450 SecondMethod->getSourceRange(), MethodDefaulted) 10451 << SecondMethodType << SecondName << SecondDefaulted; 10452 Diagnosed = true; 10453 break; 10454 } 10455 10456 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10457 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10458 const bool FirstPure = FirstMethod->isPure(); 10459 const bool SecondPure = SecondMethod->isPure(); 10460 if ((FirstVirtual || SecondVirtual) && 10461 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10462 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10463 FirstMethod->getSourceRange(), MethodVirtual) 10464 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10465 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10466 SecondMethod->getSourceRange(), MethodVirtual) 10467 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10468 Diagnosed = true; 10469 break; 10470 } 10471 10472 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10473 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10474 // class needs to be checked instead. 10475 const auto FirstStorage = FirstMethod->getStorageClass(); 10476 const auto SecondStorage = SecondMethod->getStorageClass(); 10477 const bool FirstStatic = FirstStorage == SC_Static; 10478 const bool SecondStatic = SecondStorage == SC_Static; 10479 if (FirstStatic != SecondStatic) { 10480 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10481 FirstMethod->getSourceRange(), MethodStatic) 10482 << FirstMethodType << FirstName << FirstStatic; 10483 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10484 SecondMethod->getSourceRange(), MethodStatic) 10485 << SecondMethodType << SecondName << SecondStatic; 10486 Diagnosed = true; 10487 break; 10488 } 10489 10490 const bool FirstVolatile = FirstMethod->isVolatile(); 10491 const bool SecondVolatile = SecondMethod->isVolatile(); 10492 if (FirstVolatile != SecondVolatile) { 10493 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10494 FirstMethod->getSourceRange(), MethodVolatile) 10495 << FirstMethodType << FirstName << FirstVolatile; 10496 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10497 SecondMethod->getSourceRange(), MethodVolatile) 10498 << SecondMethodType << SecondName << SecondVolatile; 10499 Diagnosed = true; 10500 break; 10501 } 10502 10503 const bool FirstConst = FirstMethod->isConst(); 10504 const bool SecondConst = SecondMethod->isConst(); 10505 if (FirstConst != SecondConst) { 10506 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10507 FirstMethod->getSourceRange(), MethodConst) 10508 << FirstMethodType << FirstName << FirstConst; 10509 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10510 SecondMethod->getSourceRange(), MethodConst) 10511 << SecondMethodType << SecondName << SecondConst; 10512 Diagnosed = true; 10513 break; 10514 } 10515 10516 const bool FirstInline = FirstMethod->isInlineSpecified(); 10517 const bool SecondInline = SecondMethod->isInlineSpecified(); 10518 if (FirstInline != SecondInline) { 10519 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10520 FirstMethod->getSourceRange(), MethodInline) 10521 << FirstMethodType << FirstName << FirstInline; 10522 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10523 SecondMethod->getSourceRange(), MethodInline) 10524 << SecondMethodType << SecondName << SecondInline; 10525 Diagnosed = true; 10526 break; 10527 } 10528 10529 const unsigned FirstNumParameters = FirstMethod->param_size(); 10530 const unsigned SecondNumParameters = SecondMethod->param_size(); 10531 if (FirstNumParameters != SecondNumParameters) { 10532 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10533 FirstMethod->getSourceRange(), 10534 MethodNumberParameters) 10535 << FirstMethodType << FirstName << FirstNumParameters; 10536 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10537 SecondMethod->getSourceRange(), 10538 MethodNumberParameters) 10539 << SecondMethodType << SecondName << SecondNumParameters; 10540 Diagnosed = true; 10541 break; 10542 } 10543 10544 // Need this status boolean to know when break out of the switch. 10545 bool ParameterMismatch = false; 10546 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10547 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10548 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10549 10550 QualType FirstParamType = FirstParam->getType(); 10551 QualType SecondParamType = SecondParam->getType(); 10552 if (FirstParamType != SecondParamType && 10553 ComputeQualTypeODRHash(FirstParamType) != 10554 ComputeQualTypeODRHash(SecondParamType)) { 10555 if (const DecayedType *ParamDecayedType = 10556 FirstParamType->getAs<DecayedType>()) { 10557 ODRDiagDeclError( 10558 FirstRecord, FirstModule, FirstMethod->getLocation(), 10559 FirstMethod->getSourceRange(), MethodParameterType) 10560 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10561 << true << ParamDecayedType->getOriginalType(); 10562 } else { 10563 ODRDiagDeclError( 10564 FirstRecord, FirstModule, FirstMethod->getLocation(), 10565 FirstMethod->getSourceRange(), MethodParameterType) 10566 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10567 << false; 10568 } 10569 10570 if (const DecayedType *ParamDecayedType = 10571 SecondParamType->getAs<DecayedType>()) { 10572 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10573 SecondMethod->getSourceRange(), 10574 MethodParameterType) 10575 << SecondMethodType << SecondName << (I + 1) 10576 << SecondParamType << true 10577 << ParamDecayedType->getOriginalType(); 10578 } else { 10579 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10580 SecondMethod->getSourceRange(), 10581 MethodParameterType) 10582 << SecondMethodType << SecondName << (I + 1) 10583 << SecondParamType << false; 10584 } 10585 ParameterMismatch = true; 10586 break; 10587 } 10588 10589 DeclarationName FirstParamName = FirstParam->getDeclName(); 10590 DeclarationName SecondParamName = SecondParam->getDeclName(); 10591 if (FirstParamName != SecondParamName) { 10592 ODRDiagDeclError(FirstRecord, FirstModule, 10593 FirstMethod->getLocation(), 10594 FirstMethod->getSourceRange(), MethodParameterName) 10595 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10596 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10597 SecondMethod->getSourceRange(), MethodParameterName) 10598 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10599 ParameterMismatch = true; 10600 break; 10601 } 10602 10603 const Expr *FirstInit = FirstParam->getInit(); 10604 const Expr *SecondInit = SecondParam->getInit(); 10605 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10606 ODRDiagDeclError(FirstRecord, FirstModule, 10607 FirstMethod->getLocation(), 10608 FirstMethod->getSourceRange(), 10609 MethodParameterSingleDefaultArgument) 10610 << FirstMethodType << FirstName << (I + 1) 10611 << (FirstInit == nullptr) 10612 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10613 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10614 SecondMethod->getSourceRange(), 10615 MethodParameterSingleDefaultArgument) 10616 << SecondMethodType << SecondName << (I + 1) 10617 << (SecondInit == nullptr) 10618 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10619 ParameterMismatch = true; 10620 break; 10621 } 10622 10623 if (FirstInit && SecondInit && 10624 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10625 ODRDiagDeclError(FirstRecord, FirstModule, 10626 FirstMethod->getLocation(), 10627 FirstMethod->getSourceRange(), 10628 MethodParameterDifferentDefaultArgument) 10629 << FirstMethodType << FirstName << (I + 1) 10630 << FirstInit->getSourceRange(); 10631 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10632 SecondMethod->getSourceRange(), 10633 MethodParameterDifferentDefaultArgument) 10634 << SecondMethodType << SecondName << (I + 1) 10635 << SecondInit->getSourceRange(); 10636 ParameterMismatch = true; 10637 break; 10638 10639 } 10640 } 10641 10642 if (ParameterMismatch) { 10643 Diagnosed = true; 10644 break; 10645 } 10646 10647 const auto *FirstTemplateArgs = 10648 FirstMethod->getTemplateSpecializationArgs(); 10649 const auto *SecondTemplateArgs = 10650 SecondMethod->getTemplateSpecializationArgs(); 10651 10652 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10653 (!FirstTemplateArgs && SecondTemplateArgs)) { 10654 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10655 FirstMethod->getSourceRange(), 10656 MethodNoTemplateArguments) 10657 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10658 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10659 SecondMethod->getSourceRange(), 10660 MethodNoTemplateArguments) 10661 << SecondMethodType << SecondName 10662 << (SecondTemplateArgs != nullptr); 10663 10664 Diagnosed = true; 10665 break; 10666 } 10667 10668 if (FirstTemplateArgs && SecondTemplateArgs) { 10669 // Remove pack expansions from argument list. 10670 auto ExpandTemplateArgumentList = 10671 [](const TemplateArgumentList *TAL) { 10672 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10673 for (const TemplateArgument &TA : TAL->asArray()) { 10674 if (TA.getKind() != TemplateArgument::Pack) { 10675 ExpandedList.push_back(&TA); 10676 continue; 10677 } 10678 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10679 ExpandedList.push_back(&PackTA); 10680 } 10681 } 10682 return ExpandedList; 10683 }; 10684 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10685 ExpandTemplateArgumentList(FirstTemplateArgs); 10686 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10687 ExpandTemplateArgumentList(SecondTemplateArgs); 10688 10689 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10690 ODRDiagDeclError(FirstRecord, FirstModule, 10691 FirstMethod->getLocation(), 10692 FirstMethod->getSourceRange(), 10693 MethodDifferentNumberTemplateArguments) 10694 << FirstMethodType << FirstName 10695 << (unsigned)FirstExpandedList.size(); 10696 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10697 SecondMethod->getSourceRange(), 10698 MethodDifferentNumberTemplateArguments) 10699 << SecondMethodType << SecondName 10700 << (unsigned)SecondExpandedList.size(); 10701 10702 Diagnosed = true; 10703 break; 10704 } 10705 10706 bool TemplateArgumentMismatch = false; 10707 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10708 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10709 &SecondTA = *SecondExpandedList[i]; 10710 if (ComputeTemplateArgumentODRHash(FirstTA) == 10711 ComputeTemplateArgumentODRHash(SecondTA)) { 10712 continue; 10713 } 10714 10715 ODRDiagDeclError( 10716 FirstRecord, FirstModule, FirstMethod->getLocation(), 10717 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10718 << FirstMethodType << FirstName << FirstTA << i + 1; 10719 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10720 SecondMethod->getSourceRange(), 10721 MethodDifferentTemplateArgument) 10722 << SecondMethodType << SecondName << SecondTA << i + 1; 10723 10724 TemplateArgumentMismatch = true; 10725 break; 10726 } 10727 10728 if (TemplateArgumentMismatch) { 10729 Diagnosed = true; 10730 break; 10731 } 10732 } 10733 10734 // Compute the hash of the method as if it has no body. 10735 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10736 Hash.clear(); 10737 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10738 return Hash.CalculateHash(); 10739 }; 10740 10741 // Compare the hash generated to the hash stored. A difference means 10742 // that a body was present in the original source. Due to merging, 10743 // the stardard way of detecting a body will not work. 10744 const bool HasFirstBody = 10745 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10746 const bool HasSecondBody = 10747 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10748 10749 if (HasFirstBody != HasSecondBody) { 10750 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10751 FirstMethod->getSourceRange(), MethodSingleBody) 10752 << FirstMethodType << FirstName << HasFirstBody; 10753 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10754 SecondMethod->getSourceRange(), MethodSingleBody) 10755 << SecondMethodType << SecondName << HasSecondBody; 10756 Diagnosed = true; 10757 break; 10758 } 10759 10760 if (HasFirstBody && HasSecondBody) { 10761 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10762 FirstMethod->getSourceRange(), MethodDifferentBody) 10763 << FirstMethodType << FirstName; 10764 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10765 SecondMethod->getSourceRange(), MethodDifferentBody) 10766 << SecondMethodType << SecondName; 10767 Diagnosed = true; 10768 break; 10769 } 10770 10771 break; 10772 } 10773 case TypeAlias: 10774 case TypeDef: { 10775 Diagnosed = ODRDiagTypeDefOrAlias( 10776 FirstRecord, FirstModule, SecondModule, 10777 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10778 FirstDiffType == TypeAlias); 10779 break; 10780 } 10781 case Var: { 10782 Diagnosed = 10783 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10784 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10785 break; 10786 } 10787 case Friend: { 10788 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10789 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10790 10791 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10792 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10793 10794 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10795 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10796 10797 if (FirstND && SecondND) { 10798 ODRDiagDeclError(FirstRecord, FirstModule, 10799 FirstFriend->getFriendLoc(), 10800 FirstFriend->getSourceRange(), FriendFunction) 10801 << FirstND; 10802 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10803 SecondFriend->getSourceRange(), FriendFunction) 10804 << SecondND; 10805 10806 Diagnosed = true; 10807 break; 10808 } 10809 10810 if (FirstTSI && SecondTSI) { 10811 QualType FirstFriendType = FirstTSI->getType(); 10812 QualType SecondFriendType = SecondTSI->getType(); 10813 assert(ComputeQualTypeODRHash(FirstFriendType) != 10814 ComputeQualTypeODRHash(SecondFriendType)); 10815 ODRDiagDeclError(FirstRecord, FirstModule, 10816 FirstFriend->getFriendLoc(), 10817 FirstFriend->getSourceRange(), FriendType) 10818 << FirstFriendType; 10819 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10820 SecondFriend->getSourceRange(), FriendType) 10821 << SecondFriendType; 10822 Diagnosed = true; 10823 break; 10824 } 10825 10826 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10827 FirstFriend->getSourceRange(), FriendTypeFunction) 10828 << (FirstTSI == nullptr); 10829 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10830 SecondFriend->getSourceRange(), FriendTypeFunction) 10831 << (SecondTSI == nullptr); 10832 10833 Diagnosed = true; 10834 break; 10835 } 10836 case FunctionTemplate: { 10837 FunctionTemplateDecl *FirstTemplate = 10838 cast<FunctionTemplateDecl>(FirstDecl); 10839 FunctionTemplateDecl *SecondTemplate = 10840 cast<FunctionTemplateDecl>(SecondDecl); 10841 10842 TemplateParameterList *FirstTPL = 10843 FirstTemplate->getTemplateParameters(); 10844 TemplateParameterList *SecondTPL = 10845 SecondTemplate->getTemplateParameters(); 10846 10847 if (FirstTPL->size() != SecondTPL->size()) { 10848 ODRDiagDeclError(FirstRecord, FirstModule, 10849 FirstTemplate->getLocation(), 10850 FirstTemplate->getSourceRange(), 10851 FunctionTemplateDifferentNumberParameters) 10852 << FirstTemplate << FirstTPL->size(); 10853 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10854 SecondTemplate->getSourceRange(), 10855 FunctionTemplateDifferentNumberParameters) 10856 << SecondTemplate << SecondTPL->size(); 10857 10858 Diagnosed = true; 10859 break; 10860 } 10861 10862 bool ParameterMismatch = false; 10863 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10864 NamedDecl *FirstParam = FirstTPL->getParam(i); 10865 NamedDecl *SecondParam = SecondTPL->getParam(i); 10866 10867 if (FirstParam->getKind() != SecondParam->getKind()) { 10868 enum { 10869 TemplateTypeParameter, 10870 NonTypeTemplateParameter, 10871 TemplateTemplateParameter, 10872 }; 10873 auto GetParamType = [](NamedDecl *D) { 10874 switch (D->getKind()) { 10875 default: 10876 llvm_unreachable("Unexpected template parameter type"); 10877 case Decl::TemplateTypeParm: 10878 return TemplateTypeParameter; 10879 case Decl::NonTypeTemplateParm: 10880 return NonTypeTemplateParameter; 10881 case Decl::TemplateTemplateParm: 10882 return TemplateTemplateParameter; 10883 } 10884 }; 10885 10886 ODRDiagDeclError(FirstRecord, FirstModule, 10887 FirstTemplate->getLocation(), 10888 FirstTemplate->getSourceRange(), 10889 FunctionTemplateParameterDifferentKind) 10890 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10891 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10892 SecondTemplate->getSourceRange(), 10893 FunctionTemplateParameterDifferentKind) 10894 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10895 10896 ParameterMismatch = true; 10897 break; 10898 } 10899 10900 if (FirstParam->getName() != SecondParam->getName()) { 10901 ODRDiagDeclError( 10902 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10903 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10904 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10905 << FirstParam; 10906 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10907 SecondTemplate->getSourceRange(), 10908 FunctionTemplateParameterName) 10909 << SecondTemplate << (i + 1) 10910 << (bool)SecondParam->getIdentifier() << SecondParam; 10911 ParameterMismatch = true; 10912 break; 10913 } 10914 10915 if (isa<TemplateTypeParmDecl>(FirstParam) && 10916 isa<TemplateTypeParmDecl>(SecondParam)) { 10917 TemplateTypeParmDecl *FirstTTPD = 10918 cast<TemplateTypeParmDecl>(FirstParam); 10919 TemplateTypeParmDecl *SecondTTPD = 10920 cast<TemplateTypeParmDecl>(SecondParam); 10921 bool HasFirstDefaultArgument = 10922 FirstTTPD->hasDefaultArgument() && 10923 !FirstTTPD->defaultArgumentWasInherited(); 10924 bool HasSecondDefaultArgument = 10925 SecondTTPD->hasDefaultArgument() && 10926 !SecondTTPD->defaultArgumentWasInherited(); 10927 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10928 ODRDiagDeclError(FirstRecord, FirstModule, 10929 FirstTemplate->getLocation(), 10930 FirstTemplate->getSourceRange(), 10931 FunctionTemplateParameterSingleDefaultArgument) 10932 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10933 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10934 SecondTemplate->getSourceRange(), 10935 FunctionTemplateParameterSingleDefaultArgument) 10936 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10937 ParameterMismatch = true; 10938 break; 10939 } 10940 10941 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10942 QualType FirstType = FirstTTPD->getDefaultArgument(); 10943 QualType SecondType = SecondTTPD->getDefaultArgument(); 10944 if (ComputeQualTypeODRHash(FirstType) != 10945 ComputeQualTypeODRHash(SecondType)) { 10946 ODRDiagDeclError( 10947 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10948 FirstTemplate->getSourceRange(), 10949 FunctionTemplateParameterDifferentDefaultArgument) 10950 << FirstTemplate << (i + 1) << FirstType; 10951 ODRDiagDeclNote( 10952 SecondModule, SecondTemplate->getLocation(), 10953 SecondTemplate->getSourceRange(), 10954 FunctionTemplateParameterDifferentDefaultArgument) 10955 << SecondTemplate << (i + 1) << SecondType; 10956 ParameterMismatch = true; 10957 break; 10958 } 10959 } 10960 10961 if (FirstTTPD->isParameterPack() != 10962 SecondTTPD->isParameterPack()) { 10963 ODRDiagDeclError(FirstRecord, FirstModule, 10964 FirstTemplate->getLocation(), 10965 FirstTemplate->getSourceRange(), 10966 FunctionTemplatePackParameter) 10967 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 10968 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10969 SecondTemplate->getSourceRange(), 10970 FunctionTemplatePackParameter) 10971 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 10972 ParameterMismatch = true; 10973 break; 10974 } 10975 } 10976 10977 if (isa<TemplateTemplateParmDecl>(FirstParam) && 10978 isa<TemplateTemplateParmDecl>(SecondParam)) { 10979 TemplateTemplateParmDecl *FirstTTPD = 10980 cast<TemplateTemplateParmDecl>(FirstParam); 10981 TemplateTemplateParmDecl *SecondTTPD = 10982 cast<TemplateTemplateParmDecl>(SecondParam); 10983 10984 TemplateParameterList *FirstTPL = 10985 FirstTTPD->getTemplateParameters(); 10986 TemplateParameterList *SecondTPL = 10987 SecondTTPD->getTemplateParameters(); 10988 10989 if (ComputeTemplateParameterListODRHash(FirstTPL) != 10990 ComputeTemplateParameterListODRHash(SecondTPL)) { 10991 ODRDiagDeclError(FirstRecord, FirstModule, 10992 FirstTemplate->getLocation(), 10993 FirstTemplate->getSourceRange(), 10994 FunctionTemplateParameterDifferentType) 10995 << FirstTemplate << (i + 1); 10996 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10997 SecondTemplate->getSourceRange(), 10998 FunctionTemplateParameterDifferentType) 10999 << SecondTemplate << (i + 1); 11000 ParameterMismatch = true; 11001 break; 11002 } 11003 11004 bool HasFirstDefaultArgument = 11005 FirstTTPD->hasDefaultArgument() && 11006 !FirstTTPD->defaultArgumentWasInherited(); 11007 bool HasSecondDefaultArgument = 11008 SecondTTPD->hasDefaultArgument() && 11009 !SecondTTPD->defaultArgumentWasInherited(); 11010 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11011 ODRDiagDeclError(FirstRecord, FirstModule, 11012 FirstTemplate->getLocation(), 11013 FirstTemplate->getSourceRange(), 11014 FunctionTemplateParameterSingleDefaultArgument) 11015 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11016 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11017 SecondTemplate->getSourceRange(), 11018 FunctionTemplateParameterSingleDefaultArgument) 11019 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11020 ParameterMismatch = true; 11021 break; 11022 } 11023 11024 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11025 TemplateArgument FirstTA = 11026 FirstTTPD->getDefaultArgument().getArgument(); 11027 TemplateArgument SecondTA = 11028 SecondTTPD->getDefaultArgument().getArgument(); 11029 if (ComputeTemplateArgumentODRHash(FirstTA) != 11030 ComputeTemplateArgumentODRHash(SecondTA)) { 11031 ODRDiagDeclError( 11032 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11033 FirstTemplate->getSourceRange(), 11034 FunctionTemplateParameterDifferentDefaultArgument) 11035 << FirstTemplate << (i + 1) << FirstTA; 11036 ODRDiagDeclNote( 11037 SecondModule, SecondTemplate->getLocation(), 11038 SecondTemplate->getSourceRange(), 11039 FunctionTemplateParameterDifferentDefaultArgument) 11040 << SecondTemplate << (i + 1) << SecondTA; 11041 ParameterMismatch = true; 11042 break; 11043 } 11044 } 11045 11046 if (FirstTTPD->isParameterPack() != 11047 SecondTTPD->isParameterPack()) { 11048 ODRDiagDeclError(FirstRecord, FirstModule, 11049 FirstTemplate->getLocation(), 11050 FirstTemplate->getSourceRange(), 11051 FunctionTemplatePackParameter) 11052 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11053 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11054 SecondTemplate->getSourceRange(), 11055 FunctionTemplatePackParameter) 11056 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11057 ParameterMismatch = true; 11058 break; 11059 } 11060 } 11061 11062 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11063 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11064 NonTypeTemplateParmDecl *FirstNTTPD = 11065 cast<NonTypeTemplateParmDecl>(FirstParam); 11066 NonTypeTemplateParmDecl *SecondNTTPD = 11067 cast<NonTypeTemplateParmDecl>(SecondParam); 11068 11069 QualType FirstType = FirstNTTPD->getType(); 11070 QualType SecondType = SecondNTTPD->getType(); 11071 if (ComputeQualTypeODRHash(FirstType) != 11072 ComputeQualTypeODRHash(SecondType)) { 11073 ODRDiagDeclError(FirstRecord, FirstModule, 11074 FirstTemplate->getLocation(), 11075 FirstTemplate->getSourceRange(), 11076 FunctionTemplateParameterDifferentType) 11077 << FirstTemplate << (i + 1); 11078 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11079 SecondTemplate->getSourceRange(), 11080 FunctionTemplateParameterDifferentType) 11081 << SecondTemplate << (i + 1); 11082 ParameterMismatch = true; 11083 break; 11084 } 11085 11086 bool HasFirstDefaultArgument = 11087 FirstNTTPD->hasDefaultArgument() && 11088 !FirstNTTPD->defaultArgumentWasInherited(); 11089 bool HasSecondDefaultArgument = 11090 SecondNTTPD->hasDefaultArgument() && 11091 !SecondNTTPD->defaultArgumentWasInherited(); 11092 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11093 ODRDiagDeclError(FirstRecord, FirstModule, 11094 FirstTemplate->getLocation(), 11095 FirstTemplate->getSourceRange(), 11096 FunctionTemplateParameterSingleDefaultArgument) 11097 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11098 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11099 SecondTemplate->getSourceRange(), 11100 FunctionTemplateParameterSingleDefaultArgument) 11101 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11102 ParameterMismatch = true; 11103 break; 11104 } 11105 11106 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11107 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11108 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11109 if (ComputeODRHash(FirstDefaultArgument) != 11110 ComputeODRHash(SecondDefaultArgument)) { 11111 ODRDiagDeclError( 11112 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11113 FirstTemplate->getSourceRange(), 11114 FunctionTemplateParameterDifferentDefaultArgument) 11115 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11116 ODRDiagDeclNote( 11117 SecondModule, SecondTemplate->getLocation(), 11118 SecondTemplate->getSourceRange(), 11119 FunctionTemplateParameterDifferentDefaultArgument) 11120 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11121 ParameterMismatch = true; 11122 break; 11123 } 11124 } 11125 11126 if (FirstNTTPD->isParameterPack() != 11127 SecondNTTPD->isParameterPack()) { 11128 ODRDiagDeclError(FirstRecord, FirstModule, 11129 FirstTemplate->getLocation(), 11130 FirstTemplate->getSourceRange(), 11131 FunctionTemplatePackParameter) 11132 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11133 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11134 SecondTemplate->getSourceRange(), 11135 FunctionTemplatePackParameter) 11136 << SecondTemplate << (i + 1) 11137 << SecondNTTPD->isParameterPack(); 11138 ParameterMismatch = true; 11139 break; 11140 } 11141 } 11142 } 11143 11144 if (ParameterMismatch) { 11145 Diagnosed = true; 11146 break; 11147 } 11148 11149 break; 11150 } 11151 } 11152 11153 if (Diagnosed) 11154 continue; 11155 11156 Diag(FirstDecl->getLocation(), 11157 diag::err_module_odr_violation_mismatch_decl_unknown) 11158 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11159 << FirstDecl->getSourceRange(); 11160 Diag(SecondDecl->getLocation(), 11161 diag::note_module_odr_violation_mismatch_decl_unknown) 11162 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11163 Diagnosed = true; 11164 } 11165 11166 if (!Diagnosed) { 11167 // All definitions are updates to the same declaration. This happens if a 11168 // module instantiates the declaration of a class template specialization 11169 // and two or more other modules instantiate its definition. 11170 // 11171 // FIXME: Indicate which modules had instantiations of this definition. 11172 // FIXME: How can this even happen? 11173 Diag(Merge.first->getLocation(), 11174 diag::err_module_odr_violation_different_instantiations) 11175 << Merge.first; 11176 } 11177 } 11178 11179 // Issue ODR failures diagnostics for functions. 11180 for (auto &Merge : FunctionOdrMergeFailures) { 11181 enum ODRFunctionDifference { 11182 ReturnType, 11183 ParameterName, 11184 ParameterType, 11185 ParameterSingleDefaultArgument, 11186 ParameterDifferentDefaultArgument, 11187 FunctionBody, 11188 }; 11189 11190 FunctionDecl *FirstFunction = Merge.first; 11191 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11192 11193 bool Diagnosed = false; 11194 for (auto &SecondFunction : Merge.second) { 11195 11196 if (FirstFunction == SecondFunction) 11197 continue; 11198 11199 std::string SecondModule = 11200 getOwningModuleNameForDiagnostic(SecondFunction); 11201 11202 auto ODRDiagError = [FirstFunction, &FirstModule, 11203 this](SourceLocation Loc, SourceRange Range, 11204 ODRFunctionDifference DiffType) { 11205 return Diag(Loc, diag::err_module_odr_violation_function) 11206 << FirstFunction << FirstModule.empty() << FirstModule << Range 11207 << DiffType; 11208 }; 11209 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11210 SourceRange Range, 11211 ODRFunctionDifference DiffType) { 11212 return Diag(Loc, diag::note_module_odr_violation_function) 11213 << SecondModule << Range << DiffType; 11214 }; 11215 11216 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11217 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11218 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11219 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11220 << FirstFunction->getReturnType(); 11221 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11222 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11223 << SecondFunction->getReturnType(); 11224 Diagnosed = true; 11225 break; 11226 } 11227 11228 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11229 "Merged functions with different number of parameters"); 11230 11231 auto ParamSize = FirstFunction->param_size(); 11232 bool ParameterMismatch = false; 11233 for (unsigned I = 0; I < ParamSize; ++I) { 11234 auto *FirstParam = FirstFunction->getParamDecl(I); 11235 auto *SecondParam = SecondFunction->getParamDecl(I); 11236 11237 assert(getContext().hasSameType(FirstParam->getType(), 11238 SecondParam->getType()) && 11239 "Merged function has different parameter types."); 11240 11241 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11242 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11243 ParameterName) 11244 << I + 1 << FirstParam->getDeclName(); 11245 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11246 ParameterName) 11247 << I + 1 << SecondParam->getDeclName(); 11248 ParameterMismatch = true; 11249 break; 11250 }; 11251 11252 QualType FirstParamType = FirstParam->getType(); 11253 QualType SecondParamType = SecondParam->getType(); 11254 if (FirstParamType != SecondParamType && 11255 ComputeQualTypeODRHash(FirstParamType) != 11256 ComputeQualTypeODRHash(SecondParamType)) { 11257 if (const DecayedType *ParamDecayedType = 11258 FirstParamType->getAs<DecayedType>()) { 11259 ODRDiagError(FirstParam->getLocation(), 11260 FirstParam->getSourceRange(), ParameterType) 11261 << (I + 1) << FirstParamType << true 11262 << ParamDecayedType->getOriginalType(); 11263 } else { 11264 ODRDiagError(FirstParam->getLocation(), 11265 FirstParam->getSourceRange(), ParameterType) 11266 << (I + 1) << FirstParamType << false; 11267 } 11268 11269 if (const DecayedType *ParamDecayedType = 11270 SecondParamType->getAs<DecayedType>()) { 11271 ODRDiagNote(SecondParam->getLocation(), 11272 SecondParam->getSourceRange(), ParameterType) 11273 << (I + 1) << SecondParamType << true 11274 << ParamDecayedType->getOriginalType(); 11275 } else { 11276 ODRDiagNote(SecondParam->getLocation(), 11277 SecondParam->getSourceRange(), ParameterType) 11278 << (I + 1) << SecondParamType << false; 11279 } 11280 ParameterMismatch = true; 11281 break; 11282 } 11283 11284 const Expr *FirstInit = FirstParam->getInit(); 11285 const Expr *SecondInit = SecondParam->getInit(); 11286 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11287 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11288 ParameterSingleDefaultArgument) 11289 << (I + 1) << (FirstInit == nullptr) 11290 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11291 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11292 ParameterSingleDefaultArgument) 11293 << (I + 1) << (SecondInit == nullptr) 11294 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11295 ParameterMismatch = true; 11296 break; 11297 } 11298 11299 if (FirstInit && SecondInit && 11300 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11301 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11302 ParameterDifferentDefaultArgument) 11303 << (I + 1) << FirstInit->getSourceRange(); 11304 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11305 ParameterDifferentDefaultArgument) 11306 << (I + 1) << SecondInit->getSourceRange(); 11307 ParameterMismatch = true; 11308 break; 11309 } 11310 11311 assert(ComputeSubDeclODRHash(FirstParam) == 11312 ComputeSubDeclODRHash(SecondParam) && 11313 "Undiagnosed parameter difference."); 11314 } 11315 11316 if (ParameterMismatch) { 11317 Diagnosed = true; 11318 break; 11319 } 11320 11321 // If no error has been generated before now, assume the problem is in 11322 // the body and generate a message. 11323 ODRDiagError(FirstFunction->getLocation(), 11324 FirstFunction->getSourceRange(), FunctionBody); 11325 ODRDiagNote(SecondFunction->getLocation(), 11326 SecondFunction->getSourceRange(), FunctionBody); 11327 Diagnosed = true; 11328 break; 11329 } 11330 (void)Diagnosed; 11331 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11332 } 11333 11334 // Issue ODR failures diagnostics for enums. 11335 for (auto &Merge : EnumOdrMergeFailures) { 11336 enum ODREnumDifference { 11337 SingleScopedEnum, 11338 EnumTagKeywordMismatch, 11339 SingleSpecifiedType, 11340 DifferentSpecifiedTypes, 11341 DifferentNumberEnumConstants, 11342 EnumConstantName, 11343 EnumConstantSingleInitilizer, 11344 EnumConstantDifferentInitilizer, 11345 }; 11346 11347 // If we've already pointed out a specific problem with this enum, don't 11348 // bother issuing a general "something's different" diagnostic. 11349 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11350 continue; 11351 11352 EnumDecl *FirstEnum = Merge.first; 11353 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11354 11355 using DeclHashes = 11356 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11357 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11358 DeclHashes &Hashes, EnumDecl *Enum) { 11359 for (auto *D : Enum->decls()) { 11360 // Due to decl merging, the first EnumDecl is the parent of 11361 // Decls in both records. 11362 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum)) 11363 continue; 11364 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11365 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11366 ComputeSubDeclODRHash(D)); 11367 } 11368 }; 11369 DeclHashes FirstHashes; 11370 PopulateHashes(FirstHashes, FirstEnum); 11371 bool Diagnosed = false; 11372 for (auto &SecondEnum : Merge.second) { 11373 11374 if (FirstEnum == SecondEnum) 11375 continue; 11376 11377 std::string SecondModule = 11378 getOwningModuleNameForDiagnostic(SecondEnum); 11379 11380 auto ODRDiagError = [FirstEnum, &FirstModule, 11381 this](SourceLocation Loc, SourceRange Range, 11382 ODREnumDifference DiffType) { 11383 return Diag(Loc, diag::err_module_odr_violation_enum) 11384 << FirstEnum << FirstModule.empty() << FirstModule << Range 11385 << DiffType; 11386 }; 11387 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11388 SourceRange Range, 11389 ODREnumDifference DiffType) { 11390 return Diag(Loc, diag::note_module_odr_violation_enum) 11391 << SecondModule << Range << DiffType; 11392 }; 11393 11394 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11395 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11396 SingleScopedEnum) 11397 << FirstEnum->isScoped(); 11398 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11399 SingleScopedEnum) 11400 << SecondEnum->isScoped(); 11401 Diagnosed = true; 11402 continue; 11403 } 11404 11405 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11406 if (FirstEnum->isScopedUsingClassTag() != 11407 SecondEnum->isScopedUsingClassTag()) { 11408 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11409 EnumTagKeywordMismatch) 11410 << FirstEnum->isScopedUsingClassTag(); 11411 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11412 EnumTagKeywordMismatch) 11413 << SecondEnum->isScopedUsingClassTag(); 11414 Diagnosed = true; 11415 continue; 11416 } 11417 } 11418 11419 QualType FirstUnderlyingType = 11420 FirstEnum->getIntegerTypeSourceInfo() 11421 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11422 : QualType(); 11423 QualType SecondUnderlyingType = 11424 SecondEnum->getIntegerTypeSourceInfo() 11425 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11426 : QualType(); 11427 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11428 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11429 SingleSpecifiedType) 11430 << !FirstUnderlyingType.isNull(); 11431 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11432 SingleSpecifiedType) 11433 << !SecondUnderlyingType.isNull(); 11434 Diagnosed = true; 11435 continue; 11436 } 11437 11438 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11439 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11440 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11441 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11442 DifferentSpecifiedTypes) 11443 << FirstUnderlyingType; 11444 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11445 DifferentSpecifiedTypes) 11446 << SecondUnderlyingType; 11447 Diagnosed = true; 11448 continue; 11449 } 11450 } 11451 11452 DeclHashes SecondHashes; 11453 PopulateHashes(SecondHashes, SecondEnum); 11454 11455 if (FirstHashes.size() != SecondHashes.size()) { 11456 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11457 DifferentNumberEnumConstants) 11458 << (int)FirstHashes.size(); 11459 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11460 DifferentNumberEnumConstants) 11461 << (int)SecondHashes.size(); 11462 Diagnosed = true; 11463 continue; 11464 } 11465 11466 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11467 if (FirstHashes[I].second == SecondHashes[I].second) 11468 continue; 11469 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11470 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11471 11472 if (FirstEnumConstant->getDeclName() != 11473 SecondEnumConstant->getDeclName()) { 11474 11475 ODRDiagError(FirstEnumConstant->getLocation(), 11476 FirstEnumConstant->getSourceRange(), EnumConstantName) 11477 << I + 1 << FirstEnumConstant; 11478 ODRDiagNote(SecondEnumConstant->getLocation(), 11479 SecondEnumConstant->getSourceRange(), EnumConstantName) 11480 << I + 1 << SecondEnumConstant; 11481 Diagnosed = true; 11482 break; 11483 } 11484 11485 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11486 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11487 if (!FirstInit && !SecondInit) 11488 continue; 11489 11490 if (!FirstInit || !SecondInit) { 11491 ODRDiagError(FirstEnumConstant->getLocation(), 11492 FirstEnumConstant->getSourceRange(), 11493 EnumConstantSingleInitilizer) 11494 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11495 ODRDiagNote(SecondEnumConstant->getLocation(), 11496 SecondEnumConstant->getSourceRange(), 11497 EnumConstantSingleInitilizer) 11498 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11499 Diagnosed = true; 11500 break; 11501 } 11502 11503 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11504 ODRDiagError(FirstEnumConstant->getLocation(), 11505 FirstEnumConstant->getSourceRange(), 11506 EnumConstantDifferentInitilizer) 11507 << I + 1 << FirstEnumConstant; 11508 ODRDiagNote(SecondEnumConstant->getLocation(), 11509 SecondEnumConstant->getSourceRange(), 11510 EnumConstantDifferentInitilizer) 11511 << I + 1 << SecondEnumConstant; 11512 Diagnosed = true; 11513 break; 11514 } 11515 } 11516 } 11517 11518 (void)Diagnosed; 11519 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11520 } 11521 } 11522 11523 void ASTReader::StartedDeserializing() { 11524 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11525 ReadTimer->startTimer(); 11526 } 11527 11528 void ASTReader::FinishedDeserializing() { 11529 assert(NumCurrentElementsDeserializing && 11530 "FinishedDeserializing not paired with StartedDeserializing"); 11531 if (NumCurrentElementsDeserializing == 1) { 11532 // We decrease NumCurrentElementsDeserializing only after pending actions 11533 // are finished, to avoid recursively re-calling finishPendingActions(). 11534 finishPendingActions(); 11535 } 11536 --NumCurrentElementsDeserializing; 11537 11538 if (NumCurrentElementsDeserializing == 0) { 11539 // Propagate exception specification and deduced type updates along 11540 // redeclaration chains. 11541 // 11542 // We do this now rather than in finishPendingActions because we want to 11543 // be able to walk the complete redeclaration chains of the updated decls. 11544 while (!PendingExceptionSpecUpdates.empty() || 11545 !PendingDeducedTypeUpdates.empty()) { 11546 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11547 PendingExceptionSpecUpdates.clear(); 11548 for (auto Update : ESUpdates) { 11549 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11550 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11551 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11552 if (auto *Listener = getContext().getASTMutationListener()) 11553 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11554 for (auto *Redecl : Update.second->redecls()) 11555 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11556 } 11557 11558 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11559 PendingDeducedTypeUpdates.clear(); 11560 for (auto Update : DTUpdates) { 11561 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11562 // FIXME: If the return type is already deduced, check that it matches. 11563 getContext().adjustDeducedFunctionResultType(Update.first, 11564 Update.second); 11565 } 11566 } 11567 11568 if (ReadTimer) 11569 ReadTimer->stopTimer(); 11570 11571 diagnoseOdrViolations(); 11572 11573 // We are not in recursive loading, so it's safe to pass the "interesting" 11574 // decls to the consumer. 11575 if (Consumer) 11576 PassInterestingDeclsToConsumer(); 11577 } 11578 } 11579 11580 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11581 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11582 // Remove any fake results before adding any real ones. 11583 auto It = PendingFakeLookupResults.find(II); 11584 if (It != PendingFakeLookupResults.end()) { 11585 for (auto *ND : It->second) 11586 SemaObj->IdResolver.RemoveDecl(ND); 11587 // FIXME: this works around module+PCH performance issue. 11588 // Rather than erase the result from the map, which is O(n), just clear 11589 // the vector of NamedDecls. 11590 It->second.clear(); 11591 } 11592 } 11593 11594 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11595 SemaObj->TUScope->AddDecl(D); 11596 } else if (SemaObj->TUScope) { 11597 // Adding the decl to IdResolver may have failed because it was already in 11598 // (even though it was not added in scope). If it is already in, make sure 11599 // it gets in the scope as well. 11600 if (std::find(SemaObj->IdResolver.begin(Name), 11601 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11602 SemaObj->TUScope->AddDecl(D); 11603 } 11604 } 11605 11606 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11607 ASTContext *Context, 11608 const PCHContainerReader &PCHContainerRdr, 11609 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11610 StringRef isysroot, 11611 DisableValidationForModuleKind DisableValidationKind, 11612 bool AllowASTWithCompilerErrors, 11613 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11614 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11615 std::unique_ptr<llvm::Timer> ReadTimer) 11616 : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH) 11617 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11618 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11619 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11620 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11621 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11622 PCHContainerRdr, PP.getHeaderSearchInfo()), 11623 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11624 DisableValidationKind(DisableValidationKind), 11625 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11626 AllowConfigurationMismatch(AllowConfigurationMismatch), 11627 ValidateSystemInputs(ValidateSystemInputs), 11628 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11629 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11630 SourceMgr.setExternalSLocEntrySource(this); 11631 11632 for (const auto &Ext : Extensions) { 11633 auto BlockName = Ext->getExtensionMetadata().BlockName; 11634 auto Known = ModuleFileExtensions.find(BlockName); 11635 if (Known != ModuleFileExtensions.end()) { 11636 Diags.Report(diag::warn_duplicate_module_file_extension) 11637 << BlockName; 11638 continue; 11639 } 11640 11641 ModuleFileExtensions.insert({BlockName, Ext}); 11642 } 11643 } 11644 11645 ASTReader::~ASTReader() { 11646 if (OwnsDeserializationListener) 11647 delete DeserializationListener; 11648 } 11649 11650 IdentifierResolver &ASTReader::getIdResolver() { 11651 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11652 } 11653 11654 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11655 unsigned AbbrevID) { 11656 Idx = 0; 11657 Record.clear(); 11658 return Cursor.readRecord(AbbrevID, Record); 11659 } 11660 //===----------------------------------------------------------------------===// 11661 //// OMPClauseReader implementation 11662 ////===----------------------------------------------------------------------===// 11663 11664 // This has to be in namespace clang because it's friended by all 11665 // of the OMP clauses. 11666 namespace clang { 11667 11668 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11669 ASTRecordReader &Record; 11670 ASTContext &Context; 11671 11672 public: 11673 OMPClauseReader(ASTRecordReader &Record) 11674 : Record(Record), Context(Record.getContext()) {} 11675 #define GEN_CLANG_CLAUSE_CLASS 11676 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11677 #include "llvm/Frontend/OpenMP/OMP.inc" 11678 OMPClause *readClause(); 11679 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11680 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11681 }; 11682 11683 } // end namespace clang 11684 11685 OMPClause *ASTRecordReader::readOMPClause() { 11686 return OMPClauseReader(*this).readClause(); 11687 } 11688 11689 OMPClause *OMPClauseReader::readClause() { 11690 OMPClause *C = nullptr; 11691 switch (llvm::omp::Clause(Record.readInt())) { 11692 case llvm::omp::OMPC_if: 11693 C = new (Context) OMPIfClause(); 11694 break; 11695 case llvm::omp::OMPC_final: 11696 C = new (Context) OMPFinalClause(); 11697 break; 11698 case llvm::omp::OMPC_num_threads: 11699 C = new (Context) OMPNumThreadsClause(); 11700 break; 11701 case llvm::omp::OMPC_safelen: 11702 C = new (Context) OMPSafelenClause(); 11703 break; 11704 case llvm::omp::OMPC_simdlen: 11705 C = new (Context) OMPSimdlenClause(); 11706 break; 11707 case llvm::omp::OMPC_sizes: { 11708 unsigned NumSizes = Record.readInt(); 11709 C = OMPSizesClause::CreateEmpty(Context, NumSizes); 11710 break; 11711 } 11712 case llvm::omp::OMPC_full: 11713 C = OMPFullClause::CreateEmpty(Context); 11714 break; 11715 case llvm::omp::OMPC_partial: 11716 C = OMPPartialClause::CreateEmpty(Context); 11717 break; 11718 case llvm::omp::OMPC_allocator: 11719 C = new (Context) OMPAllocatorClause(); 11720 break; 11721 case llvm::omp::OMPC_collapse: 11722 C = new (Context) OMPCollapseClause(); 11723 break; 11724 case llvm::omp::OMPC_default: 11725 C = new (Context) OMPDefaultClause(); 11726 break; 11727 case llvm::omp::OMPC_proc_bind: 11728 C = new (Context) OMPProcBindClause(); 11729 break; 11730 case llvm::omp::OMPC_schedule: 11731 C = new (Context) OMPScheduleClause(); 11732 break; 11733 case llvm::omp::OMPC_ordered: 11734 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11735 break; 11736 case llvm::omp::OMPC_nowait: 11737 C = new (Context) OMPNowaitClause(); 11738 break; 11739 case llvm::omp::OMPC_untied: 11740 C = new (Context) OMPUntiedClause(); 11741 break; 11742 case llvm::omp::OMPC_mergeable: 11743 C = new (Context) OMPMergeableClause(); 11744 break; 11745 case llvm::omp::OMPC_read: 11746 C = new (Context) OMPReadClause(); 11747 break; 11748 case llvm::omp::OMPC_write: 11749 C = new (Context) OMPWriteClause(); 11750 break; 11751 case llvm::omp::OMPC_update: 11752 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11753 break; 11754 case llvm::omp::OMPC_capture: 11755 C = new (Context) OMPCaptureClause(); 11756 break; 11757 case llvm::omp::OMPC_seq_cst: 11758 C = new (Context) OMPSeqCstClause(); 11759 break; 11760 case llvm::omp::OMPC_acq_rel: 11761 C = new (Context) OMPAcqRelClause(); 11762 break; 11763 case llvm::omp::OMPC_acquire: 11764 C = new (Context) OMPAcquireClause(); 11765 break; 11766 case llvm::omp::OMPC_release: 11767 C = new (Context) OMPReleaseClause(); 11768 break; 11769 case llvm::omp::OMPC_relaxed: 11770 C = new (Context) OMPRelaxedClause(); 11771 break; 11772 case llvm::omp::OMPC_threads: 11773 C = new (Context) OMPThreadsClause(); 11774 break; 11775 case llvm::omp::OMPC_simd: 11776 C = new (Context) OMPSIMDClause(); 11777 break; 11778 case llvm::omp::OMPC_nogroup: 11779 C = new (Context) OMPNogroupClause(); 11780 break; 11781 case llvm::omp::OMPC_unified_address: 11782 C = new (Context) OMPUnifiedAddressClause(); 11783 break; 11784 case llvm::omp::OMPC_unified_shared_memory: 11785 C = new (Context) OMPUnifiedSharedMemoryClause(); 11786 break; 11787 case llvm::omp::OMPC_reverse_offload: 11788 C = new (Context) OMPReverseOffloadClause(); 11789 break; 11790 case llvm::omp::OMPC_dynamic_allocators: 11791 C = new (Context) OMPDynamicAllocatorsClause(); 11792 break; 11793 case llvm::omp::OMPC_atomic_default_mem_order: 11794 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11795 break; 11796 case llvm::omp::OMPC_private: 11797 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11798 break; 11799 case llvm::omp::OMPC_firstprivate: 11800 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11801 break; 11802 case llvm::omp::OMPC_lastprivate: 11803 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11804 break; 11805 case llvm::omp::OMPC_shared: 11806 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11807 break; 11808 case llvm::omp::OMPC_reduction: { 11809 unsigned N = Record.readInt(); 11810 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11811 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11812 break; 11813 } 11814 case llvm::omp::OMPC_task_reduction: 11815 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11816 break; 11817 case llvm::omp::OMPC_in_reduction: 11818 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11819 break; 11820 case llvm::omp::OMPC_linear: 11821 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11822 break; 11823 case llvm::omp::OMPC_aligned: 11824 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11825 break; 11826 case llvm::omp::OMPC_copyin: 11827 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11828 break; 11829 case llvm::omp::OMPC_copyprivate: 11830 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11831 break; 11832 case llvm::omp::OMPC_flush: 11833 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11834 break; 11835 case llvm::omp::OMPC_depobj: 11836 C = OMPDepobjClause::CreateEmpty(Context); 11837 break; 11838 case llvm::omp::OMPC_depend: { 11839 unsigned NumVars = Record.readInt(); 11840 unsigned NumLoops = Record.readInt(); 11841 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11842 break; 11843 } 11844 case llvm::omp::OMPC_device: 11845 C = new (Context) OMPDeviceClause(); 11846 break; 11847 case llvm::omp::OMPC_map: { 11848 OMPMappableExprListSizeTy Sizes; 11849 Sizes.NumVars = Record.readInt(); 11850 Sizes.NumUniqueDeclarations = Record.readInt(); 11851 Sizes.NumComponentLists = Record.readInt(); 11852 Sizes.NumComponents = Record.readInt(); 11853 C = OMPMapClause::CreateEmpty(Context, Sizes); 11854 break; 11855 } 11856 case llvm::omp::OMPC_num_teams: 11857 C = new (Context) OMPNumTeamsClause(); 11858 break; 11859 case llvm::omp::OMPC_thread_limit: 11860 C = new (Context) OMPThreadLimitClause(); 11861 break; 11862 case llvm::omp::OMPC_priority: 11863 C = new (Context) OMPPriorityClause(); 11864 break; 11865 case llvm::omp::OMPC_grainsize: 11866 C = new (Context) OMPGrainsizeClause(); 11867 break; 11868 case llvm::omp::OMPC_num_tasks: 11869 C = new (Context) OMPNumTasksClause(); 11870 break; 11871 case llvm::omp::OMPC_hint: 11872 C = new (Context) OMPHintClause(); 11873 break; 11874 case llvm::omp::OMPC_dist_schedule: 11875 C = new (Context) OMPDistScheduleClause(); 11876 break; 11877 case llvm::omp::OMPC_defaultmap: 11878 C = new (Context) OMPDefaultmapClause(); 11879 break; 11880 case llvm::omp::OMPC_to: { 11881 OMPMappableExprListSizeTy Sizes; 11882 Sizes.NumVars = Record.readInt(); 11883 Sizes.NumUniqueDeclarations = Record.readInt(); 11884 Sizes.NumComponentLists = Record.readInt(); 11885 Sizes.NumComponents = Record.readInt(); 11886 C = OMPToClause::CreateEmpty(Context, Sizes); 11887 break; 11888 } 11889 case llvm::omp::OMPC_from: { 11890 OMPMappableExprListSizeTy Sizes; 11891 Sizes.NumVars = Record.readInt(); 11892 Sizes.NumUniqueDeclarations = Record.readInt(); 11893 Sizes.NumComponentLists = Record.readInt(); 11894 Sizes.NumComponents = Record.readInt(); 11895 C = OMPFromClause::CreateEmpty(Context, Sizes); 11896 break; 11897 } 11898 case llvm::omp::OMPC_use_device_ptr: { 11899 OMPMappableExprListSizeTy Sizes; 11900 Sizes.NumVars = Record.readInt(); 11901 Sizes.NumUniqueDeclarations = Record.readInt(); 11902 Sizes.NumComponentLists = Record.readInt(); 11903 Sizes.NumComponents = Record.readInt(); 11904 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11905 break; 11906 } 11907 case llvm::omp::OMPC_use_device_addr: { 11908 OMPMappableExprListSizeTy Sizes; 11909 Sizes.NumVars = Record.readInt(); 11910 Sizes.NumUniqueDeclarations = Record.readInt(); 11911 Sizes.NumComponentLists = Record.readInt(); 11912 Sizes.NumComponents = Record.readInt(); 11913 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11914 break; 11915 } 11916 case llvm::omp::OMPC_is_device_ptr: { 11917 OMPMappableExprListSizeTy Sizes; 11918 Sizes.NumVars = Record.readInt(); 11919 Sizes.NumUniqueDeclarations = Record.readInt(); 11920 Sizes.NumComponentLists = Record.readInt(); 11921 Sizes.NumComponents = Record.readInt(); 11922 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11923 break; 11924 } 11925 case llvm::omp::OMPC_allocate: 11926 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11927 break; 11928 case llvm::omp::OMPC_nontemporal: 11929 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11930 break; 11931 case llvm::omp::OMPC_inclusive: 11932 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11933 break; 11934 case llvm::omp::OMPC_exclusive: 11935 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11936 break; 11937 case llvm::omp::OMPC_order: 11938 C = new (Context) OMPOrderClause(); 11939 break; 11940 case llvm::omp::OMPC_init: 11941 C = OMPInitClause::CreateEmpty(Context, Record.readInt()); 11942 break; 11943 case llvm::omp::OMPC_use: 11944 C = new (Context) OMPUseClause(); 11945 break; 11946 case llvm::omp::OMPC_destroy: 11947 C = new (Context) OMPDestroyClause(); 11948 break; 11949 case llvm::omp::OMPC_novariants: 11950 C = new (Context) OMPNovariantsClause(); 11951 break; 11952 case llvm::omp::OMPC_nocontext: 11953 C = new (Context) OMPNocontextClause(); 11954 break; 11955 case llvm::omp::OMPC_detach: 11956 C = new (Context) OMPDetachClause(); 11957 break; 11958 case llvm::omp::OMPC_uses_allocators: 11959 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11960 break; 11961 case llvm::omp::OMPC_affinity: 11962 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 11963 break; 11964 case llvm::omp::OMPC_filter: 11965 C = new (Context) OMPFilterClause(); 11966 break; 11967 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 11968 case llvm::omp::Enum: \ 11969 break; 11970 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11971 default: 11972 break; 11973 } 11974 assert(C && "Unknown OMPClause type"); 11975 11976 Visit(C); 11977 C->setLocStart(Record.readSourceLocation()); 11978 C->setLocEnd(Record.readSourceLocation()); 11979 11980 return C; 11981 } 11982 11983 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 11984 C->setPreInitStmt(Record.readSubStmt(), 11985 static_cast<OpenMPDirectiveKind>(Record.readInt())); 11986 } 11987 11988 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 11989 VisitOMPClauseWithPreInit(C); 11990 C->setPostUpdateExpr(Record.readSubExpr()); 11991 } 11992 11993 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 11994 VisitOMPClauseWithPreInit(C); 11995 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 11996 C->setNameModifierLoc(Record.readSourceLocation()); 11997 C->setColonLoc(Record.readSourceLocation()); 11998 C->setCondition(Record.readSubExpr()); 11999 C->setLParenLoc(Record.readSourceLocation()); 12000 } 12001 12002 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12003 VisitOMPClauseWithPreInit(C); 12004 C->setCondition(Record.readSubExpr()); 12005 C->setLParenLoc(Record.readSourceLocation()); 12006 } 12007 12008 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12009 VisitOMPClauseWithPreInit(C); 12010 C->setNumThreads(Record.readSubExpr()); 12011 C->setLParenLoc(Record.readSourceLocation()); 12012 } 12013 12014 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12015 C->setSafelen(Record.readSubExpr()); 12016 C->setLParenLoc(Record.readSourceLocation()); 12017 } 12018 12019 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12020 C->setSimdlen(Record.readSubExpr()); 12021 C->setLParenLoc(Record.readSourceLocation()); 12022 } 12023 12024 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) { 12025 for (Expr *&E : C->getSizesRefs()) 12026 E = Record.readSubExpr(); 12027 C->setLParenLoc(Record.readSourceLocation()); 12028 } 12029 12030 void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {} 12031 12032 void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) { 12033 C->setFactor(Record.readSubExpr()); 12034 C->setLParenLoc(Record.readSourceLocation()); 12035 } 12036 12037 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12038 C->setAllocator(Record.readExpr()); 12039 C->setLParenLoc(Record.readSourceLocation()); 12040 } 12041 12042 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12043 C->setNumForLoops(Record.readSubExpr()); 12044 C->setLParenLoc(Record.readSourceLocation()); 12045 } 12046 12047 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12048 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12049 C->setLParenLoc(Record.readSourceLocation()); 12050 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12051 } 12052 12053 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12054 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12055 C->setLParenLoc(Record.readSourceLocation()); 12056 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12057 } 12058 12059 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12060 VisitOMPClauseWithPreInit(C); 12061 C->setScheduleKind( 12062 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12063 C->setFirstScheduleModifier( 12064 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12065 C->setSecondScheduleModifier( 12066 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12067 C->setChunkSize(Record.readSubExpr()); 12068 C->setLParenLoc(Record.readSourceLocation()); 12069 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12070 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12071 C->setScheduleKindLoc(Record.readSourceLocation()); 12072 C->setCommaLoc(Record.readSourceLocation()); 12073 } 12074 12075 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12076 C->setNumForLoops(Record.readSubExpr()); 12077 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12078 C->setLoopNumIterations(I, Record.readSubExpr()); 12079 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12080 C->setLoopCounter(I, Record.readSubExpr()); 12081 C->setLParenLoc(Record.readSourceLocation()); 12082 } 12083 12084 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12085 C->setEventHandler(Record.readSubExpr()); 12086 C->setLParenLoc(Record.readSourceLocation()); 12087 } 12088 12089 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12090 12091 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12092 12093 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12094 12095 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12096 12097 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12098 12099 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12100 if (C->isExtended()) { 12101 C->setLParenLoc(Record.readSourceLocation()); 12102 C->setArgumentLoc(Record.readSourceLocation()); 12103 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12104 } 12105 } 12106 12107 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12108 12109 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12110 12111 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12112 12113 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12114 12115 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12116 12117 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12118 12119 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12120 12121 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12122 12123 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12124 12125 void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) { 12126 unsigned NumVars = C->varlist_size(); 12127 SmallVector<Expr *, 16> Vars; 12128 Vars.reserve(NumVars); 12129 for (unsigned I = 0; I != NumVars; ++I) 12130 Vars.push_back(Record.readSubExpr()); 12131 C->setVarRefs(Vars); 12132 C->setIsTarget(Record.readBool()); 12133 C->setIsTargetSync(Record.readBool()); 12134 C->setLParenLoc(Record.readSourceLocation()); 12135 C->setVarLoc(Record.readSourceLocation()); 12136 } 12137 12138 void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) { 12139 C->setInteropVar(Record.readSubExpr()); 12140 C->setLParenLoc(Record.readSourceLocation()); 12141 C->setVarLoc(Record.readSourceLocation()); 12142 } 12143 12144 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) { 12145 C->setInteropVar(Record.readSubExpr()); 12146 C->setLParenLoc(Record.readSourceLocation()); 12147 C->setVarLoc(Record.readSourceLocation()); 12148 } 12149 12150 void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) { 12151 VisitOMPClauseWithPreInit(C); 12152 C->setCondition(Record.readSubExpr()); 12153 C->setLParenLoc(Record.readSourceLocation()); 12154 } 12155 12156 void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) { 12157 VisitOMPClauseWithPreInit(C); 12158 C->setCondition(Record.readSubExpr()); 12159 C->setLParenLoc(Record.readSourceLocation()); 12160 } 12161 12162 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12163 12164 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12165 OMPUnifiedSharedMemoryClause *) {} 12166 12167 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12168 12169 void 12170 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12171 } 12172 12173 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12174 OMPAtomicDefaultMemOrderClause *C) { 12175 C->setAtomicDefaultMemOrderKind( 12176 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12177 C->setLParenLoc(Record.readSourceLocation()); 12178 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12179 } 12180 12181 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12182 C->setLParenLoc(Record.readSourceLocation()); 12183 unsigned NumVars = C->varlist_size(); 12184 SmallVector<Expr *, 16> Vars; 12185 Vars.reserve(NumVars); 12186 for (unsigned i = 0; i != NumVars; ++i) 12187 Vars.push_back(Record.readSubExpr()); 12188 C->setVarRefs(Vars); 12189 Vars.clear(); 12190 for (unsigned i = 0; i != NumVars; ++i) 12191 Vars.push_back(Record.readSubExpr()); 12192 C->setPrivateCopies(Vars); 12193 } 12194 12195 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12196 VisitOMPClauseWithPreInit(C); 12197 C->setLParenLoc(Record.readSourceLocation()); 12198 unsigned NumVars = C->varlist_size(); 12199 SmallVector<Expr *, 16> Vars; 12200 Vars.reserve(NumVars); 12201 for (unsigned i = 0; i != NumVars; ++i) 12202 Vars.push_back(Record.readSubExpr()); 12203 C->setVarRefs(Vars); 12204 Vars.clear(); 12205 for (unsigned i = 0; i != NumVars; ++i) 12206 Vars.push_back(Record.readSubExpr()); 12207 C->setPrivateCopies(Vars); 12208 Vars.clear(); 12209 for (unsigned i = 0; i != NumVars; ++i) 12210 Vars.push_back(Record.readSubExpr()); 12211 C->setInits(Vars); 12212 } 12213 12214 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12215 VisitOMPClauseWithPostUpdate(C); 12216 C->setLParenLoc(Record.readSourceLocation()); 12217 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12218 C->setKindLoc(Record.readSourceLocation()); 12219 C->setColonLoc(Record.readSourceLocation()); 12220 unsigned NumVars = C->varlist_size(); 12221 SmallVector<Expr *, 16> Vars; 12222 Vars.reserve(NumVars); 12223 for (unsigned i = 0; i != NumVars; ++i) 12224 Vars.push_back(Record.readSubExpr()); 12225 C->setVarRefs(Vars); 12226 Vars.clear(); 12227 for (unsigned i = 0; i != NumVars; ++i) 12228 Vars.push_back(Record.readSubExpr()); 12229 C->setPrivateCopies(Vars); 12230 Vars.clear(); 12231 for (unsigned i = 0; i != NumVars; ++i) 12232 Vars.push_back(Record.readSubExpr()); 12233 C->setSourceExprs(Vars); 12234 Vars.clear(); 12235 for (unsigned i = 0; i != NumVars; ++i) 12236 Vars.push_back(Record.readSubExpr()); 12237 C->setDestinationExprs(Vars); 12238 Vars.clear(); 12239 for (unsigned i = 0; i != NumVars; ++i) 12240 Vars.push_back(Record.readSubExpr()); 12241 C->setAssignmentOps(Vars); 12242 } 12243 12244 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12245 C->setLParenLoc(Record.readSourceLocation()); 12246 unsigned NumVars = C->varlist_size(); 12247 SmallVector<Expr *, 16> Vars; 12248 Vars.reserve(NumVars); 12249 for (unsigned i = 0; i != NumVars; ++i) 12250 Vars.push_back(Record.readSubExpr()); 12251 C->setVarRefs(Vars); 12252 } 12253 12254 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12255 VisitOMPClauseWithPostUpdate(C); 12256 C->setLParenLoc(Record.readSourceLocation()); 12257 C->setModifierLoc(Record.readSourceLocation()); 12258 C->setColonLoc(Record.readSourceLocation()); 12259 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12260 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12261 C->setQualifierLoc(NNSL); 12262 C->setNameInfo(DNI); 12263 12264 unsigned NumVars = C->varlist_size(); 12265 SmallVector<Expr *, 16> Vars; 12266 Vars.reserve(NumVars); 12267 for (unsigned i = 0; i != NumVars; ++i) 12268 Vars.push_back(Record.readSubExpr()); 12269 C->setVarRefs(Vars); 12270 Vars.clear(); 12271 for (unsigned i = 0; i != NumVars; ++i) 12272 Vars.push_back(Record.readSubExpr()); 12273 C->setPrivates(Vars); 12274 Vars.clear(); 12275 for (unsigned i = 0; i != NumVars; ++i) 12276 Vars.push_back(Record.readSubExpr()); 12277 C->setLHSExprs(Vars); 12278 Vars.clear(); 12279 for (unsigned i = 0; i != NumVars; ++i) 12280 Vars.push_back(Record.readSubExpr()); 12281 C->setRHSExprs(Vars); 12282 Vars.clear(); 12283 for (unsigned i = 0; i != NumVars; ++i) 12284 Vars.push_back(Record.readSubExpr()); 12285 C->setReductionOps(Vars); 12286 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12287 Vars.clear(); 12288 for (unsigned i = 0; i != NumVars; ++i) 12289 Vars.push_back(Record.readSubExpr()); 12290 C->setInscanCopyOps(Vars); 12291 Vars.clear(); 12292 for (unsigned i = 0; i != NumVars; ++i) 12293 Vars.push_back(Record.readSubExpr()); 12294 C->setInscanCopyArrayTemps(Vars); 12295 Vars.clear(); 12296 for (unsigned i = 0; i != NumVars; ++i) 12297 Vars.push_back(Record.readSubExpr()); 12298 C->setInscanCopyArrayElems(Vars); 12299 } 12300 } 12301 12302 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12303 VisitOMPClauseWithPostUpdate(C); 12304 C->setLParenLoc(Record.readSourceLocation()); 12305 C->setColonLoc(Record.readSourceLocation()); 12306 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12307 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12308 C->setQualifierLoc(NNSL); 12309 C->setNameInfo(DNI); 12310 12311 unsigned NumVars = C->varlist_size(); 12312 SmallVector<Expr *, 16> Vars; 12313 Vars.reserve(NumVars); 12314 for (unsigned I = 0; I != NumVars; ++I) 12315 Vars.push_back(Record.readSubExpr()); 12316 C->setVarRefs(Vars); 12317 Vars.clear(); 12318 for (unsigned I = 0; I != NumVars; ++I) 12319 Vars.push_back(Record.readSubExpr()); 12320 C->setPrivates(Vars); 12321 Vars.clear(); 12322 for (unsigned I = 0; I != NumVars; ++I) 12323 Vars.push_back(Record.readSubExpr()); 12324 C->setLHSExprs(Vars); 12325 Vars.clear(); 12326 for (unsigned I = 0; I != NumVars; ++I) 12327 Vars.push_back(Record.readSubExpr()); 12328 C->setRHSExprs(Vars); 12329 Vars.clear(); 12330 for (unsigned I = 0; I != NumVars; ++I) 12331 Vars.push_back(Record.readSubExpr()); 12332 C->setReductionOps(Vars); 12333 } 12334 12335 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12336 VisitOMPClauseWithPostUpdate(C); 12337 C->setLParenLoc(Record.readSourceLocation()); 12338 C->setColonLoc(Record.readSourceLocation()); 12339 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12340 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12341 C->setQualifierLoc(NNSL); 12342 C->setNameInfo(DNI); 12343 12344 unsigned NumVars = C->varlist_size(); 12345 SmallVector<Expr *, 16> Vars; 12346 Vars.reserve(NumVars); 12347 for (unsigned I = 0; I != NumVars; ++I) 12348 Vars.push_back(Record.readSubExpr()); 12349 C->setVarRefs(Vars); 12350 Vars.clear(); 12351 for (unsigned I = 0; I != NumVars; ++I) 12352 Vars.push_back(Record.readSubExpr()); 12353 C->setPrivates(Vars); 12354 Vars.clear(); 12355 for (unsigned I = 0; I != NumVars; ++I) 12356 Vars.push_back(Record.readSubExpr()); 12357 C->setLHSExprs(Vars); 12358 Vars.clear(); 12359 for (unsigned I = 0; I != NumVars; ++I) 12360 Vars.push_back(Record.readSubExpr()); 12361 C->setRHSExprs(Vars); 12362 Vars.clear(); 12363 for (unsigned I = 0; I != NumVars; ++I) 12364 Vars.push_back(Record.readSubExpr()); 12365 C->setReductionOps(Vars); 12366 Vars.clear(); 12367 for (unsigned I = 0; I != NumVars; ++I) 12368 Vars.push_back(Record.readSubExpr()); 12369 C->setTaskgroupDescriptors(Vars); 12370 } 12371 12372 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12373 VisitOMPClauseWithPostUpdate(C); 12374 C->setLParenLoc(Record.readSourceLocation()); 12375 C->setColonLoc(Record.readSourceLocation()); 12376 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12377 C->setModifierLoc(Record.readSourceLocation()); 12378 unsigned NumVars = C->varlist_size(); 12379 SmallVector<Expr *, 16> Vars; 12380 Vars.reserve(NumVars); 12381 for (unsigned i = 0; i != NumVars; ++i) 12382 Vars.push_back(Record.readSubExpr()); 12383 C->setVarRefs(Vars); 12384 Vars.clear(); 12385 for (unsigned i = 0; i != NumVars; ++i) 12386 Vars.push_back(Record.readSubExpr()); 12387 C->setPrivates(Vars); 12388 Vars.clear(); 12389 for (unsigned i = 0; i != NumVars; ++i) 12390 Vars.push_back(Record.readSubExpr()); 12391 C->setInits(Vars); 12392 Vars.clear(); 12393 for (unsigned i = 0; i != NumVars; ++i) 12394 Vars.push_back(Record.readSubExpr()); 12395 C->setUpdates(Vars); 12396 Vars.clear(); 12397 for (unsigned i = 0; i != NumVars; ++i) 12398 Vars.push_back(Record.readSubExpr()); 12399 C->setFinals(Vars); 12400 C->setStep(Record.readSubExpr()); 12401 C->setCalcStep(Record.readSubExpr()); 12402 Vars.clear(); 12403 for (unsigned I = 0; I != NumVars + 1; ++I) 12404 Vars.push_back(Record.readSubExpr()); 12405 C->setUsedExprs(Vars); 12406 } 12407 12408 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12409 C->setLParenLoc(Record.readSourceLocation()); 12410 C->setColonLoc(Record.readSourceLocation()); 12411 unsigned NumVars = C->varlist_size(); 12412 SmallVector<Expr *, 16> Vars; 12413 Vars.reserve(NumVars); 12414 for (unsigned i = 0; i != NumVars; ++i) 12415 Vars.push_back(Record.readSubExpr()); 12416 C->setVarRefs(Vars); 12417 C->setAlignment(Record.readSubExpr()); 12418 } 12419 12420 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12421 C->setLParenLoc(Record.readSourceLocation()); 12422 unsigned NumVars = C->varlist_size(); 12423 SmallVector<Expr *, 16> Exprs; 12424 Exprs.reserve(NumVars); 12425 for (unsigned i = 0; i != NumVars; ++i) 12426 Exprs.push_back(Record.readSubExpr()); 12427 C->setVarRefs(Exprs); 12428 Exprs.clear(); 12429 for (unsigned i = 0; i != NumVars; ++i) 12430 Exprs.push_back(Record.readSubExpr()); 12431 C->setSourceExprs(Exprs); 12432 Exprs.clear(); 12433 for (unsigned i = 0; i != NumVars; ++i) 12434 Exprs.push_back(Record.readSubExpr()); 12435 C->setDestinationExprs(Exprs); 12436 Exprs.clear(); 12437 for (unsigned i = 0; i != NumVars; ++i) 12438 Exprs.push_back(Record.readSubExpr()); 12439 C->setAssignmentOps(Exprs); 12440 } 12441 12442 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12443 C->setLParenLoc(Record.readSourceLocation()); 12444 unsigned NumVars = C->varlist_size(); 12445 SmallVector<Expr *, 16> Exprs; 12446 Exprs.reserve(NumVars); 12447 for (unsigned i = 0; i != NumVars; ++i) 12448 Exprs.push_back(Record.readSubExpr()); 12449 C->setVarRefs(Exprs); 12450 Exprs.clear(); 12451 for (unsigned i = 0; i != NumVars; ++i) 12452 Exprs.push_back(Record.readSubExpr()); 12453 C->setSourceExprs(Exprs); 12454 Exprs.clear(); 12455 for (unsigned i = 0; i != NumVars; ++i) 12456 Exprs.push_back(Record.readSubExpr()); 12457 C->setDestinationExprs(Exprs); 12458 Exprs.clear(); 12459 for (unsigned i = 0; i != NumVars; ++i) 12460 Exprs.push_back(Record.readSubExpr()); 12461 C->setAssignmentOps(Exprs); 12462 } 12463 12464 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12465 C->setLParenLoc(Record.readSourceLocation()); 12466 unsigned NumVars = C->varlist_size(); 12467 SmallVector<Expr *, 16> Vars; 12468 Vars.reserve(NumVars); 12469 for (unsigned i = 0; i != NumVars; ++i) 12470 Vars.push_back(Record.readSubExpr()); 12471 C->setVarRefs(Vars); 12472 } 12473 12474 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12475 C->setDepobj(Record.readSubExpr()); 12476 C->setLParenLoc(Record.readSourceLocation()); 12477 } 12478 12479 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12480 C->setLParenLoc(Record.readSourceLocation()); 12481 C->setModifier(Record.readSubExpr()); 12482 C->setDependencyKind( 12483 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12484 C->setDependencyLoc(Record.readSourceLocation()); 12485 C->setColonLoc(Record.readSourceLocation()); 12486 unsigned NumVars = C->varlist_size(); 12487 SmallVector<Expr *, 16> Vars; 12488 Vars.reserve(NumVars); 12489 for (unsigned I = 0; I != NumVars; ++I) 12490 Vars.push_back(Record.readSubExpr()); 12491 C->setVarRefs(Vars); 12492 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12493 C->setLoopData(I, Record.readSubExpr()); 12494 } 12495 12496 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12497 VisitOMPClauseWithPreInit(C); 12498 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12499 C->setDevice(Record.readSubExpr()); 12500 C->setModifierLoc(Record.readSourceLocation()); 12501 C->setLParenLoc(Record.readSourceLocation()); 12502 } 12503 12504 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12505 C->setLParenLoc(Record.readSourceLocation()); 12506 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12507 C->setMapTypeModifier( 12508 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12509 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12510 } 12511 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12512 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12513 C->setMapType( 12514 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12515 C->setMapLoc(Record.readSourceLocation()); 12516 C->setColonLoc(Record.readSourceLocation()); 12517 auto NumVars = C->varlist_size(); 12518 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12519 auto TotalLists = C->getTotalComponentListNum(); 12520 auto TotalComponents = C->getTotalComponentsNum(); 12521 12522 SmallVector<Expr *, 16> Vars; 12523 Vars.reserve(NumVars); 12524 for (unsigned i = 0; i != NumVars; ++i) 12525 Vars.push_back(Record.readExpr()); 12526 C->setVarRefs(Vars); 12527 12528 SmallVector<Expr *, 16> UDMappers; 12529 UDMappers.reserve(NumVars); 12530 for (unsigned I = 0; I < NumVars; ++I) 12531 UDMappers.push_back(Record.readExpr()); 12532 C->setUDMapperRefs(UDMappers); 12533 12534 SmallVector<ValueDecl *, 16> Decls; 12535 Decls.reserve(UniqueDecls); 12536 for (unsigned i = 0; i < UniqueDecls; ++i) 12537 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12538 C->setUniqueDecls(Decls); 12539 12540 SmallVector<unsigned, 16> ListsPerDecl; 12541 ListsPerDecl.reserve(UniqueDecls); 12542 for (unsigned i = 0; i < UniqueDecls; ++i) 12543 ListsPerDecl.push_back(Record.readInt()); 12544 C->setDeclNumLists(ListsPerDecl); 12545 12546 SmallVector<unsigned, 32> ListSizes; 12547 ListSizes.reserve(TotalLists); 12548 for (unsigned i = 0; i < TotalLists; ++i) 12549 ListSizes.push_back(Record.readInt()); 12550 C->setComponentListSizes(ListSizes); 12551 12552 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12553 Components.reserve(TotalComponents); 12554 for (unsigned i = 0; i < TotalComponents; ++i) { 12555 Expr *AssociatedExprPr = Record.readExpr(); 12556 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12557 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12558 /*IsNonContiguous=*/false); 12559 } 12560 C->setComponents(Components, ListSizes); 12561 } 12562 12563 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12564 C->setLParenLoc(Record.readSourceLocation()); 12565 C->setColonLoc(Record.readSourceLocation()); 12566 C->setAllocator(Record.readSubExpr()); 12567 unsigned NumVars = C->varlist_size(); 12568 SmallVector<Expr *, 16> Vars; 12569 Vars.reserve(NumVars); 12570 for (unsigned i = 0; i != NumVars; ++i) 12571 Vars.push_back(Record.readSubExpr()); 12572 C->setVarRefs(Vars); 12573 } 12574 12575 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12576 VisitOMPClauseWithPreInit(C); 12577 C->setNumTeams(Record.readSubExpr()); 12578 C->setLParenLoc(Record.readSourceLocation()); 12579 } 12580 12581 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12582 VisitOMPClauseWithPreInit(C); 12583 C->setThreadLimit(Record.readSubExpr()); 12584 C->setLParenLoc(Record.readSourceLocation()); 12585 } 12586 12587 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12588 VisitOMPClauseWithPreInit(C); 12589 C->setPriority(Record.readSubExpr()); 12590 C->setLParenLoc(Record.readSourceLocation()); 12591 } 12592 12593 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12594 VisitOMPClauseWithPreInit(C); 12595 C->setGrainsize(Record.readSubExpr()); 12596 C->setLParenLoc(Record.readSourceLocation()); 12597 } 12598 12599 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12600 VisitOMPClauseWithPreInit(C); 12601 C->setNumTasks(Record.readSubExpr()); 12602 C->setLParenLoc(Record.readSourceLocation()); 12603 } 12604 12605 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12606 C->setHint(Record.readSubExpr()); 12607 C->setLParenLoc(Record.readSourceLocation()); 12608 } 12609 12610 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12611 VisitOMPClauseWithPreInit(C); 12612 C->setDistScheduleKind( 12613 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12614 C->setChunkSize(Record.readSubExpr()); 12615 C->setLParenLoc(Record.readSourceLocation()); 12616 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12617 C->setCommaLoc(Record.readSourceLocation()); 12618 } 12619 12620 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12621 C->setDefaultmapKind( 12622 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12623 C->setDefaultmapModifier( 12624 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12625 C->setLParenLoc(Record.readSourceLocation()); 12626 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12627 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12628 } 12629 12630 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12631 C->setLParenLoc(Record.readSourceLocation()); 12632 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12633 C->setMotionModifier( 12634 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12635 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12636 } 12637 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12638 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12639 C->setColonLoc(Record.readSourceLocation()); 12640 auto NumVars = C->varlist_size(); 12641 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12642 auto TotalLists = C->getTotalComponentListNum(); 12643 auto TotalComponents = C->getTotalComponentsNum(); 12644 12645 SmallVector<Expr *, 16> Vars; 12646 Vars.reserve(NumVars); 12647 for (unsigned i = 0; i != NumVars; ++i) 12648 Vars.push_back(Record.readSubExpr()); 12649 C->setVarRefs(Vars); 12650 12651 SmallVector<Expr *, 16> UDMappers; 12652 UDMappers.reserve(NumVars); 12653 for (unsigned I = 0; I < NumVars; ++I) 12654 UDMappers.push_back(Record.readSubExpr()); 12655 C->setUDMapperRefs(UDMappers); 12656 12657 SmallVector<ValueDecl *, 16> Decls; 12658 Decls.reserve(UniqueDecls); 12659 for (unsigned i = 0; i < UniqueDecls; ++i) 12660 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12661 C->setUniqueDecls(Decls); 12662 12663 SmallVector<unsigned, 16> ListsPerDecl; 12664 ListsPerDecl.reserve(UniqueDecls); 12665 for (unsigned i = 0; i < UniqueDecls; ++i) 12666 ListsPerDecl.push_back(Record.readInt()); 12667 C->setDeclNumLists(ListsPerDecl); 12668 12669 SmallVector<unsigned, 32> ListSizes; 12670 ListSizes.reserve(TotalLists); 12671 for (unsigned i = 0; i < TotalLists; ++i) 12672 ListSizes.push_back(Record.readInt()); 12673 C->setComponentListSizes(ListSizes); 12674 12675 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12676 Components.reserve(TotalComponents); 12677 for (unsigned i = 0; i < TotalComponents; ++i) { 12678 Expr *AssociatedExprPr = Record.readSubExpr(); 12679 bool IsNonContiguous = Record.readBool(); 12680 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12681 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12682 } 12683 C->setComponents(Components, ListSizes); 12684 } 12685 12686 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12687 C->setLParenLoc(Record.readSourceLocation()); 12688 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12689 C->setMotionModifier( 12690 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12691 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12692 } 12693 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12694 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12695 C->setColonLoc(Record.readSourceLocation()); 12696 auto NumVars = C->varlist_size(); 12697 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12698 auto TotalLists = C->getTotalComponentListNum(); 12699 auto TotalComponents = C->getTotalComponentsNum(); 12700 12701 SmallVector<Expr *, 16> Vars; 12702 Vars.reserve(NumVars); 12703 for (unsigned i = 0; i != NumVars; ++i) 12704 Vars.push_back(Record.readSubExpr()); 12705 C->setVarRefs(Vars); 12706 12707 SmallVector<Expr *, 16> UDMappers; 12708 UDMappers.reserve(NumVars); 12709 for (unsigned I = 0; I < NumVars; ++I) 12710 UDMappers.push_back(Record.readSubExpr()); 12711 C->setUDMapperRefs(UDMappers); 12712 12713 SmallVector<ValueDecl *, 16> Decls; 12714 Decls.reserve(UniqueDecls); 12715 for (unsigned i = 0; i < UniqueDecls; ++i) 12716 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12717 C->setUniqueDecls(Decls); 12718 12719 SmallVector<unsigned, 16> ListsPerDecl; 12720 ListsPerDecl.reserve(UniqueDecls); 12721 for (unsigned i = 0; i < UniqueDecls; ++i) 12722 ListsPerDecl.push_back(Record.readInt()); 12723 C->setDeclNumLists(ListsPerDecl); 12724 12725 SmallVector<unsigned, 32> ListSizes; 12726 ListSizes.reserve(TotalLists); 12727 for (unsigned i = 0; i < TotalLists; ++i) 12728 ListSizes.push_back(Record.readInt()); 12729 C->setComponentListSizes(ListSizes); 12730 12731 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12732 Components.reserve(TotalComponents); 12733 for (unsigned i = 0; i < TotalComponents; ++i) { 12734 Expr *AssociatedExprPr = Record.readSubExpr(); 12735 bool IsNonContiguous = Record.readBool(); 12736 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12737 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12738 } 12739 C->setComponents(Components, ListSizes); 12740 } 12741 12742 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12743 C->setLParenLoc(Record.readSourceLocation()); 12744 auto NumVars = C->varlist_size(); 12745 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12746 auto TotalLists = C->getTotalComponentListNum(); 12747 auto TotalComponents = C->getTotalComponentsNum(); 12748 12749 SmallVector<Expr *, 16> Vars; 12750 Vars.reserve(NumVars); 12751 for (unsigned i = 0; i != NumVars; ++i) 12752 Vars.push_back(Record.readSubExpr()); 12753 C->setVarRefs(Vars); 12754 Vars.clear(); 12755 for (unsigned i = 0; i != NumVars; ++i) 12756 Vars.push_back(Record.readSubExpr()); 12757 C->setPrivateCopies(Vars); 12758 Vars.clear(); 12759 for (unsigned i = 0; i != NumVars; ++i) 12760 Vars.push_back(Record.readSubExpr()); 12761 C->setInits(Vars); 12762 12763 SmallVector<ValueDecl *, 16> Decls; 12764 Decls.reserve(UniqueDecls); 12765 for (unsigned i = 0; i < UniqueDecls; ++i) 12766 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12767 C->setUniqueDecls(Decls); 12768 12769 SmallVector<unsigned, 16> ListsPerDecl; 12770 ListsPerDecl.reserve(UniqueDecls); 12771 for (unsigned i = 0; i < UniqueDecls; ++i) 12772 ListsPerDecl.push_back(Record.readInt()); 12773 C->setDeclNumLists(ListsPerDecl); 12774 12775 SmallVector<unsigned, 32> ListSizes; 12776 ListSizes.reserve(TotalLists); 12777 for (unsigned i = 0; i < TotalLists; ++i) 12778 ListSizes.push_back(Record.readInt()); 12779 C->setComponentListSizes(ListSizes); 12780 12781 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12782 Components.reserve(TotalComponents); 12783 for (unsigned i = 0; i < TotalComponents; ++i) { 12784 auto *AssociatedExprPr = Record.readSubExpr(); 12785 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12786 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12787 /*IsNonContiguous=*/false); 12788 } 12789 C->setComponents(Components, ListSizes); 12790 } 12791 12792 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12793 C->setLParenLoc(Record.readSourceLocation()); 12794 auto NumVars = C->varlist_size(); 12795 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12796 auto TotalLists = C->getTotalComponentListNum(); 12797 auto TotalComponents = C->getTotalComponentsNum(); 12798 12799 SmallVector<Expr *, 16> Vars; 12800 Vars.reserve(NumVars); 12801 for (unsigned i = 0; i != NumVars; ++i) 12802 Vars.push_back(Record.readSubExpr()); 12803 C->setVarRefs(Vars); 12804 12805 SmallVector<ValueDecl *, 16> Decls; 12806 Decls.reserve(UniqueDecls); 12807 for (unsigned i = 0; i < UniqueDecls; ++i) 12808 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12809 C->setUniqueDecls(Decls); 12810 12811 SmallVector<unsigned, 16> ListsPerDecl; 12812 ListsPerDecl.reserve(UniqueDecls); 12813 for (unsigned i = 0; i < UniqueDecls; ++i) 12814 ListsPerDecl.push_back(Record.readInt()); 12815 C->setDeclNumLists(ListsPerDecl); 12816 12817 SmallVector<unsigned, 32> ListSizes; 12818 ListSizes.reserve(TotalLists); 12819 for (unsigned i = 0; i < TotalLists; ++i) 12820 ListSizes.push_back(Record.readInt()); 12821 C->setComponentListSizes(ListSizes); 12822 12823 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12824 Components.reserve(TotalComponents); 12825 for (unsigned i = 0; i < TotalComponents; ++i) { 12826 Expr *AssociatedExpr = Record.readSubExpr(); 12827 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12828 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12829 /*IsNonContiguous*/ false); 12830 } 12831 C->setComponents(Components, ListSizes); 12832 } 12833 12834 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12835 C->setLParenLoc(Record.readSourceLocation()); 12836 auto NumVars = C->varlist_size(); 12837 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12838 auto TotalLists = C->getTotalComponentListNum(); 12839 auto TotalComponents = C->getTotalComponentsNum(); 12840 12841 SmallVector<Expr *, 16> Vars; 12842 Vars.reserve(NumVars); 12843 for (unsigned i = 0; i != NumVars; ++i) 12844 Vars.push_back(Record.readSubExpr()); 12845 C->setVarRefs(Vars); 12846 Vars.clear(); 12847 12848 SmallVector<ValueDecl *, 16> Decls; 12849 Decls.reserve(UniqueDecls); 12850 for (unsigned i = 0; i < UniqueDecls; ++i) 12851 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12852 C->setUniqueDecls(Decls); 12853 12854 SmallVector<unsigned, 16> ListsPerDecl; 12855 ListsPerDecl.reserve(UniqueDecls); 12856 for (unsigned i = 0; i < UniqueDecls; ++i) 12857 ListsPerDecl.push_back(Record.readInt()); 12858 C->setDeclNumLists(ListsPerDecl); 12859 12860 SmallVector<unsigned, 32> ListSizes; 12861 ListSizes.reserve(TotalLists); 12862 for (unsigned i = 0; i < TotalLists; ++i) 12863 ListSizes.push_back(Record.readInt()); 12864 C->setComponentListSizes(ListSizes); 12865 12866 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12867 Components.reserve(TotalComponents); 12868 for (unsigned i = 0; i < TotalComponents; ++i) { 12869 Expr *AssociatedExpr = Record.readSubExpr(); 12870 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12871 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12872 /*IsNonContiguous=*/false); 12873 } 12874 C->setComponents(Components, ListSizes); 12875 } 12876 12877 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12878 C->setLParenLoc(Record.readSourceLocation()); 12879 unsigned NumVars = C->varlist_size(); 12880 SmallVector<Expr *, 16> Vars; 12881 Vars.reserve(NumVars); 12882 for (unsigned i = 0; i != NumVars; ++i) 12883 Vars.push_back(Record.readSubExpr()); 12884 C->setVarRefs(Vars); 12885 Vars.clear(); 12886 Vars.reserve(NumVars); 12887 for (unsigned i = 0; i != NumVars; ++i) 12888 Vars.push_back(Record.readSubExpr()); 12889 C->setPrivateRefs(Vars); 12890 } 12891 12892 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12893 C->setLParenLoc(Record.readSourceLocation()); 12894 unsigned NumVars = C->varlist_size(); 12895 SmallVector<Expr *, 16> Vars; 12896 Vars.reserve(NumVars); 12897 for (unsigned i = 0; i != NumVars; ++i) 12898 Vars.push_back(Record.readSubExpr()); 12899 C->setVarRefs(Vars); 12900 } 12901 12902 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *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 } 12911 12912 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12913 C->setLParenLoc(Record.readSourceLocation()); 12914 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12915 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12916 Data.reserve(NumOfAllocators); 12917 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12918 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12919 D.Allocator = Record.readSubExpr(); 12920 D.AllocatorTraits = Record.readSubExpr(); 12921 D.LParenLoc = Record.readSourceLocation(); 12922 D.RParenLoc = Record.readSourceLocation(); 12923 } 12924 C->setAllocatorsData(Data); 12925 } 12926 12927 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12928 C->setLParenLoc(Record.readSourceLocation()); 12929 C->setModifier(Record.readSubExpr()); 12930 C->setColonLoc(Record.readSourceLocation()); 12931 unsigned NumOfLocators = C->varlist_size(); 12932 SmallVector<Expr *, 4> Locators; 12933 Locators.reserve(NumOfLocators); 12934 for (unsigned I = 0; I != NumOfLocators; ++I) 12935 Locators.push_back(Record.readSubExpr()); 12936 C->setVarRefs(Locators); 12937 } 12938 12939 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12940 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12941 C->setLParenLoc(Record.readSourceLocation()); 12942 C->setKindKwLoc(Record.readSourceLocation()); 12943 } 12944 12945 void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) { 12946 VisitOMPClauseWithPreInit(C); 12947 C->setThreadID(Record.readSubExpr()); 12948 C->setLParenLoc(Record.readSourceLocation()); 12949 } 12950 12951 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12952 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12953 TI.Sets.resize(readUInt32()); 12954 for (auto &Set : TI.Sets) { 12955 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12956 Set.Selectors.resize(readUInt32()); 12957 for (auto &Selector : Set.Selectors) { 12958 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12959 Selector.ScoreOrCondition = nullptr; 12960 if (readBool()) 12961 Selector.ScoreOrCondition = readExprRef(); 12962 Selector.Properties.resize(readUInt32()); 12963 for (auto &Property : Selector.Properties) 12964 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 12965 } 12966 } 12967 return &TI; 12968 } 12969 12970 void ASTRecordReader::readOMPChildren(OMPChildren *Data) { 12971 if (!Data) 12972 return; 12973 if (Reader->ReadingKind == ASTReader::Read_Stmt) { 12974 // Skip NumClauses, NumChildren and HasAssociatedStmt fields. 12975 skipInts(3); 12976 } 12977 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses()); 12978 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I) 12979 Clauses[I] = readOMPClause(); 12980 Data->setClauses(Clauses); 12981 if (Data->hasAssociatedStmt()) 12982 Data->setAssociatedStmt(readStmt()); 12983 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I) 12984 Data->getChildren()[I] = readStmt(); 12985 } 12986