1 //===- ASTReader.cpp - AST File Reader ------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the ASTReader class, which reads AST files. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "clang/Basic/OpenMPKinds.h" 14 #include "clang/Serialization/ASTRecordReader.h" 15 #include "ASTCommon.h" 16 #include "ASTReaderInternals.h" 17 #include "clang/AST/AbstractTypeReader.h" 18 #include "clang/AST/ASTConsumer.h" 19 #include "clang/AST/ASTContext.h" 20 #include "clang/AST/ASTMutationListener.h" 21 #include "clang/AST/ASTUnresolvedSet.h" 22 #include "clang/AST/Decl.h" 23 #include "clang/AST/DeclBase.h" 24 #include "clang/AST/DeclCXX.h" 25 #include "clang/AST/DeclFriend.h" 26 #include "clang/AST/DeclGroup.h" 27 #include "clang/AST/DeclObjC.h" 28 #include "clang/AST/DeclTemplate.h" 29 #include "clang/AST/DeclarationName.h" 30 #include "clang/AST/Expr.h" 31 #include "clang/AST/ExprCXX.h" 32 #include "clang/AST/ExternalASTSource.h" 33 #include "clang/AST/NestedNameSpecifier.h" 34 #include "clang/AST/OpenMPClause.h" 35 #include "clang/AST/ODRHash.h" 36 #include "clang/AST/RawCommentList.h" 37 #include "clang/AST/TemplateBase.h" 38 #include "clang/AST/TemplateName.h" 39 #include "clang/AST/Type.h" 40 #include "clang/AST/TypeLoc.h" 41 #include "clang/AST/TypeLocVisitor.h" 42 #include "clang/AST/UnresolvedSet.h" 43 #include "clang/Basic/CommentOptions.h" 44 #include "clang/Basic/Diagnostic.h" 45 #include "clang/Basic/DiagnosticOptions.h" 46 #include "clang/Basic/ExceptionSpecificationType.h" 47 #include "clang/Basic/FileManager.h" 48 #include "clang/Basic/FileSystemOptions.h" 49 #include "clang/Basic/IdentifierTable.h" 50 #include "clang/Basic/LLVM.h" 51 #include "clang/Basic/LangOptions.h" 52 #include "clang/Basic/Module.h" 53 #include "clang/Basic/ObjCRuntime.h" 54 #include "clang/Basic/OperatorKinds.h" 55 #include "clang/Basic/PragmaKinds.h" 56 #include "clang/Basic/Sanitizers.h" 57 #include "clang/Basic/SourceLocation.h" 58 #include "clang/Basic/SourceManager.h" 59 #include "clang/Basic/SourceManagerInternals.h" 60 #include "clang/Basic/Specifiers.h" 61 #include "clang/Basic/TargetInfo.h" 62 #include "clang/Basic/TargetOptions.h" 63 #include "clang/Basic/TokenKinds.h" 64 #include "clang/Basic/Version.h" 65 #include "clang/Lex/HeaderSearch.h" 66 #include "clang/Lex/HeaderSearchOptions.h" 67 #include "clang/Lex/MacroInfo.h" 68 #include "clang/Lex/ModuleMap.h" 69 #include "clang/Lex/PreprocessingRecord.h" 70 #include "clang/Lex/Preprocessor.h" 71 #include "clang/Lex/PreprocessorOptions.h" 72 #include "clang/Lex/Token.h" 73 #include "clang/Sema/ObjCMethodList.h" 74 #include "clang/Sema/Scope.h" 75 #include "clang/Sema/Sema.h" 76 #include "clang/Sema/Weak.h" 77 #include "clang/Serialization/ASTBitCodes.h" 78 #include "clang/Serialization/ASTDeserializationListener.h" 79 #include "clang/Serialization/ContinuousRangeMap.h" 80 #include "clang/Serialization/GlobalModuleIndex.h" 81 #include "clang/Serialization/InMemoryModuleCache.h" 82 #include "clang/Serialization/ModuleFile.h" 83 #include "clang/Serialization/ModuleFileExtension.h" 84 #include "clang/Serialization/ModuleManager.h" 85 #include "clang/Serialization/PCHContainerOperations.h" 86 #include "clang/Serialization/SerializationDiagnostic.h" 87 #include "llvm/ADT/APFloat.h" 88 #include "llvm/ADT/APInt.h" 89 #include "llvm/ADT/APSInt.h" 90 #include "llvm/ADT/ArrayRef.h" 91 #include "llvm/ADT/DenseMap.h" 92 #include "llvm/ADT/FloatingPointMode.h" 93 #include "llvm/ADT/FoldingSet.h" 94 #include "llvm/ADT/Hashing.h" 95 #include "llvm/ADT/IntrusiveRefCntPtr.h" 96 #include "llvm/ADT/None.h" 97 #include "llvm/ADT/Optional.h" 98 #include "llvm/ADT/STLExtras.h" 99 #include "llvm/ADT/ScopeExit.h" 100 #include "llvm/ADT/SmallPtrSet.h" 101 #include "llvm/ADT/SmallString.h" 102 #include "llvm/ADT/SmallVector.h" 103 #include "llvm/ADT/StringExtras.h" 104 #include "llvm/ADT/StringMap.h" 105 #include "llvm/ADT/StringRef.h" 106 #include "llvm/ADT/Triple.h" 107 #include "llvm/ADT/iterator_range.h" 108 #include "llvm/Bitstream/BitstreamReader.h" 109 #include "llvm/Support/Casting.h" 110 #include "llvm/Support/Compiler.h" 111 #include "llvm/Support/Compression.h" 112 #include "llvm/Support/DJB.h" 113 #include "llvm/Support/Endian.h" 114 #include "llvm/Support/Error.h" 115 #include "llvm/Support/ErrorHandling.h" 116 #include "llvm/Support/FileSystem.h" 117 #include "llvm/Support/LEB128.h" 118 #include "llvm/Support/MemoryBuffer.h" 119 #include "llvm/Support/Path.h" 120 #include "llvm/Support/SaveAndRestore.h" 121 #include "llvm/Support/Timer.h" 122 #include "llvm/Support/VersionTuple.h" 123 #include "llvm/Support/raw_ostream.h" 124 #include <algorithm> 125 #include <cassert> 126 #include <cstddef> 127 #include <cstdint> 128 #include <cstdio> 129 #include <ctime> 130 #include <iterator> 131 #include <limits> 132 #include <map> 133 #include <memory> 134 #include <string> 135 #include <system_error> 136 #include <tuple> 137 #include <utility> 138 #include <vector> 139 140 using namespace clang; 141 using namespace clang::serialization; 142 using namespace clang::serialization::reader; 143 using llvm::BitstreamCursor; 144 using llvm::RoundingMode; 145 146 //===----------------------------------------------------------------------===// 147 // ChainedASTReaderListener implementation 148 //===----------------------------------------------------------------------===// 149 150 bool 151 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 152 return First->ReadFullVersionInformation(FullVersion) || 153 Second->ReadFullVersionInformation(FullVersion); 154 } 155 156 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 157 First->ReadModuleName(ModuleName); 158 Second->ReadModuleName(ModuleName); 159 } 160 161 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 162 First->ReadModuleMapFile(ModuleMapPath); 163 Second->ReadModuleMapFile(ModuleMapPath); 164 } 165 166 bool 167 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 168 bool Complain, 169 bool AllowCompatibleDifferences) { 170 return First->ReadLanguageOptions(LangOpts, Complain, 171 AllowCompatibleDifferences) || 172 Second->ReadLanguageOptions(LangOpts, Complain, 173 AllowCompatibleDifferences); 174 } 175 176 bool ChainedASTReaderListener::ReadTargetOptions( 177 const TargetOptions &TargetOpts, bool Complain, 178 bool AllowCompatibleDifferences) { 179 return First->ReadTargetOptions(TargetOpts, Complain, 180 AllowCompatibleDifferences) || 181 Second->ReadTargetOptions(TargetOpts, Complain, 182 AllowCompatibleDifferences); 183 } 184 185 bool ChainedASTReaderListener::ReadDiagnosticOptions( 186 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 187 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 188 Second->ReadDiagnosticOptions(DiagOpts, Complain); 189 } 190 191 bool 192 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 193 bool Complain) { 194 return First->ReadFileSystemOptions(FSOpts, Complain) || 195 Second->ReadFileSystemOptions(FSOpts, Complain); 196 } 197 198 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 199 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 200 bool Complain) { 201 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 202 Complain) || 203 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 204 Complain); 205 } 206 207 bool ChainedASTReaderListener::ReadPreprocessorOptions( 208 const PreprocessorOptions &PPOpts, bool Complain, 209 std::string &SuggestedPredefines) { 210 return First->ReadPreprocessorOptions(PPOpts, Complain, 211 SuggestedPredefines) || 212 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 213 } 214 215 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 216 unsigned Value) { 217 First->ReadCounter(M, Value); 218 Second->ReadCounter(M, Value); 219 } 220 221 bool ChainedASTReaderListener::needsInputFileVisitation() { 222 return First->needsInputFileVisitation() || 223 Second->needsInputFileVisitation(); 224 } 225 226 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 227 return First->needsSystemInputFileVisitation() || 228 Second->needsSystemInputFileVisitation(); 229 } 230 231 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 232 ModuleKind Kind) { 233 First->visitModuleFile(Filename, Kind); 234 Second->visitModuleFile(Filename, Kind); 235 } 236 237 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 238 bool isSystem, 239 bool isOverridden, 240 bool isExplicitModule) { 241 bool Continue = false; 242 if (First->needsInputFileVisitation() && 243 (!isSystem || First->needsSystemInputFileVisitation())) 244 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 245 isExplicitModule); 246 if (Second->needsInputFileVisitation() && 247 (!isSystem || Second->needsSystemInputFileVisitation())) 248 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 249 isExplicitModule); 250 return Continue; 251 } 252 253 void ChainedASTReaderListener::readModuleFileExtension( 254 const ModuleFileExtensionMetadata &Metadata) { 255 First->readModuleFileExtension(Metadata); 256 Second->readModuleFileExtension(Metadata); 257 } 258 259 //===----------------------------------------------------------------------===// 260 // PCH validator implementation 261 //===----------------------------------------------------------------------===// 262 263 ASTReaderListener::~ASTReaderListener() = default; 264 265 /// Compare the given set of language options against an existing set of 266 /// language options. 267 /// 268 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 269 /// \param AllowCompatibleDifferences If true, differences between compatible 270 /// language options will be permitted. 271 /// 272 /// \returns true if the languagae options mis-match, false otherwise. 273 static bool checkLanguageOptions(const LangOptions &LangOpts, 274 const LangOptions &ExistingLangOpts, 275 DiagnosticsEngine *Diags, 276 bool AllowCompatibleDifferences = true) { 277 #define LANGOPT(Name, Bits, Default, Description) \ 278 if (ExistingLangOpts.Name != LangOpts.Name) { \ 279 if (Diags) \ 280 Diags->Report(diag::err_pch_langopt_mismatch) \ 281 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 282 return true; \ 283 } 284 285 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 286 if (ExistingLangOpts.Name != LangOpts.Name) { \ 287 if (Diags) \ 288 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 289 << Description; \ 290 return true; \ 291 } 292 293 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 294 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 295 if (Diags) \ 296 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 297 << Description; \ 298 return true; \ 299 } 300 301 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 302 if (!AllowCompatibleDifferences) \ 303 LANGOPT(Name, Bits, Default, Description) 304 305 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 306 if (!AllowCompatibleDifferences) \ 307 ENUM_LANGOPT(Name, Bits, Default, Description) 308 309 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 310 if (!AllowCompatibleDifferences) \ 311 VALUE_LANGOPT(Name, Bits, Default, Description) 312 313 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 314 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 315 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) 316 #include "clang/Basic/LangOptions.def" 317 318 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 319 if (Diags) 320 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 321 return true; 322 } 323 324 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 325 if (Diags) 326 Diags->Report(diag::err_pch_langopt_value_mismatch) 327 << "target Objective-C runtime"; 328 return true; 329 } 330 331 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 332 LangOpts.CommentOpts.BlockCommandNames) { 333 if (Diags) 334 Diags->Report(diag::err_pch_langopt_value_mismatch) 335 << "block command names"; 336 return true; 337 } 338 339 // Sanitizer feature mismatches are treated as compatible differences. If 340 // compatible differences aren't allowed, we still only want to check for 341 // mismatches of non-modular sanitizers (the only ones which can affect AST 342 // generation). 343 if (!AllowCompatibleDifferences) { 344 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 345 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 346 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 347 ExistingSanitizers.clear(ModularSanitizers); 348 ImportedSanitizers.clear(ModularSanitizers); 349 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 350 const std::string Flag = "-fsanitize="; 351 if (Diags) { 352 #define SANITIZER(NAME, ID) \ 353 { \ 354 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 355 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 356 if (InExistingModule != InImportedModule) \ 357 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 358 << InExistingModule << (Flag + NAME); \ 359 } 360 #include "clang/Basic/Sanitizers.def" 361 } 362 return true; 363 } 364 } 365 366 return false; 367 } 368 369 /// Compare the given set of target options against an existing set of 370 /// target options. 371 /// 372 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 373 /// 374 /// \returns true if the target options mis-match, false otherwise. 375 static bool checkTargetOptions(const TargetOptions &TargetOpts, 376 const TargetOptions &ExistingTargetOpts, 377 DiagnosticsEngine *Diags, 378 bool AllowCompatibleDifferences = true) { 379 #define CHECK_TARGET_OPT(Field, Name) \ 380 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 381 if (Diags) \ 382 Diags->Report(diag::err_pch_targetopt_mismatch) \ 383 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 384 return true; \ 385 } 386 387 // The triple and ABI must match exactly. 388 CHECK_TARGET_OPT(Triple, "target"); 389 CHECK_TARGET_OPT(ABI, "target ABI"); 390 391 // We can tolerate different CPUs in many cases, notably when one CPU 392 // supports a strict superset of another. When allowing compatible 393 // differences skip this check. 394 if (!AllowCompatibleDifferences) { 395 CHECK_TARGET_OPT(CPU, "target CPU"); 396 CHECK_TARGET_OPT(TuneCPU, "tune CPU"); 397 } 398 399 #undef CHECK_TARGET_OPT 400 401 // Compare feature sets. 402 SmallVector<StringRef, 4> ExistingFeatures( 403 ExistingTargetOpts.FeaturesAsWritten.begin(), 404 ExistingTargetOpts.FeaturesAsWritten.end()); 405 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 406 TargetOpts.FeaturesAsWritten.end()); 407 llvm::sort(ExistingFeatures); 408 llvm::sort(ReadFeatures); 409 410 // We compute the set difference in both directions explicitly so that we can 411 // diagnose the differences differently. 412 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 413 std::set_difference( 414 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 415 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 416 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 417 ExistingFeatures.begin(), ExistingFeatures.end(), 418 std::back_inserter(UnmatchedReadFeatures)); 419 420 // If we are allowing compatible differences and the read feature set is 421 // a strict subset of the existing feature set, there is nothing to diagnose. 422 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 423 return false; 424 425 if (Diags) { 426 for (StringRef Feature : UnmatchedReadFeatures) 427 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 428 << /* is-existing-feature */ false << Feature; 429 for (StringRef Feature : UnmatchedExistingFeatures) 430 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 431 << /* is-existing-feature */ true << Feature; 432 } 433 434 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 435 } 436 437 bool 438 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 439 bool Complain, 440 bool AllowCompatibleDifferences) { 441 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 442 return checkLanguageOptions(LangOpts, ExistingLangOpts, 443 Complain ? &Reader.Diags : nullptr, 444 AllowCompatibleDifferences); 445 } 446 447 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 448 bool Complain, 449 bool AllowCompatibleDifferences) { 450 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 451 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 452 Complain ? &Reader.Diags : nullptr, 453 AllowCompatibleDifferences); 454 } 455 456 namespace { 457 458 using MacroDefinitionsMap = 459 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 460 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 461 462 } // namespace 463 464 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 465 DiagnosticsEngine &Diags, 466 bool Complain) { 467 using Level = DiagnosticsEngine::Level; 468 469 // Check current mappings for new -Werror mappings, and the stored mappings 470 // for cases that were explicitly mapped to *not* be errors that are now 471 // errors because of options like -Werror. 472 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 473 474 for (DiagnosticsEngine *MappingSource : MappingSources) { 475 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 476 diag::kind DiagID = DiagIDMappingPair.first; 477 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 478 if (CurLevel < DiagnosticsEngine::Error) 479 continue; // not significant 480 Level StoredLevel = 481 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 482 if (StoredLevel < DiagnosticsEngine::Error) { 483 if (Complain) 484 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 485 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 486 return true; 487 } 488 } 489 } 490 491 return false; 492 } 493 494 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 495 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 496 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 497 return true; 498 return Ext >= diag::Severity::Error; 499 } 500 501 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 502 DiagnosticsEngine &Diags, 503 bool IsSystem, bool Complain) { 504 // Top-level options 505 if (IsSystem) { 506 if (Diags.getSuppressSystemWarnings()) 507 return false; 508 // If -Wsystem-headers was not enabled before, be conservative 509 if (StoredDiags.getSuppressSystemWarnings()) { 510 if (Complain) 511 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 512 return true; 513 } 514 } 515 516 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 517 if (Complain) 518 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 519 return true; 520 } 521 522 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 523 !StoredDiags.getEnableAllWarnings()) { 524 if (Complain) 525 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 526 return true; 527 } 528 529 if (isExtHandlingFromDiagsError(Diags) && 530 !isExtHandlingFromDiagsError(StoredDiags)) { 531 if (Complain) 532 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 533 return true; 534 } 535 536 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 537 } 538 539 /// Return the top import module if it is implicit, nullptr otherwise. 540 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 541 Preprocessor &PP) { 542 // If the original import came from a file explicitly generated by the user, 543 // don't check the diagnostic mappings. 544 // FIXME: currently this is approximated by checking whether this is not a 545 // module import of an implicitly-loaded module file. 546 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 547 // the transitive closure of its imports, since unrelated modules cannot be 548 // imported until after this module finishes validation. 549 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 550 while (!TopImport->ImportedBy.empty()) 551 TopImport = TopImport->ImportedBy[0]; 552 if (TopImport->Kind != MK_ImplicitModule) 553 return nullptr; 554 555 StringRef ModuleName = TopImport->ModuleName; 556 assert(!ModuleName.empty() && "diagnostic options read before module name"); 557 558 Module *M = PP.getHeaderSearchInfo().lookupModule(ModuleName); 559 assert(M && "missing module"); 560 return M; 561 } 562 563 bool PCHValidator::ReadDiagnosticOptions( 564 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 565 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 566 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 567 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 568 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 569 // This should never fail, because we would have processed these options 570 // before writing them to an ASTFile. 571 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 572 573 ModuleManager &ModuleMgr = Reader.getModuleManager(); 574 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 575 576 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 577 if (!TopM) 578 return false; 579 580 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 581 // contains the union of their flags. 582 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 583 Complain); 584 } 585 586 /// Collect the macro definitions provided by the given preprocessor 587 /// options. 588 static void 589 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 590 MacroDefinitionsMap &Macros, 591 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 592 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 593 StringRef Macro = PPOpts.Macros[I].first; 594 bool IsUndef = PPOpts.Macros[I].second; 595 596 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 597 StringRef MacroName = MacroPair.first; 598 StringRef MacroBody = MacroPair.second; 599 600 // For an #undef'd macro, we only care about the name. 601 if (IsUndef) { 602 if (MacroNames && !Macros.count(MacroName)) 603 MacroNames->push_back(MacroName); 604 605 Macros[MacroName] = std::make_pair("", true); 606 continue; 607 } 608 609 // For a #define'd macro, figure out the actual definition. 610 if (MacroName.size() == Macro.size()) 611 MacroBody = "1"; 612 else { 613 // Note: GCC drops anything following an end-of-line character. 614 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 615 MacroBody = MacroBody.substr(0, End); 616 } 617 618 if (MacroNames && !Macros.count(MacroName)) 619 MacroNames->push_back(MacroName); 620 Macros[MacroName] = std::make_pair(MacroBody, false); 621 } 622 } 623 624 /// Check the preprocessor options deserialized from the control block 625 /// against the preprocessor options in an existing preprocessor. 626 /// 627 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 628 /// \param Validate If true, validate preprocessor options. If false, allow 629 /// macros defined by \p ExistingPPOpts to override those defined by 630 /// \p PPOpts in SuggestedPredefines. 631 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 632 const PreprocessorOptions &ExistingPPOpts, 633 DiagnosticsEngine *Diags, 634 FileManager &FileMgr, 635 std::string &SuggestedPredefines, 636 const LangOptions &LangOpts, 637 bool Validate = true) { 638 // Check macro definitions. 639 MacroDefinitionsMap ASTFileMacros; 640 collectMacroDefinitions(PPOpts, ASTFileMacros); 641 MacroDefinitionsMap ExistingMacros; 642 SmallVector<StringRef, 4> ExistingMacroNames; 643 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 644 645 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 646 // Dig out the macro definition in the existing preprocessor options. 647 StringRef MacroName = ExistingMacroNames[I]; 648 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 649 650 // Check whether we know anything about this macro name or not. 651 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 652 ASTFileMacros.find(MacroName); 653 if (!Validate || Known == ASTFileMacros.end()) { 654 // FIXME: Check whether this identifier was referenced anywhere in the 655 // AST file. If so, we should reject the AST file. Unfortunately, this 656 // information isn't in the control block. What shall we do about it? 657 658 if (Existing.second) { 659 SuggestedPredefines += "#undef "; 660 SuggestedPredefines += MacroName.str(); 661 SuggestedPredefines += '\n'; 662 } else { 663 SuggestedPredefines += "#define "; 664 SuggestedPredefines += MacroName.str(); 665 SuggestedPredefines += ' '; 666 SuggestedPredefines += Existing.first.str(); 667 SuggestedPredefines += '\n'; 668 } 669 continue; 670 } 671 672 // If the macro was defined in one but undef'd in the other, we have a 673 // conflict. 674 if (Existing.second != Known->second.second) { 675 if (Diags) { 676 Diags->Report(diag::err_pch_macro_def_undef) 677 << MacroName << Known->second.second; 678 } 679 return true; 680 } 681 682 // If the macro was #undef'd in both, or if the macro bodies are identical, 683 // it's fine. 684 if (Existing.second || Existing.first == Known->second.first) 685 continue; 686 687 // The macro bodies differ; complain. 688 if (Diags) { 689 Diags->Report(diag::err_pch_macro_def_conflict) 690 << MacroName << Known->second.first << Existing.first; 691 } 692 return true; 693 } 694 695 // Check whether we're using predefines. 696 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 697 if (Diags) { 698 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 699 } 700 return true; 701 } 702 703 // Detailed record is important since it is used for the module cache hash. 704 if (LangOpts.Modules && 705 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 706 if (Diags) { 707 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 708 } 709 return true; 710 } 711 712 // Compute the #include and #include_macros lines we need. 713 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 714 StringRef File = ExistingPPOpts.Includes[I]; 715 716 if (!ExistingPPOpts.ImplicitPCHInclude.empty() && 717 !ExistingPPOpts.PCHThroughHeader.empty()) { 718 // In case the through header is an include, we must add all the includes 719 // to the predefines so the start point can be determined. 720 SuggestedPredefines += "#include \""; 721 SuggestedPredefines += File; 722 SuggestedPredefines += "\"\n"; 723 continue; 724 } 725 726 if (File == ExistingPPOpts.ImplicitPCHInclude) 727 continue; 728 729 if (std::find(PPOpts.Includes.begin(), PPOpts.Includes.end(), File) 730 != PPOpts.Includes.end()) 731 continue; 732 733 SuggestedPredefines += "#include \""; 734 SuggestedPredefines += File; 735 SuggestedPredefines += "\"\n"; 736 } 737 738 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 739 StringRef File = ExistingPPOpts.MacroIncludes[I]; 740 if (std::find(PPOpts.MacroIncludes.begin(), PPOpts.MacroIncludes.end(), 741 File) 742 != PPOpts.MacroIncludes.end()) 743 continue; 744 745 SuggestedPredefines += "#__include_macros \""; 746 SuggestedPredefines += File; 747 SuggestedPredefines += "\"\n##\n"; 748 } 749 750 return false; 751 } 752 753 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 754 bool Complain, 755 std::string &SuggestedPredefines) { 756 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 757 758 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 759 Complain? &Reader.Diags : nullptr, 760 PP.getFileManager(), 761 SuggestedPredefines, 762 PP.getLangOpts()); 763 } 764 765 bool SimpleASTReaderListener::ReadPreprocessorOptions( 766 const PreprocessorOptions &PPOpts, 767 bool Complain, 768 std::string &SuggestedPredefines) { 769 return checkPreprocessorOptions(PPOpts, 770 PP.getPreprocessorOpts(), 771 nullptr, 772 PP.getFileManager(), 773 SuggestedPredefines, 774 PP.getLangOpts(), 775 false); 776 } 777 778 /// Check the header search options deserialized from the control block 779 /// against the header search options in an existing preprocessor. 780 /// 781 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 782 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 783 StringRef SpecificModuleCachePath, 784 StringRef ExistingModuleCachePath, 785 DiagnosticsEngine *Diags, 786 const LangOptions &LangOpts) { 787 if (LangOpts.Modules) { 788 if (SpecificModuleCachePath != ExistingModuleCachePath) { 789 if (Diags) 790 Diags->Report(diag::err_pch_modulecache_mismatch) 791 << SpecificModuleCachePath << ExistingModuleCachePath; 792 return true; 793 } 794 } 795 796 return false; 797 } 798 799 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 800 StringRef SpecificModuleCachePath, 801 bool Complain) { 802 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 803 PP.getHeaderSearchInfo().getModuleCachePath(), 804 Complain ? &Reader.Diags : nullptr, 805 PP.getLangOpts()); 806 } 807 808 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 809 PP.setCounterValue(Value); 810 } 811 812 //===----------------------------------------------------------------------===// 813 // AST reader implementation 814 //===----------------------------------------------------------------------===// 815 816 static uint64_t readULEB(const unsigned char *&P) { 817 unsigned Length = 0; 818 const char *Error = nullptr; 819 820 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error); 821 if (Error) 822 llvm::report_fatal_error(Error); 823 P += Length; 824 return Val; 825 } 826 827 /// Read ULEB-encoded key length and data length. 828 static std::pair<unsigned, unsigned> 829 readULEBKeyDataLength(const unsigned char *&P) { 830 unsigned KeyLen = readULEB(P); 831 if ((unsigned)KeyLen != KeyLen) 832 llvm::report_fatal_error("key too large"); 833 834 unsigned DataLen = readULEB(P); 835 if ((unsigned)DataLen != DataLen) 836 llvm::report_fatal_error("data too large"); 837 838 return std::make_pair(KeyLen, DataLen); 839 } 840 841 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 842 bool TakeOwnership) { 843 DeserializationListener = Listener; 844 OwnsDeserializationListener = TakeOwnership; 845 } 846 847 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 848 return serialization::ComputeHash(Sel); 849 } 850 851 std::pair<unsigned, unsigned> 852 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 853 return readULEBKeyDataLength(d); 854 } 855 856 ASTSelectorLookupTrait::internal_key_type 857 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 858 using namespace llvm::support; 859 860 SelectorTable &SelTable = Reader.getContext().Selectors; 861 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 862 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 863 F, endian::readNext<uint32_t, little, unaligned>(d)); 864 if (N == 0) 865 return SelTable.getNullarySelector(FirstII); 866 else if (N == 1) 867 return SelTable.getUnarySelector(FirstII); 868 869 SmallVector<IdentifierInfo *, 16> Args; 870 Args.push_back(FirstII); 871 for (unsigned I = 1; I != N; ++I) 872 Args.push_back(Reader.getLocalIdentifier( 873 F, endian::readNext<uint32_t, little, unaligned>(d))); 874 875 return SelTable.getSelector(N, Args.data()); 876 } 877 878 ASTSelectorLookupTrait::data_type 879 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 880 unsigned DataLen) { 881 using namespace llvm::support; 882 883 data_type Result; 884 885 Result.ID = Reader.getGlobalSelectorID( 886 F, endian::readNext<uint32_t, little, unaligned>(d)); 887 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 888 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 889 Result.InstanceBits = FullInstanceBits & 0x3; 890 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 891 Result.FactoryBits = FullFactoryBits & 0x3; 892 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 893 unsigned NumInstanceMethods = FullInstanceBits >> 3; 894 unsigned NumFactoryMethods = FullFactoryBits >> 3; 895 896 // Load instance methods 897 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 898 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 899 F, endian::readNext<uint32_t, little, unaligned>(d))) 900 Result.Instance.push_back(Method); 901 } 902 903 // Load factory methods 904 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 905 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 906 F, endian::readNext<uint32_t, little, unaligned>(d))) 907 Result.Factory.push_back(Method); 908 } 909 910 return Result; 911 } 912 913 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 914 return llvm::djbHash(a); 915 } 916 917 std::pair<unsigned, unsigned> 918 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 919 return readULEBKeyDataLength(d); 920 } 921 922 ASTIdentifierLookupTraitBase::internal_key_type 923 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 924 assert(n >= 2 && d[n-1] == '\0'); 925 return StringRef((const char*) d, n-1); 926 } 927 928 /// Whether the given identifier is "interesting". 929 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 930 bool IsModule) { 931 return II.hadMacroDefinition() || II.isPoisoned() || 932 (!IsModule && II.getObjCOrBuiltinID()) || 933 II.hasRevertedTokenIDToIdentifier() || 934 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 935 II.getFETokenInfo()); 936 } 937 938 static bool readBit(unsigned &Bits) { 939 bool Value = Bits & 0x1; 940 Bits >>= 1; 941 return Value; 942 } 943 944 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 945 using namespace llvm::support; 946 947 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 948 return Reader.getGlobalIdentifierID(F, RawID >> 1); 949 } 950 951 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 952 if (!II.isFromAST()) { 953 II.setIsFromAST(); 954 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 955 if (isInterestingIdentifier(Reader, II, IsModule)) 956 II.setChangedSinceDeserialization(); 957 } 958 } 959 960 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 961 const unsigned char* d, 962 unsigned DataLen) { 963 using namespace llvm::support; 964 965 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 966 bool IsInteresting = RawID & 0x01; 967 968 // Wipe out the "is interesting" bit. 969 RawID = RawID >> 1; 970 971 // Build the IdentifierInfo and link the identifier ID with it. 972 IdentifierInfo *II = KnownII; 973 if (!II) { 974 II = &Reader.getIdentifierTable().getOwn(k); 975 KnownII = II; 976 } 977 markIdentifierFromAST(Reader, *II); 978 Reader.markIdentifierUpToDate(II); 979 980 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 981 if (!IsInteresting) { 982 // For uninteresting identifiers, there's nothing else to do. Just notify 983 // the reader that we've finished loading this identifier. 984 Reader.SetIdentifierInfo(ID, II); 985 return II; 986 } 987 988 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 989 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 990 bool CPlusPlusOperatorKeyword = readBit(Bits); 991 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 992 bool Poisoned = readBit(Bits); 993 bool ExtensionToken = readBit(Bits); 994 bool HadMacroDefinition = readBit(Bits); 995 996 assert(Bits == 0 && "Extra bits in the identifier?"); 997 DataLen -= 8; 998 999 // Set or check the various bits in the IdentifierInfo structure. 1000 // Token IDs are read-only. 1001 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 1002 II->revertTokenIDToIdentifier(); 1003 if (!F.isModule()) 1004 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 1005 assert(II->isExtensionToken() == ExtensionToken && 1006 "Incorrect extension token flag"); 1007 (void)ExtensionToken; 1008 if (Poisoned) 1009 II->setIsPoisoned(true); 1010 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 1011 "Incorrect C++ operator keyword flag"); 1012 (void)CPlusPlusOperatorKeyword; 1013 1014 // If this identifier is a macro, deserialize the macro 1015 // definition. 1016 if (HadMacroDefinition) { 1017 uint32_t MacroDirectivesOffset = 1018 endian::readNext<uint32_t, little, unaligned>(d); 1019 DataLen -= 4; 1020 1021 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 1022 } 1023 1024 Reader.SetIdentifierInfo(ID, II); 1025 1026 // Read all of the declarations visible at global scope with this 1027 // name. 1028 if (DataLen > 0) { 1029 SmallVector<uint32_t, 4> DeclIDs; 1030 for (; DataLen > 0; DataLen -= 4) 1031 DeclIDs.push_back(Reader.getGlobalDeclID( 1032 F, endian::readNext<uint32_t, little, unaligned>(d))); 1033 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1034 } 1035 1036 return II; 1037 } 1038 1039 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1040 : Kind(Name.getNameKind()) { 1041 switch (Kind) { 1042 case DeclarationName::Identifier: 1043 Data = (uint64_t)Name.getAsIdentifierInfo(); 1044 break; 1045 case DeclarationName::ObjCZeroArgSelector: 1046 case DeclarationName::ObjCOneArgSelector: 1047 case DeclarationName::ObjCMultiArgSelector: 1048 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1049 break; 1050 case DeclarationName::CXXOperatorName: 1051 Data = Name.getCXXOverloadedOperator(); 1052 break; 1053 case DeclarationName::CXXLiteralOperatorName: 1054 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1055 break; 1056 case DeclarationName::CXXDeductionGuideName: 1057 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1058 ->getDeclName().getAsIdentifierInfo(); 1059 break; 1060 case DeclarationName::CXXConstructorName: 1061 case DeclarationName::CXXDestructorName: 1062 case DeclarationName::CXXConversionFunctionName: 1063 case DeclarationName::CXXUsingDirective: 1064 Data = 0; 1065 break; 1066 } 1067 } 1068 1069 unsigned DeclarationNameKey::getHash() const { 1070 llvm::FoldingSetNodeID ID; 1071 ID.AddInteger(Kind); 1072 1073 switch (Kind) { 1074 case DeclarationName::Identifier: 1075 case DeclarationName::CXXLiteralOperatorName: 1076 case DeclarationName::CXXDeductionGuideName: 1077 ID.AddString(((IdentifierInfo*)Data)->getName()); 1078 break; 1079 case DeclarationName::ObjCZeroArgSelector: 1080 case DeclarationName::ObjCOneArgSelector: 1081 case DeclarationName::ObjCMultiArgSelector: 1082 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1083 break; 1084 case DeclarationName::CXXOperatorName: 1085 ID.AddInteger((OverloadedOperatorKind)Data); 1086 break; 1087 case DeclarationName::CXXConstructorName: 1088 case DeclarationName::CXXDestructorName: 1089 case DeclarationName::CXXConversionFunctionName: 1090 case DeclarationName::CXXUsingDirective: 1091 break; 1092 } 1093 1094 return ID.ComputeHash(); 1095 } 1096 1097 ModuleFile * 1098 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1099 using namespace llvm::support; 1100 1101 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1102 return Reader.getLocalModuleFile(F, ModuleFileID); 1103 } 1104 1105 std::pair<unsigned, unsigned> 1106 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1107 return readULEBKeyDataLength(d); 1108 } 1109 1110 ASTDeclContextNameLookupTrait::internal_key_type 1111 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1112 using namespace llvm::support; 1113 1114 auto Kind = (DeclarationName::NameKind)*d++; 1115 uint64_t Data; 1116 switch (Kind) { 1117 case DeclarationName::Identifier: 1118 case DeclarationName::CXXLiteralOperatorName: 1119 case DeclarationName::CXXDeductionGuideName: 1120 Data = (uint64_t)Reader.getLocalIdentifier( 1121 F, endian::readNext<uint32_t, little, unaligned>(d)); 1122 break; 1123 case DeclarationName::ObjCZeroArgSelector: 1124 case DeclarationName::ObjCOneArgSelector: 1125 case DeclarationName::ObjCMultiArgSelector: 1126 Data = 1127 (uint64_t)Reader.getLocalSelector( 1128 F, endian::readNext<uint32_t, little, unaligned>( 1129 d)).getAsOpaquePtr(); 1130 break; 1131 case DeclarationName::CXXOperatorName: 1132 Data = *d++; // OverloadedOperatorKind 1133 break; 1134 case DeclarationName::CXXConstructorName: 1135 case DeclarationName::CXXDestructorName: 1136 case DeclarationName::CXXConversionFunctionName: 1137 case DeclarationName::CXXUsingDirective: 1138 Data = 0; 1139 break; 1140 } 1141 1142 return DeclarationNameKey(Kind, Data); 1143 } 1144 1145 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1146 const unsigned char *d, 1147 unsigned DataLen, 1148 data_type_builder &Val) { 1149 using namespace llvm::support; 1150 1151 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1152 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1153 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1154 } 1155 } 1156 1157 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1158 BitstreamCursor &Cursor, 1159 uint64_t Offset, 1160 DeclContext *DC) { 1161 assert(Offset != 0); 1162 1163 SavedStreamPosition SavedPosition(Cursor); 1164 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1165 Error(std::move(Err)); 1166 return true; 1167 } 1168 1169 RecordData Record; 1170 StringRef Blob; 1171 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1172 if (!MaybeCode) { 1173 Error(MaybeCode.takeError()); 1174 return true; 1175 } 1176 unsigned Code = MaybeCode.get(); 1177 1178 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1179 if (!MaybeRecCode) { 1180 Error(MaybeRecCode.takeError()); 1181 return true; 1182 } 1183 unsigned RecCode = MaybeRecCode.get(); 1184 if (RecCode != DECL_CONTEXT_LEXICAL) { 1185 Error("Expected lexical block"); 1186 return true; 1187 } 1188 1189 assert(!isa<TranslationUnitDecl>(DC) && 1190 "expected a TU_UPDATE_LEXICAL record for TU"); 1191 // If we are handling a C++ class template instantiation, we can see multiple 1192 // lexical updates for the same record. It's important that we select only one 1193 // of them, so that field numbering works properly. Just pick the first one we 1194 // see. 1195 auto &Lex = LexicalDecls[DC]; 1196 if (!Lex.first) { 1197 Lex = std::make_pair( 1198 &M, llvm::makeArrayRef( 1199 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1200 Blob.data()), 1201 Blob.size() / 4)); 1202 } 1203 DC->setHasExternalLexicalStorage(true); 1204 return false; 1205 } 1206 1207 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1208 BitstreamCursor &Cursor, 1209 uint64_t Offset, 1210 DeclID ID) { 1211 assert(Offset != 0); 1212 1213 SavedStreamPosition SavedPosition(Cursor); 1214 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1215 Error(std::move(Err)); 1216 return true; 1217 } 1218 1219 RecordData Record; 1220 StringRef Blob; 1221 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1222 if (!MaybeCode) { 1223 Error(MaybeCode.takeError()); 1224 return true; 1225 } 1226 unsigned Code = MaybeCode.get(); 1227 1228 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1229 if (!MaybeRecCode) { 1230 Error(MaybeRecCode.takeError()); 1231 return true; 1232 } 1233 unsigned RecCode = MaybeRecCode.get(); 1234 if (RecCode != DECL_CONTEXT_VISIBLE) { 1235 Error("Expected visible lookup table block"); 1236 return true; 1237 } 1238 1239 // We can't safely determine the primary context yet, so delay attaching the 1240 // lookup table until we're done with recursive deserialization. 1241 auto *Data = (const unsigned char*)Blob.data(); 1242 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1243 return false; 1244 } 1245 1246 void ASTReader::Error(StringRef Msg) const { 1247 Error(diag::err_fe_pch_malformed, Msg); 1248 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1249 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1250 Diag(diag::note_module_cache_path) 1251 << PP.getHeaderSearchInfo().getModuleCachePath(); 1252 } 1253 } 1254 1255 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1256 StringRef Arg3) const { 1257 if (Diags.isDiagnosticInFlight()) 1258 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3); 1259 else 1260 Diag(DiagID) << Arg1 << Arg2 << Arg3; 1261 } 1262 1263 void ASTReader::Error(llvm::Error &&Err) const { 1264 Error(toString(std::move(Err))); 1265 } 1266 1267 //===----------------------------------------------------------------------===// 1268 // Source Manager Deserialization 1269 //===----------------------------------------------------------------------===// 1270 1271 /// Read the line table in the source manager block. 1272 /// \returns true if there was an error. 1273 bool ASTReader::ParseLineTable(ModuleFile &F, 1274 const RecordData &Record) { 1275 unsigned Idx = 0; 1276 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1277 1278 // Parse the file names 1279 std::map<int, int> FileIDs; 1280 FileIDs[-1] = -1; // For unspecified filenames. 1281 for (unsigned I = 0; Record[Idx]; ++I) { 1282 // Extract the file name 1283 auto Filename = ReadPath(F, Record, Idx); 1284 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1285 } 1286 ++Idx; 1287 1288 // Parse the line entries 1289 std::vector<LineEntry> Entries; 1290 while (Idx < Record.size()) { 1291 int FID = Record[Idx++]; 1292 assert(FID >= 0 && "Serialized line entries for non-local file."); 1293 // Remap FileID from 1-based old view. 1294 FID += F.SLocEntryBaseID - 1; 1295 1296 // Extract the line entries 1297 unsigned NumEntries = Record[Idx++]; 1298 assert(NumEntries && "no line entries for file ID"); 1299 Entries.clear(); 1300 Entries.reserve(NumEntries); 1301 for (unsigned I = 0; I != NumEntries; ++I) { 1302 unsigned FileOffset = Record[Idx++]; 1303 unsigned LineNo = Record[Idx++]; 1304 int FilenameID = FileIDs[Record[Idx++]]; 1305 SrcMgr::CharacteristicKind FileKind 1306 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1307 unsigned IncludeOffset = Record[Idx++]; 1308 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1309 FileKind, IncludeOffset)); 1310 } 1311 LineTable.AddEntry(FileID::get(FID), Entries); 1312 } 1313 1314 return false; 1315 } 1316 1317 /// Read a source manager block 1318 bool ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1319 using namespace SrcMgr; 1320 1321 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1322 1323 // Set the source-location entry cursor to the current position in 1324 // the stream. This cursor will be used to read the contents of the 1325 // source manager block initially, and then lazily read 1326 // source-location entries as needed. 1327 SLocEntryCursor = F.Stream; 1328 1329 // The stream itself is going to skip over the source manager block. 1330 if (llvm::Error Err = F.Stream.SkipBlock()) { 1331 Error(std::move(Err)); 1332 return true; 1333 } 1334 1335 // Enter the source manager block. 1336 if (llvm::Error Err = 1337 SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) { 1338 Error(std::move(Err)); 1339 return true; 1340 } 1341 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo(); 1342 1343 RecordData Record; 1344 while (true) { 1345 Expected<llvm::BitstreamEntry> MaybeE = 1346 SLocEntryCursor.advanceSkippingSubblocks(); 1347 if (!MaybeE) { 1348 Error(MaybeE.takeError()); 1349 return true; 1350 } 1351 llvm::BitstreamEntry E = MaybeE.get(); 1352 1353 switch (E.Kind) { 1354 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1355 case llvm::BitstreamEntry::Error: 1356 Error("malformed block record in AST file"); 1357 return true; 1358 case llvm::BitstreamEntry::EndBlock: 1359 return false; 1360 case llvm::BitstreamEntry::Record: 1361 // The interesting case. 1362 break; 1363 } 1364 1365 // Read a record. 1366 Record.clear(); 1367 StringRef Blob; 1368 Expected<unsigned> MaybeRecord = 1369 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1370 if (!MaybeRecord) { 1371 Error(MaybeRecord.takeError()); 1372 return true; 1373 } 1374 switch (MaybeRecord.get()) { 1375 default: // Default behavior: ignore. 1376 break; 1377 1378 case SM_SLOC_FILE_ENTRY: 1379 case SM_SLOC_BUFFER_ENTRY: 1380 case SM_SLOC_EXPANSION_ENTRY: 1381 // Once we hit one of the source location entries, we're done. 1382 return false; 1383 } 1384 } 1385 } 1386 1387 /// If a header file is not found at the path that we expect it to be 1388 /// and the PCH file was moved from its original location, try to resolve the 1389 /// file by assuming that header+PCH were moved together and the header is in 1390 /// the same place relative to the PCH. 1391 static std::string 1392 resolveFileRelativeToOriginalDir(const std::string &Filename, 1393 const std::string &OriginalDir, 1394 const std::string &CurrDir) { 1395 assert(OriginalDir != CurrDir && 1396 "No point trying to resolve the file if the PCH dir didn't change"); 1397 1398 using namespace llvm::sys; 1399 1400 SmallString<128> filePath(Filename); 1401 fs::make_absolute(filePath); 1402 assert(path::is_absolute(OriginalDir)); 1403 SmallString<128> currPCHPath(CurrDir); 1404 1405 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1406 fileDirE = path::end(path::parent_path(filePath)); 1407 path::const_iterator origDirI = path::begin(OriginalDir), 1408 origDirE = path::end(OriginalDir); 1409 // Skip the common path components from filePath and OriginalDir. 1410 while (fileDirI != fileDirE && origDirI != origDirE && 1411 *fileDirI == *origDirI) { 1412 ++fileDirI; 1413 ++origDirI; 1414 } 1415 for (; origDirI != origDirE; ++origDirI) 1416 path::append(currPCHPath, ".."); 1417 path::append(currPCHPath, fileDirI, fileDirE); 1418 path::append(currPCHPath, path::filename(Filename)); 1419 return std::string(currPCHPath.str()); 1420 } 1421 1422 bool ASTReader::ReadSLocEntry(int ID) { 1423 if (ID == 0) 1424 return false; 1425 1426 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1427 Error("source location entry ID out-of-range for AST file"); 1428 return true; 1429 } 1430 1431 // Local helper to read the (possibly-compressed) buffer data following the 1432 // entry record. 1433 auto ReadBuffer = [this]( 1434 BitstreamCursor &SLocEntryCursor, 1435 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1436 RecordData Record; 1437 StringRef Blob; 1438 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1439 if (!MaybeCode) { 1440 Error(MaybeCode.takeError()); 1441 return nullptr; 1442 } 1443 unsigned Code = MaybeCode.get(); 1444 1445 Expected<unsigned> MaybeRecCode = 1446 SLocEntryCursor.readRecord(Code, Record, &Blob); 1447 if (!MaybeRecCode) { 1448 Error(MaybeRecCode.takeError()); 1449 return nullptr; 1450 } 1451 unsigned RecCode = MaybeRecCode.get(); 1452 1453 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1454 if (!llvm::zlib::isAvailable()) { 1455 Error("zlib is not available"); 1456 return nullptr; 1457 } 1458 SmallString<0> Uncompressed; 1459 if (llvm::Error E = 1460 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1461 Error("could not decompress embedded file contents: " + 1462 llvm::toString(std::move(E))); 1463 return nullptr; 1464 } 1465 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1466 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1467 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1468 } else { 1469 Error("AST record has invalid code"); 1470 return nullptr; 1471 } 1472 }; 1473 1474 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1475 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1476 F->SLocEntryOffsetsBase + 1477 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1478 Error(std::move(Err)); 1479 return true; 1480 } 1481 1482 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1483 unsigned BaseOffset = F->SLocEntryBaseOffset; 1484 1485 ++NumSLocEntriesRead; 1486 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1487 if (!MaybeEntry) { 1488 Error(MaybeEntry.takeError()); 1489 return true; 1490 } 1491 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1492 1493 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1494 Error("incorrectly-formatted source location entry in AST file"); 1495 return true; 1496 } 1497 1498 RecordData Record; 1499 StringRef Blob; 1500 Expected<unsigned> MaybeSLOC = 1501 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1502 if (!MaybeSLOC) { 1503 Error(MaybeSLOC.takeError()); 1504 return true; 1505 } 1506 switch (MaybeSLOC.get()) { 1507 default: 1508 Error("incorrectly-formatted source location entry in AST file"); 1509 return true; 1510 1511 case SM_SLOC_FILE_ENTRY: { 1512 // We will detect whether a file changed and return 'Failure' for it, but 1513 // we will also try to fail gracefully by setting up the SLocEntry. 1514 unsigned InputID = Record[4]; 1515 InputFile IF = getInputFile(*F, InputID); 1516 Optional<FileEntryRef> File = IF.getFile(); 1517 bool OverriddenBuffer = IF.isOverridden(); 1518 1519 // Note that we only check if a File was returned. If it was out-of-date 1520 // we have complained but we will continue creating a FileID to recover 1521 // gracefully. 1522 if (!File) 1523 return true; 1524 1525 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1526 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1527 // This is the module's main file. 1528 IncludeLoc = getImportLocation(F); 1529 } 1530 SrcMgr::CharacteristicKind 1531 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1532 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID, 1533 BaseOffset + Record[0]); 1534 SrcMgr::FileInfo &FileInfo = 1535 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1536 FileInfo.NumCreatedFIDs = Record[5]; 1537 if (Record[3]) 1538 FileInfo.setHasLineDirectives(); 1539 1540 unsigned NumFileDecls = Record[7]; 1541 if (NumFileDecls && ContextObj) { 1542 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1543 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1544 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1545 NumFileDecls)); 1546 } 1547 1548 const SrcMgr::ContentCache &ContentCache = 1549 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter)); 1550 if (OverriddenBuffer && !ContentCache.BufferOverridden && 1551 ContentCache.ContentsEntry == ContentCache.OrigEntry && 1552 !ContentCache.getBufferIfLoaded()) { 1553 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1554 if (!Buffer) 1555 return true; 1556 SourceMgr.overrideFileContents(*File, std::move(Buffer)); 1557 } 1558 1559 break; 1560 } 1561 1562 case SM_SLOC_BUFFER_ENTRY: { 1563 const char *Name = Blob.data(); 1564 unsigned Offset = Record[0]; 1565 SrcMgr::CharacteristicKind 1566 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1567 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1568 if (IncludeLoc.isInvalid() && F->isModule()) { 1569 IncludeLoc = getImportLocation(F); 1570 } 1571 1572 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1573 if (!Buffer) 1574 return true; 1575 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1576 BaseOffset + Offset, IncludeLoc); 1577 break; 1578 } 1579 1580 case SM_SLOC_EXPANSION_ENTRY: { 1581 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1582 SourceMgr.createExpansionLoc(SpellingLoc, 1583 ReadSourceLocation(*F, Record[2]), 1584 ReadSourceLocation(*F, Record[3]), 1585 Record[5], 1586 Record[4], 1587 ID, 1588 BaseOffset + Record[0]); 1589 break; 1590 } 1591 } 1592 1593 return false; 1594 } 1595 1596 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1597 if (ID == 0) 1598 return std::make_pair(SourceLocation(), ""); 1599 1600 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1601 Error("source location entry ID out-of-range for AST file"); 1602 return std::make_pair(SourceLocation(), ""); 1603 } 1604 1605 // Find which module file this entry lands in. 1606 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1607 if (!M->isModule()) 1608 return std::make_pair(SourceLocation(), ""); 1609 1610 // FIXME: Can we map this down to a particular submodule? That would be 1611 // ideal. 1612 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1613 } 1614 1615 /// Find the location where the module F is imported. 1616 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1617 if (F->ImportLoc.isValid()) 1618 return F->ImportLoc; 1619 1620 // Otherwise we have a PCH. It's considered to be "imported" at the first 1621 // location of its includer. 1622 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1623 // Main file is the importer. 1624 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1625 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1626 } 1627 return F->ImportedBy[0]->FirstLoc; 1628 } 1629 1630 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1631 /// the abbreviations that are at the top of the block and then leave the cursor 1632 /// pointing into the block. 1633 bool ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, unsigned BlockID, 1634 uint64_t *StartOfBlockOffset) { 1635 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 1636 // FIXME this drops errors on the floor. 1637 consumeError(std::move(Err)); 1638 return true; 1639 } 1640 1641 if (StartOfBlockOffset) 1642 *StartOfBlockOffset = Cursor.GetCurrentBitNo(); 1643 1644 while (true) { 1645 uint64_t Offset = Cursor.GetCurrentBitNo(); 1646 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1647 if (!MaybeCode) { 1648 // FIXME this drops errors on the floor. 1649 consumeError(MaybeCode.takeError()); 1650 return true; 1651 } 1652 unsigned Code = MaybeCode.get(); 1653 1654 // We expect all abbrevs to be at the start of the block. 1655 if (Code != llvm::bitc::DEFINE_ABBREV) { 1656 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1657 // FIXME this drops errors on the floor. 1658 consumeError(std::move(Err)); 1659 return true; 1660 } 1661 return false; 1662 } 1663 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) { 1664 // FIXME this drops errors on the floor. 1665 consumeError(std::move(Err)); 1666 return true; 1667 } 1668 } 1669 } 1670 1671 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1672 unsigned &Idx) { 1673 Token Tok; 1674 Tok.startToken(); 1675 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1676 Tok.setLength(Record[Idx++]); 1677 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1678 Tok.setIdentifierInfo(II); 1679 Tok.setKind((tok::TokenKind)Record[Idx++]); 1680 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1681 return Tok; 1682 } 1683 1684 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1685 BitstreamCursor &Stream = F.MacroCursor; 1686 1687 // Keep track of where we are in the stream, then jump back there 1688 // after reading this macro. 1689 SavedStreamPosition SavedPosition(Stream); 1690 1691 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1692 // FIXME this drops errors on the floor. 1693 consumeError(std::move(Err)); 1694 return nullptr; 1695 } 1696 RecordData Record; 1697 SmallVector<IdentifierInfo*, 16> MacroParams; 1698 MacroInfo *Macro = nullptr; 1699 1700 while (true) { 1701 // Advance to the next record, but if we get to the end of the block, don't 1702 // pop it (removing all the abbreviations from the cursor) since we want to 1703 // be able to reseek within the block and read entries. 1704 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1705 Expected<llvm::BitstreamEntry> MaybeEntry = 1706 Stream.advanceSkippingSubblocks(Flags); 1707 if (!MaybeEntry) { 1708 Error(MaybeEntry.takeError()); 1709 return Macro; 1710 } 1711 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1712 1713 switch (Entry.Kind) { 1714 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1715 case llvm::BitstreamEntry::Error: 1716 Error("malformed block record in AST file"); 1717 return Macro; 1718 case llvm::BitstreamEntry::EndBlock: 1719 return Macro; 1720 case llvm::BitstreamEntry::Record: 1721 // The interesting case. 1722 break; 1723 } 1724 1725 // Read a record. 1726 Record.clear(); 1727 PreprocessorRecordTypes RecType; 1728 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1729 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1730 else { 1731 Error(MaybeRecType.takeError()); 1732 return Macro; 1733 } 1734 switch (RecType) { 1735 case PP_MODULE_MACRO: 1736 case PP_MACRO_DIRECTIVE_HISTORY: 1737 return Macro; 1738 1739 case PP_MACRO_OBJECT_LIKE: 1740 case PP_MACRO_FUNCTION_LIKE: { 1741 // If we already have a macro, that means that we've hit the end 1742 // of the definition of the macro we were looking for. We're 1743 // done. 1744 if (Macro) 1745 return Macro; 1746 1747 unsigned NextIndex = 1; // Skip identifier ID. 1748 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1749 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1750 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1751 MI->setIsUsed(Record[NextIndex++]); 1752 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1753 1754 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1755 // Decode function-like macro info. 1756 bool isC99VarArgs = Record[NextIndex++]; 1757 bool isGNUVarArgs = Record[NextIndex++]; 1758 bool hasCommaPasting = Record[NextIndex++]; 1759 MacroParams.clear(); 1760 unsigned NumArgs = Record[NextIndex++]; 1761 for (unsigned i = 0; i != NumArgs; ++i) 1762 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1763 1764 // Install function-like macro info. 1765 MI->setIsFunctionLike(); 1766 if (isC99VarArgs) MI->setIsC99Varargs(); 1767 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1768 if (hasCommaPasting) MI->setHasCommaPasting(); 1769 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1770 } 1771 1772 // Remember that we saw this macro last so that we add the tokens that 1773 // form its body to it. 1774 Macro = MI; 1775 1776 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1777 Record[NextIndex]) { 1778 // We have a macro definition. Register the association 1779 PreprocessedEntityID 1780 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1781 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1782 PreprocessingRecord::PPEntityID PPID = 1783 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1784 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1785 PPRec.getPreprocessedEntity(PPID)); 1786 if (PPDef) 1787 PPRec.RegisterMacroDefinition(Macro, PPDef); 1788 } 1789 1790 ++NumMacrosRead; 1791 break; 1792 } 1793 1794 case PP_TOKEN: { 1795 // If we see a TOKEN before a PP_MACRO_*, then the file is 1796 // erroneous, just pretend we didn't see this. 1797 if (!Macro) break; 1798 1799 unsigned Idx = 0; 1800 Token Tok = ReadToken(F, Record, Idx); 1801 Macro->AddTokenToBody(Tok); 1802 break; 1803 } 1804 } 1805 } 1806 } 1807 1808 PreprocessedEntityID 1809 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1810 unsigned LocalID) const { 1811 if (!M.ModuleOffsetMap.empty()) 1812 ReadModuleOffsetMap(M); 1813 1814 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1815 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1816 assert(I != M.PreprocessedEntityRemap.end() 1817 && "Invalid index into preprocessed entity index remap"); 1818 1819 return LocalID + I->second; 1820 } 1821 1822 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1823 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1824 } 1825 1826 HeaderFileInfoTrait::internal_key_type 1827 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1828 internal_key_type ikey = {FE->getSize(), 1829 M.HasTimestamps ? FE->getModificationTime() : 0, 1830 FE->getName(), /*Imported*/ false}; 1831 return ikey; 1832 } 1833 1834 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1835 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1836 return false; 1837 1838 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1839 return true; 1840 1841 // Determine whether the actual files are equivalent. 1842 FileManager &FileMgr = Reader.getFileManager(); 1843 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1844 if (!Key.Imported) { 1845 if (auto File = FileMgr.getFile(Key.Filename)) 1846 return *File; 1847 return nullptr; 1848 } 1849 1850 std::string Resolved = std::string(Key.Filename); 1851 Reader.ResolveImportedPath(M, Resolved); 1852 if (auto File = FileMgr.getFile(Resolved)) 1853 return *File; 1854 return nullptr; 1855 }; 1856 1857 const FileEntry *FEA = GetFile(a); 1858 const FileEntry *FEB = GetFile(b); 1859 return FEA && FEA == FEB; 1860 } 1861 1862 std::pair<unsigned, unsigned> 1863 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1864 return readULEBKeyDataLength(d); 1865 } 1866 1867 HeaderFileInfoTrait::internal_key_type 1868 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1869 using namespace llvm::support; 1870 1871 internal_key_type ikey; 1872 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1873 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1874 ikey.Filename = (const char *)d; 1875 ikey.Imported = true; 1876 return ikey; 1877 } 1878 1879 HeaderFileInfoTrait::data_type 1880 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1881 unsigned DataLen) { 1882 using namespace llvm::support; 1883 1884 const unsigned char *End = d + DataLen; 1885 HeaderFileInfo HFI; 1886 unsigned Flags = *d++; 1887 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1888 HFI.isImport |= (Flags >> 5) & 0x01; 1889 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1890 HFI.DirInfo = (Flags >> 1) & 0x07; 1891 HFI.IndexHeaderMapHeader = Flags & 0x01; 1892 // FIXME: Find a better way to handle this. Maybe just store a 1893 // "has been included" flag? 1894 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1895 HFI.NumIncludes); 1896 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1897 M, endian::readNext<uint32_t, little, unaligned>(d)); 1898 if (unsigned FrameworkOffset = 1899 endian::readNext<uint32_t, little, unaligned>(d)) { 1900 // The framework offset is 1 greater than the actual offset, 1901 // since 0 is used as an indicator for "no framework name". 1902 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1903 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1904 } 1905 1906 assert((End - d) % 4 == 0 && 1907 "Wrong data length in HeaderFileInfo deserialization"); 1908 while (d != End) { 1909 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1910 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1911 LocalSMID >>= 2; 1912 1913 // This header is part of a module. Associate it with the module to enable 1914 // implicit module import. 1915 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1916 Module *Mod = Reader.getSubmodule(GlobalSMID); 1917 FileManager &FileMgr = Reader.getFileManager(); 1918 ModuleMap &ModMap = 1919 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1920 1921 std::string Filename = std::string(key.Filename); 1922 if (key.Imported) 1923 Reader.ResolveImportedPath(M, Filename); 1924 // FIXME: This is not always the right filename-as-written, but we're not 1925 // going to use this information to rebuild the module, so it doesn't make 1926 // a lot of difference. 1927 Module::Header H = {std::string(key.Filename), 1928 *FileMgr.getOptionalFileRef(Filename)}; 1929 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1930 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1931 } 1932 1933 // This HeaderFileInfo was externally loaded. 1934 HFI.External = true; 1935 HFI.IsValid = true; 1936 return HFI; 1937 } 1938 1939 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1940 uint32_t MacroDirectivesOffset) { 1941 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1942 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1943 } 1944 1945 void ASTReader::ReadDefinedMacros() { 1946 // Note that we are loading defined macros. 1947 Deserializing Macros(this); 1948 1949 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1950 BitstreamCursor &MacroCursor = I.MacroCursor; 1951 1952 // If there was no preprocessor block, skip this file. 1953 if (MacroCursor.getBitcodeBytes().empty()) 1954 continue; 1955 1956 BitstreamCursor Cursor = MacroCursor; 1957 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1958 Error(std::move(Err)); 1959 return; 1960 } 1961 1962 RecordData Record; 1963 while (true) { 1964 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1965 if (!MaybeE) { 1966 Error(MaybeE.takeError()); 1967 return; 1968 } 1969 llvm::BitstreamEntry E = MaybeE.get(); 1970 1971 switch (E.Kind) { 1972 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1973 case llvm::BitstreamEntry::Error: 1974 Error("malformed block record in AST file"); 1975 return; 1976 case llvm::BitstreamEntry::EndBlock: 1977 goto NextCursor; 1978 1979 case llvm::BitstreamEntry::Record: { 1980 Record.clear(); 1981 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1982 if (!MaybeRecord) { 1983 Error(MaybeRecord.takeError()); 1984 return; 1985 } 1986 switch (MaybeRecord.get()) { 1987 default: // Default behavior: ignore. 1988 break; 1989 1990 case PP_MACRO_OBJECT_LIKE: 1991 case PP_MACRO_FUNCTION_LIKE: { 1992 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1993 if (II->isOutOfDate()) 1994 updateOutOfDateIdentifier(*II); 1995 break; 1996 } 1997 1998 case PP_TOKEN: 1999 // Ignore tokens. 2000 break; 2001 } 2002 break; 2003 } 2004 } 2005 } 2006 NextCursor: ; 2007 } 2008 } 2009 2010 namespace { 2011 2012 /// Visitor class used to look up identifirs in an AST file. 2013 class IdentifierLookupVisitor { 2014 StringRef Name; 2015 unsigned NameHash; 2016 unsigned PriorGeneration; 2017 unsigned &NumIdentifierLookups; 2018 unsigned &NumIdentifierLookupHits; 2019 IdentifierInfo *Found = nullptr; 2020 2021 public: 2022 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2023 unsigned &NumIdentifierLookups, 2024 unsigned &NumIdentifierLookupHits) 2025 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2026 PriorGeneration(PriorGeneration), 2027 NumIdentifierLookups(NumIdentifierLookups), 2028 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2029 2030 bool operator()(ModuleFile &M) { 2031 // If we've already searched this module file, skip it now. 2032 if (M.Generation <= PriorGeneration) 2033 return true; 2034 2035 ASTIdentifierLookupTable *IdTable 2036 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2037 if (!IdTable) 2038 return false; 2039 2040 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2041 Found); 2042 ++NumIdentifierLookups; 2043 ASTIdentifierLookupTable::iterator Pos = 2044 IdTable->find_hashed(Name, NameHash, &Trait); 2045 if (Pos == IdTable->end()) 2046 return false; 2047 2048 // Dereferencing the iterator has the effect of building the 2049 // IdentifierInfo node and populating it with the various 2050 // declarations it needs. 2051 ++NumIdentifierLookupHits; 2052 Found = *Pos; 2053 return true; 2054 } 2055 2056 // Retrieve the identifier info found within the module 2057 // files. 2058 IdentifierInfo *getIdentifierInfo() const { return Found; } 2059 }; 2060 2061 } // namespace 2062 2063 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2064 // Note that we are loading an identifier. 2065 Deserializing AnIdentifier(this); 2066 2067 unsigned PriorGeneration = 0; 2068 if (getContext().getLangOpts().Modules) 2069 PriorGeneration = IdentifierGeneration[&II]; 2070 2071 // If there is a global index, look there first to determine which modules 2072 // provably do not have any results for this identifier. 2073 GlobalModuleIndex::HitSet Hits; 2074 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2075 if (!loadGlobalIndex()) { 2076 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2077 HitsPtr = &Hits; 2078 } 2079 } 2080 2081 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2082 NumIdentifierLookups, 2083 NumIdentifierLookupHits); 2084 ModuleMgr.visit(Visitor, HitsPtr); 2085 markIdentifierUpToDate(&II); 2086 } 2087 2088 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2089 if (!II) 2090 return; 2091 2092 II->setOutOfDate(false); 2093 2094 // Update the generation for this identifier. 2095 if (getContext().getLangOpts().Modules) 2096 IdentifierGeneration[II] = getGeneration(); 2097 } 2098 2099 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2100 const PendingMacroInfo &PMInfo) { 2101 ModuleFile &M = *PMInfo.M; 2102 2103 BitstreamCursor &Cursor = M.MacroCursor; 2104 SavedStreamPosition SavedPosition(Cursor); 2105 if (llvm::Error Err = 2106 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2107 Error(std::move(Err)); 2108 return; 2109 } 2110 2111 struct ModuleMacroRecord { 2112 SubmoduleID SubModID; 2113 MacroInfo *MI; 2114 SmallVector<SubmoduleID, 8> Overrides; 2115 }; 2116 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2117 2118 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2119 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2120 // macro histroy. 2121 RecordData Record; 2122 while (true) { 2123 Expected<llvm::BitstreamEntry> MaybeEntry = 2124 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2125 if (!MaybeEntry) { 2126 Error(MaybeEntry.takeError()); 2127 return; 2128 } 2129 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2130 2131 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2132 Error("malformed block record in AST file"); 2133 return; 2134 } 2135 2136 Record.clear(); 2137 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2138 if (!MaybePP) { 2139 Error(MaybePP.takeError()); 2140 return; 2141 } 2142 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2143 case PP_MACRO_DIRECTIVE_HISTORY: 2144 break; 2145 2146 case PP_MODULE_MACRO: { 2147 ModuleMacros.push_back(ModuleMacroRecord()); 2148 auto &Info = ModuleMacros.back(); 2149 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2150 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2151 for (int I = 2, N = Record.size(); I != N; ++I) 2152 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2153 continue; 2154 } 2155 2156 default: 2157 Error("malformed block record in AST file"); 2158 return; 2159 } 2160 2161 // We found the macro directive history; that's the last record 2162 // for this macro. 2163 break; 2164 } 2165 2166 // Module macros are listed in reverse dependency order. 2167 { 2168 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2169 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2170 for (auto &MMR : ModuleMacros) { 2171 Overrides.clear(); 2172 for (unsigned ModID : MMR.Overrides) { 2173 Module *Mod = getSubmodule(ModID); 2174 auto *Macro = PP.getModuleMacro(Mod, II); 2175 assert(Macro && "missing definition for overridden macro"); 2176 Overrides.push_back(Macro); 2177 } 2178 2179 bool Inserted = false; 2180 Module *Owner = getSubmodule(MMR.SubModID); 2181 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2182 } 2183 } 2184 2185 // Don't read the directive history for a module; we don't have anywhere 2186 // to put it. 2187 if (M.isModule()) 2188 return; 2189 2190 // Deserialize the macro directives history in reverse source-order. 2191 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2192 unsigned Idx = 0, N = Record.size(); 2193 while (Idx < N) { 2194 MacroDirective *MD = nullptr; 2195 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2196 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2197 switch (K) { 2198 case MacroDirective::MD_Define: { 2199 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2200 MD = PP.AllocateDefMacroDirective(MI, Loc); 2201 break; 2202 } 2203 case MacroDirective::MD_Undefine: 2204 MD = PP.AllocateUndefMacroDirective(Loc); 2205 break; 2206 case MacroDirective::MD_Visibility: 2207 bool isPublic = Record[Idx++]; 2208 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2209 break; 2210 } 2211 2212 if (!Latest) 2213 Latest = MD; 2214 if (Earliest) 2215 Earliest->setPrevious(MD); 2216 Earliest = MD; 2217 } 2218 2219 if (Latest) 2220 PP.setLoadedMacroDirective(II, Earliest, Latest); 2221 } 2222 2223 bool ASTReader::shouldDisableValidationForFile( 2224 const serialization::ModuleFile &M) const { 2225 if (DisableValidationKind == DisableValidationForModuleKind::None) 2226 return false; 2227 2228 // If a PCH is loaded and validation is disabled for PCH then disable 2229 // validation for the PCH and the modules it loads. 2230 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind); 2231 2232 switch (K) { 2233 case MK_MainFile: 2234 case MK_Preamble: 2235 case MK_PCH: 2236 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH); 2237 case MK_ImplicitModule: 2238 case MK_ExplicitModule: 2239 case MK_PrebuiltModule: 2240 return bool(DisableValidationKind & DisableValidationForModuleKind::Module); 2241 } 2242 2243 return false; 2244 } 2245 2246 ASTReader::InputFileInfo 2247 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2248 // Go find this input file. 2249 BitstreamCursor &Cursor = F.InputFilesCursor; 2250 SavedStreamPosition SavedPosition(Cursor); 2251 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2252 // FIXME this drops errors on the floor. 2253 consumeError(std::move(Err)); 2254 } 2255 2256 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2257 if (!MaybeCode) { 2258 // FIXME this drops errors on the floor. 2259 consumeError(MaybeCode.takeError()); 2260 } 2261 unsigned Code = MaybeCode.get(); 2262 RecordData Record; 2263 StringRef Blob; 2264 2265 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2266 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2267 "invalid record type for input file"); 2268 else { 2269 // FIXME this drops errors on the floor. 2270 consumeError(Maybe.takeError()); 2271 } 2272 2273 assert(Record[0] == ID && "Bogus stored ID or offset"); 2274 InputFileInfo R; 2275 R.StoredSize = static_cast<off_t>(Record[1]); 2276 R.StoredTime = static_cast<time_t>(Record[2]); 2277 R.Overridden = static_cast<bool>(Record[3]); 2278 R.Transient = static_cast<bool>(Record[4]); 2279 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2280 R.Filename = std::string(Blob); 2281 ResolveImportedPath(F, R.Filename); 2282 2283 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2284 if (!MaybeEntry) // FIXME this drops errors on the floor. 2285 consumeError(MaybeEntry.takeError()); 2286 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2287 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2288 "expected record type for input file hash"); 2289 2290 Record.clear(); 2291 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2292 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2293 "invalid record type for input file hash"); 2294 else { 2295 // FIXME this drops errors on the floor. 2296 consumeError(Maybe.takeError()); 2297 } 2298 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2299 static_cast<uint64_t>(Record[0]); 2300 return R; 2301 } 2302 2303 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2304 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2305 // If this ID is bogus, just return an empty input file. 2306 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2307 return InputFile(); 2308 2309 // If we've already loaded this input file, return it. 2310 if (F.InputFilesLoaded[ID-1].getFile()) 2311 return F.InputFilesLoaded[ID-1]; 2312 2313 if (F.InputFilesLoaded[ID-1].isNotFound()) 2314 return InputFile(); 2315 2316 // Go find this input file. 2317 BitstreamCursor &Cursor = F.InputFilesCursor; 2318 SavedStreamPosition SavedPosition(Cursor); 2319 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2320 // FIXME this drops errors on the floor. 2321 consumeError(std::move(Err)); 2322 } 2323 2324 InputFileInfo FI = readInputFileInfo(F, ID); 2325 off_t StoredSize = FI.StoredSize; 2326 time_t StoredTime = FI.StoredTime; 2327 bool Overridden = FI.Overridden; 2328 bool Transient = FI.Transient; 2329 StringRef Filename = FI.Filename; 2330 uint64_t StoredContentHash = FI.ContentHash; 2331 2332 OptionalFileEntryRefDegradesToFileEntryPtr File = 2333 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false)); 2334 2335 // If we didn't find the file, resolve it relative to the 2336 // original directory from which this AST file was created. 2337 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2338 F.OriginalDir != F.BaseDirectory) { 2339 std::string Resolved = resolveFileRelativeToOriginalDir( 2340 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2341 if (!Resolved.empty()) 2342 File = expectedToOptional(FileMgr.getFileRef(Resolved)); 2343 } 2344 2345 // For an overridden file, create a virtual file with the stored 2346 // size/timestamp. 2347 if ((Overridden || Transient) && !File) 2348 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime); 2349 2350 if (!File) { 2351 if (Complain) { 2352 std::string ErrorStr = "could not find file '"; 2353 ErrorStr += Filename; 2354 ErrorStr += "' referenced by AST file '"; 2355 ErrorStr += F.FileName; 2356 ErrorStr += "'"; 2357 Error(ErrorStr); 2358 } 2359 // Record that we didn't find the file. 2360 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2361 return InputFile(); 2362 } 2363 2364 // Check if there was a request to override the contents of the file 2365 // that was part of the precompiled header. Overriding such a file 2366 // can lead to problems when lexing using the source locations from the 2367 // PCH. 2368 SourceManager &SM = getSourceManager(); 2369 // FIXME: Reject if the overrides are different. 2370 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2371 if (Complain) 2372 Error(diag::err_fe_pch_file_overridden, Filename); 2373 2374 // After emitting the diagnostic, bypass the overriding file to recover 2375 // (this creates a separate FileEntry). 2376 File = SM.bypassFileContentsOverride(*File); 2377 if (!File) { 2378 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2379 return InputFile(); 2380 } 2381 } 2382 2383 enum ModificationType { 2384 Size, 2385 ModTime, 2386 Content, 2387 None, 2388 }; 2389 auto HasInputFileChanged = [&]() { 2390 if (StoredSize != File->getSize()) 2391 return ModificationType::Size; 2392 if (!shouldDisableValidationForFile(F) && StoredTime && 2393 StoredTime != File->getModificationTime()) { 2394 // In case the modification time changes but not the content, 2395 // accept the cached file as legit. 2396 if (ValidateASTInputFilesContent && 2397 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2398 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2399 if (!MemBuffOrError) { 2400 if (!Complain) 2401 return ModificationType::ModTime; 2402 std::string ErrorStr = "could not get buffer for file '"; 2403 ErrorStr += File->getName(); 2404 ErrorStr += "'"; 2405 Error(ErrorStr); 2406 return ModificationType::ModTime; 2407 } 2408 2409 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2410 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2411 return ModificationType::None; 2412 return ModificationType::Content; 2413 } 2414 return ModificationType::ModTime; 2415 } 2416 return ModificationType::None; 2417 }; 2418 2419 bool IsOutOfDate = false; 2420 auto FileChange = HasInputFileChanged(); 2421 // For an overridden file, there is nothing to validate. 2422 if (!Overridden && FileChange != ModificationType::None) { 2423 if (Complain && !Diags.isDiagnosticInFlight()) { 2424 // Build a list of the PCH imports that got us here (in reverse). 2425 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2426 while (!ImportStack.back()->ImportedBy.empty()) 2427 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2428 2429 // The top-level PCH is stale. 2430 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2431 Diag(diag::err_fe_ast_file_modified) 2432 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind) 2433 << TopLevelPCHName << FileChange; 2434 2435 // Print the import stack. 2436 if (ImportStack.size() > 1) { 2437 Diag(diag::note_pch_required_by) 2438 << Filename << ImportStack[0]->FileName; 2439 for (unsigned I = 1; I < ImportStack.size(); ++I) 2440 Diag(diag::note_pch_required_by) 2441 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2442 } 2443 2444 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2445 } 2446 2447 IsOutOfDate = true; 2448 } 2449 // FIXME: If the file is overridden and we've already opened it, 2450 // issue an error (or split it into a separate FileEntry). 2451 2452 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate); 2453 2454 // Note that we've loaded this input file. 2455 F.InputFilesLoaded[ID-1] = IF; 2456 return IF; 2457 } 2458 2459 /// If we are loading a relocatable PCH or module file, and the filename 2460 /// is not an absolute path, add the system or module root to the beginning of 2461 /// the file name. 2462 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2463 // Resolve relative to the base directory, if we have one. 2464 if (!M.BaseDirectory.empty()) 2465 return ResolveImportedPath(Filename, M.BaseDirectory); 2466 } 2467 2468 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2469 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2470 return; 2471 2472 SmallString<128> Buffer; 2473 llvm::sys::path::append(Buffer, Prefix, Filename); 2474 Filename.assign(Buffer.begin(), Buffer.end()); 2475 } 2476 2477 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2478 switch (ARR) { 2479 case ASTReader::Failure: return true; 2480 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2481 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2482 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2483 case ASTReader::ConfigurationMismatch: 2484 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2485 case ASTReader::HadErrors: return true; 2486 case ASTReader::Success: return false; 2487 } 2488 2489 llvm_unreachable("unknown ASTReadResult"); 2490 } 2491 2492 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2493 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2494 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2495 std::string &SuggestedPredefines) { 2496 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2497 // FIXME this drops errors on the floor. 2498 consumeError(std::move(Err)); 2499 return Failure; 2500 } 2501 2502 // Read all of the records in the options block. 2503 RecordData Record; 2504 ASTReadResult Result = Success; 2505 while (true) { 2506 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2507 if (!MaybeEntry) { 2508 // FIXME this drops errors on the floor. 2509 consumeError(MaybeEntry.takeError()); 2510 return Failure; 2511 } 2512 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2513 2514 switch (Entry.Kind) { 2515 case llvm::BitstreamEntry::Error: 2516 case llvm::BitstreamEntry::SubBlock: 2517 return Failure; 2518 2519 case llvm::BitstreamEntry::EndBlock: 2520 return Result; 2521 2522 case llvm::BitstreamEntry::Record: 2523 // The interesting case. 2524 break; 2525 } 2526 2527 // Read and process a record. 2528 Record.clear(); 2529 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2530 if (!MaybeRecordType) { 2531 // FIXME this drops errors on the floor. 2532 consumeError(MaybeRecordType.takeError()); 2533 return Failure; 2534 } 2535 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2536 case LANGUAGE_OPTIONS: { 2537 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2538 if (ParseLanguageOptions(Record, Complain, Listener, 2539 AllowCompatibleConfigurationMismatch)) 2540 Result = ConfigurationMismatch; 2541 break; 2542 } 2543 2544 case TARGET_OPTIONS: { 2545 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2546 if (ParseTargetOptions(Record, Complain, Listener, 2547 AllowCompatibleConfigurationMismatch)) 2548 Result = ConfigurationMismatch; 2549 break; 2550 } 2551 2552 case FILE_SYSTEM_OPTIONS: { 2553 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2554 if (!AllowCompatibleConfigurationMismatch && 2555 ParseFileSystemOptions(Record, Complain, Listener)) 2556 Result = ConfigurationMismatch; 2557 break; 2558 } 2559 2560 case HEADER_SEARCH_OPTIONS: { 2561 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2562 if (!AllowCompatibleConfigurationMismatch && 2563 ParseHeaderSearchOptions(Record, Complain, Listener)) 2564 Result = ConfigurationMismatch; 2565 break; 2566 } 2567 2568 case PREPROCESSOR_OPTIONS: 2569 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2570 if (!AllowCompatibleConfigurationMismatch && 2571 ParsePreprocessorOptions(Record, Complain, Listener, 2572 SuggestedPredefines)) 2573 Result = ConfigurationMismatch; 2574 break; 2575 } 2576 } 2577 } 2578 2579 ASTReader::ASTReadResult 2580 ASTReader::ReadControlBlock(ModuleFile &F, 2581 SmallVectorImpl<ImportedModule> &Loaded, 2582 const ModuleFile *ImportedBy, 2583 unsigned ClientLoadCapabilities) { 2584 BitstreamCursor &Stream = F.Stream; 2585 2586 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2587 Error(std::move(Err)); 2588 return Failure; 2589 } 2590 2591 // Lambda to read the unhashed control block the first time it's called. 2592 // 2593 // For PCM files, the unhashed control block cannot be read until after the 2594 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2595 // need to look ahead before reading the IMPORTS record. For consistency, 2596 // this block is always read somehow (see BitstreamEntry::EndBlock). 2597 bool HasReadUnhashedControlBlock = false; 2598 auto readUnhashedControlBlockOnce = [&]() { 2599 if (!HasReadUnhashedControlBlock) { 2600 HasReadUnhashedControlBlock = true; 2601 if (ASTReadResult Result = 2602 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2603 return Result; 2604 } 2605 return Success; 2606 }; 2607 2608 bool DisableValidation = shouldDisableValidationForFile(F); 2609 2610 // Read all of the records and blocks in the control block. 2611 RecordData Record; 2612 unsigned NumInputs = 0; 2613 unsigned NumUserInputs = 0; 2614 StringRef BaseDirectoryAsWritten; 2615 while (true) { 2616 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2617 if (!MaybeEntry) { 2618 Error(MaybeEntry.takeError()); 2619 return Failure; 2620 } 2621 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2622 2623 switch (Entry.Kind) { 2624 case llvm::BitstreamEntry::Error: 2625 Error("malformed block record in AST file"); 2626 return Failure; 2627 case llvm::BitstreamEntry::EndBlock: { 2628 // Validate the module before returning. This call catches an AST with 2629 // no module name and no imports. 2630 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2631 return Result; 2632 2633 // Validate input files. 2634 const HeaderSearchOptions &HSOpts = 2635 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2636 2637 // All user input files reside at the index range [0, NumUserInputs), and 2638 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2639 // loaded module files, ignore missing inputs. 2640 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2641 F.Kind != MK_PrebuiltModule) { 2642 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2643 2644 // If we are reading a module, we will create a verification timestamp, 2645 // so we verify all input files. Otherwise, verify only user input 2646 // files. 2647 2648 unsigned N = NumUserInputs; 2649 if (ValidateSystemInputs || 2650 (HSOpts.ModulesValidateOncePerBuildSession && 2651 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2652 F.Kind == MK_ImplicitModule)) 2653 N = NumInputs; 2654 2655 for (unsigned I = 0; I < N; ++I) { 2656 InputFile IF = getInputFile(F, I+1, Complain); 2657 if (!IF.getFile() || IF.isOutOfDate()) 2658 return OutOfDate; 2659 } 2660 } 2661 2662 if (Listener) 2663 Listener->visitModuleFile(F.FileName, F.Kind); 2664 2665 if (Listener && Listener->needsInputFileVisitation()) { 2666 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2667 : NumUserInputs; 2668 for (unsigned I = 0; I < N; ++I) { 2669 bool IsSystem = I >= NumUserInputs; 2670 InputFileInfo FI = readInputFileInfo(F, I+1); 2671 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2672 F.Kind == MK_ExplicitModule || 2673 F.Kind == MK_PrebuiltModule); 2674 } 2675 } 2676 2677 return Success; 2678 } 2679 2680 case llvm::BitstreamEntry::SubBlock: 2681 switch (Entry.ID) { 2682 case INPUT_FILES_BLOCK_ID: 2683 F.InputFilesCursor = Stream; 2684 if (llvm::Error Err = Stream.SkipBlock()) { 2685 Error(std::move(Err)); 2686 return Failure; 2687 } 2688 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2689 Error("malformed block record in AST file"); 2690 return Failure; 2691 } 2692 continue; 2693 2694 case OPTIONS_BLOCK_ID: 2695 // If we're reading the first module for this group, check its options 2696 // are compatible with ours. For modules it imports, no further checking 2697 // is required, because we checked them when we built it. 2698 if (Listener && !ImportedBy) { 2699 // Should we allow the configuration of the module file to differ from 2700 // the configuration of the current translation unit in a compatible 2701 // way? 2702 // 2703 // FIXME: Allow this for files explicitly specified with -include-pch. 2704 bool AllowCompatibleConfigurationMismatch = 2705 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2706 2707 ASTReadResult Result = 2708 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2709 AllowCompatibleConfigurationMismatch, *Listener, 2710 SuggestedPredefines); 2711 if (Result == Failure) { 2712 Error("malformed block record in AST file"); 2713 return Result; 2714 } 2715 2716 if (DisableValidation || 2717 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2718 Result = Success; 2719 2720 // If we can't load the module, exit early since we likely 2721 // will rebuild the module anyway. The stream may be in the 2722 // middle of a block. 2723 if (Result != Success) 2724 return Result; 2725 } else if (llvm::Error Err = Stream.SkipBlock()) { 2726 Error(std::move(Err)); 2727 return Failure; 2728 } 2729 continue; 2730 2731 default: 2732 if (llvm::Error Err = Stream.SkipBlock()) { 2733 Error(std::move(Err)); 2734 return Failure; 2735 } 2736 continue; 2737 } 2738 2739 case llvm::BitstreamEntry::Record: 2740 // The interesting case. 2741 break; 2742 } 2743 2744 // Read and process a record. 2745 Record.clear(); 2746 StringRef Blob; 2747 Expected<unsigned> MaybeRecordType = 2748 Stream.readRecord(Entry.ID, Record, &Blob); 2749 if (!MaybeRecordType) { 2750 Error(MaybeRecordType.takeError()); 2751 return Failure; 2752 } 2753 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2754 case METADATA: { 2755 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2756 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2757 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2758 : diag::err_pch_version_too_new); 2759 return VersionMismatch; 2760 } 2761 2762 bool hasErrors = Record[6]; 2763 if (hasErrors && !DisableValidation) { 2764 // If requested by the caller, mark modules on error as out-of-date. 2765 if (F.Kind == MK_ImplicitModule && 2766 (ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate)) 2767 return OutOfDate; 2768 2769 if (!AllowASTWithCompilerErrors) { 2770 Diag(diag::err_pch_with_compiler_errors); 2771 return HadErrors; 2772 } 2773 } 2774 if (hasErrors) { 2775 Diags.ErrorOccurred = true; 2776 Diags.UncompilableErrorOccurred = true; 2777 Diags.UnrecoverableErrorOccurred = true; 2778 } 2779 2780 F.RelocatablePCH = Record[4]; 2781 // Relative paths in a relocatable PCH are relative to our sysroot. 2782 if (F.RelocatablePCH) 2783 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2784 2785 F.HasTimestamps = Record[5]; 2786 2787 const std::string &CurBranch = getClangFullRepositoryVersion(); 2788 StringRef ASTBranch = Blob; 2789 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2790 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2791 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2792 return VersionMismatch; 2793 } 2794 break; 2795 } 2796 2797 case IMPORTS: { 2798 // Validate the AST before processing any imports (otherwise, untangling 2799 // them can be error-prone and expensive). A module will have a name and 2800 // will already have been validated, but this catches the PCH case. 2801 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2802 return Result; 2803 2804 // Load each of the imported PCH files. 2805 unsigned Idx = 0, N = Record.size(); 2806 while (Idx < N) { 2807 // Read information about the AST file. 2808 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2809 // The import location will be the local one for now; we will adjust 2810 // all import locations of module imports after the global source 2811 // location info are setup, in ReadAST. 2812 SourceLocation ImportLoc = 2813 ReadUntranslatedSourceLocation(Record[Idx++]); 2814 off_t StoredSize = (off_t)Record[Idx++]; 2815 time_t StoredModTime = (time_t)Record[Idx++]; 2816 auto FirstSignatureByte = Record.begin() + Idx; 2817 ASTFileSignature StoredSignature = ASTFileSignature::create( 2818 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size); 2819 Idx += ASTFileSignature::size; 2820 2821 std::string ImportedName = ReadString(Record, Idx); 2822 std::string ImportedFile; 2823 2824 // For prebuilt and explicit modules first consult the file map for 2825 // an override. Note that here we don't search prebuilt module 2826 // directories, only the explicit name to file mappings. Also, we will 2827 // still verify the size/signature making sure it is essentially the 2828 // same file but perhaps in a different location. 2829 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2830 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2831 ImportedName, /*FileMapOnly*/ true); 2832 2833 if (ImportedFile.empty()) 2834 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2835 // ModuleCache as when writing. 2836 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2837 else 2838 SkipPath(Record, Idx); 2839 2840 // If our client can't cope with us being out of date, we can't cope with 2841 // our dependency being missing. 2842 unsigned Capabilities = ClientLoadCapabilities; 2843 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2844 Capabilities &= ~ARR_Missing; 2845 2846 // Load the AST file. 2847 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2848 Loaded, StoredSize, StoredModTime, 2849 StoredSignature, Capabilities); 2850 2851 // If we diagnosed a problem, produce a backtrace. 2852 if (isDiagnosedResult(Result, Capabilities)) 2853 Diag(diag::note_module_file_imported_by) 2854 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2855 2856 switch (Result) { 2857 case Failure: return Failure; 2858 // If we have to ignore the dependency, we'll have to ignore this too. 2859 case Missing: 2860 case OutOfDate: return OutOfDate; 2861 case VersionMismatch: return VersionMismatch; 2862 case ConfigurationMismatch: return ConfigurationMismatch; 2863 case HadErrors: return HadErrors; 2864 case Success: break; 2865 } 2866 } 2867 break; 2868 } 2869 2870 case ORIGINAL_FILE: 2871 F.OriginalSourceFileID = FileID::get(Record[0]); 2872 F.ActualOriginalSourceFileName = std::string(Blob); 2873 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2874 ResolveImportedPath(F, F.OriginalSourceFileName); 2875 break; 2876 2877 case ORIGINAL_FILE_ID: 2878 F.OriginalSourceFileID = FileID::get(Record[0]); 2879 break; 2880 2881 case ORIGINAL_PCH_DIR: 2882 F.OriginalDir = std::string(Blob); 2883 break; 2884 2885 case MODULE_NAME: 2886 F.ModuleName = std::string(Blob); 2887 Diag(diag::remark_module_import) 2888 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2889 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2890 if (Listener) 2891 Listener->ReadModuleName(F.ModuleName); 2892 2893 // Validate the AST as soon as we have a name so we can exit early on 2894 // failure. 2895 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2896 return Result; 2897 2898 break; 2899 2900 case MODULE_DIRECTORY: { 2901 // Save the BaseDirectory as written in the PCM for computing the module 2902 // filename for the ModuleCache. 2903 BaseDirectoryAsWritten = Blob; 2904 assert(!F.ModuleName.empty() && 2905 "MODULE_DIRECTORY found before MODULE_NAME"); 2906 // If we've already loaded a module map file covering this module, we may 2907 // have a better path for it (relative to the current build). 2908 Module *M = PP.getHeaderSearchInfo().lookupModule( 2909 F.ModuleName, /*AllowSearch*/ true, 2910 /*AllowExtraModuleMapSearch*/ true); 2911 if (M && M->Directory) { 2912 // If we're implicitly loading a module, the base directory can't 2913 // change between the build and use. 2914 // Don't emit module relocation error if we have -fno-validate-pch 2915 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 2916 DisableValidationForModuleKind::Module) && 2917 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2918 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2919 if (!BuildDir || *BuildDir != M->Directory) { 2920 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2921 Diag(diag::err_imported_module_relocated) 2922 << F.ModuleName << Blob << M->Directory->getName(); 2923 return OutOfDate; 2924 } 2925 } 2926 F.BaseDirectory = std::string(M->Directory->getName()); 2927 } else { 2928 F.BaseDirectory = std::string(Blob); 2929 } 2930 break; 2931 } 2932 2933 case MODULE_MAP_FILE: 2934 if (ASTReadResult Result = 2935 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2936 return Result; 2937 break; 2938 2939 case INPUT_FILE_OFFSETS: 2940 NumInputs = Record[0]; 2941 NumUserInputs = Record[1]; 2942 F.InputFileOffsets = 2943 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2944 F.InputFilesLoaded.resize(NumInputs); 2945 F.NumUserInputFiles = NumUserInputs; 2946 break; 2947 } 2948 } 2949 } 2950 2951 ASTReader::ASTReadResult 2952 ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 2953 BitstreamCursor &Stream = F.Stream; 2954 2955 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) { 2956 Error(std::move(Err)); 2957 return Failure; 2958 } 2959 F.ASTBlockStartOffset = Stream.GetCurrentBitNo(); 2960 2961 // Read all of the records and blocks for the AST file. 2962 RecordData Record; 2963 while (true) { 2964 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2965 if (!MaybeEntry) { 2966 Error(MaybeEntry.takeError()); 2967 return Failure; 2968 } 2969 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2970 2971 switch (Entry.Kind) { 2972 case llvm::BitstreamEntry::Error: 2973 Error("error at end of module block in AST file"); 2974 return Failure; 2975 case llvm::BitstreamEntry::EndBlock: 2976 // Outside of C++, we do not store a lookup map for the translation unit. 2977 // Instead, mark it as needing a lookup map to be built if this module 2978 // contains any declarations lexically within it (which it always does!). 2979 // This usually has no cost, since we very rarely need the lookup map for 2980 // the translation unit outside C++. 2981 if (ASTContext *Ctx = ContextObj) { 2982 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2983 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2984 DC->setMustBuildLookupTable(); 2985 } 2986 2987 return Success; 2988 case llvm::BitstreamEntry::SubBlock: 2989 switch (Entry.ID) { 2990 case DECLTYPES_BLOCK_ID: 2991 // We lazily load the decls block, but we want to set up the 2992 // DeclsCursor cursor to point into it. Clone our current bitcode 2993 // cursor to it, enter the block and read the abbrevs in that block. 2994 // With the main cursor, we just skip over it. 2995 F.DeclsCursor = Stream; 2996 if (llvm::Error Err = Stream.SkipBlock()) { 2997 Error(std::move(Err)); 2998 return Failure; 2999 } 3000 if (ReadBlockAbbrevs(F.DeclsCursor, DECLTYPES_BLOCK_ID, 3001 &F.DeclsBlockStartOffset)) { 3002 Error("malformed block record in AST file"); 3003 return Failure; 3004 } 3005 break; 3006 3007 case PREPROCESSOR_BLOCK_ID: 3008 F.MacroCursor = Stream; 3009 if (!PP.getExternalSource()) 3010 PP.setExternalSource(this); 3011 3012 if (llvm::Error Err = Stream.SkipBlock()) { 3013 Error(std::move(Err)); 3014 return Failure; 3015 } 3016 if (ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) { 3017 Error("malformed block record in AST file"); 3018 return Failure; 3019 } 3020 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 3021 break; 3022 3023 case PREPROCESSOR_DETAIL_BLOCK_ID: 3024 F.PreprocessorDetailCursor = Stream; 3025 3026 if (llvm::Error Err = Stream.SkipBlock()) { 3027 Error(std::move(Err)); 3028 return Failure; 3029 } 3030 if (ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3031 PREPROCESSOR_DETAIL_BLOCK_ID)) { 3032 Error("malformed preprocessor detail record in AST file"); 3033 return Failure; 3034 } 3035 F.PreprocessorDetailStartOffset 3036 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3037 3038 if (!PP.getPreprocessingRecord()) 3039 PP.createPreprocessingRecord(); 3040 if (!PP.getPreprocessingRecord()->getExternalSource()) 3041 PP.getPreprocessingRecord()->SetExternalSource(*this); 3042 break; 3043 3044 case SOURCE_MANAGER_BLOCK_ID: 3045 if (ReadSourceManagerBlock(F)) 3046 return Failure; 3047 break; 3048 3049 case SUBMODULE_BLOCK_ID: 3050 if (ASTReadResult Result = 3051 ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3052 return Result; 3053 break; 3054 3055 case COMMENTS_BLOCK_ID: { 3056 BitstreamCursor C = Stream; 3057 3058 if (llvm::Error Err = Stream.SkipBlock()) { 3059 Error(std::move(Err)); 3060 return Failure; 3061 } 3062 if (ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) { 3063 Error("malformed comments block in AST file"); 3064 return Failure; 3065 } 3066 CommentsCursors.push_back(std::make_pair(C, &F)); 3067 break; 3068 } 3069 3070 default: 3071 if (llvm::Error Err = Stream.SkipBlock()) { 3072 Error(std::move(Err)); 3073 return Failure; 3074 } 3075 break; 3076 } 3077 continue; 3078 3079 case llvm::BitstreamEntry::Record: 3080 // The interesting case. 3081 break; 3082 } 3083 3084 // Read and process a record. 3085 Record.clear(); 3086 StringRef Blob; 3087 Expected<unsigned> MaybeRecordType = 3088 Stream.readRecord(Entry.ID, Record, &Blob); 3089 if (!MaybeRecordType) { 3090 Error(MaybeRecordType.takeError()); 3091 return Failure; 3092 } 3093 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3094 3095 // If we're not loading an AST context, we don't care about most records. 3096 if (!ContextObj) { 3097 switch (RecordType) { 3098 case IDENTIFIER_TABLE: 3099 case IDENTIFIER_OFFSET: 3100 case INTERESTING_IDENTIFIERS: 3101 case STATISTICS: 3102 case PP_CONDITIONAL_STACK: 3103 case PP_COUNTER_VALUE: 3104 case SOURCE_LOCATION_OFFSETS: 3105 case MODULE_OFFSET_MAP: 3106 case SOURCE_MANAGER_LINE_TABLE: 3107 case SOURCE_LOCATION_PRELOADS: 3108 case PPD_ENTITIES_OFFSETS: 3109 case HEADER_SEARCH_TABLE: 3110 case IMPORTED_MODULES: 3111 case MACRO_OFFSET: 3112 break; 3113 default: 3114 continue; 3115 } 3116 } 3117 3118 switch (RecordType) { 3119 default: // Default behavior: ignore. 3120 break; 3121 3122 case TYPE_OFFSET: { 3123 if (F.LocalNumTypes != 0) { 3124 Error("duplicate TYPE_OFFSET record in AST file"); 3125 return Failure; 3126 } 3127 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data()); 3128 F.LocalNumTypes = Record[0]; 3129 unsigned LocalBaseTypeIndex = Record[1]; 3130 F.BaseTypeIndex = getTotalNumTypes(); 3131 3132 if (F.LocalNumTypes > 0) { 3133 // Introduce the global -> local mapping for types within this module. 3134 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3135 3136 // Introduce the local -> global mapping for types within this module. 3137 F.TypeRemap.insertOrReplace( 3138 std::make_pair(LocalBaseTypeIndex, 3139 F.BaseTypeIndex - LocalBaseTypeIndex)); 3140 3141 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3142 } 3143 break; 3144 } 3145 3146 case DECL_OFFSET: { 3147 if (F.LocalNumDecls != 0) { 3148 Error("duplicate DECL_OFFSET record in AST file"); 3149 return Failure; 3150 } 3151 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3152 F.LocalNumDecls = Record[0]; 3153 unsigned LocalBaseDeclID = Record[1]; 3154 F.BaseDeclID = getTotalNumDecls(); 3155 3156 if (F.LocalNumDecls > 0) { 3157 // Introduce the global -> local mapping for declarations within this 3158 // module. 3159 GlobalDeclMap.insert( 3160 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3161 3162 // Introduce the local -> global mapping for declarations within this 3163 // module. 3164 F.DeclRemap.insertOrReplace( 3165 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3166 3167 // Introduce the global -> local mapping for declarations within this 3168 // module. 3169 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3170 3171 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3172 } 3173 break; 3174 } 3175 3176 case TU_UPDATE_LEXICAL: { 3177 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3178 LexicalContents Contents( 3179 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3180 Blob.data()), 3181 static_cast<unsigned int>(Blob.size() / 4)); 3182 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3183 TU->setHasExternalLexicalStorage(true); 3184 break; 3185 } 3186 3187 case UPDATE_VISIBLE: { 3188 unsigned Idx = 0; 3189 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3190 auto *Data = (const unsigned char*)Blob.data(); 3191 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3192 // If we've already loaded the decl, perform the updates when we finish 3193 // loading this block. 3194 if (Decl *D = GetExistingDecl(ID)) 3195 PendingUpdateRecords.push_back( 3196 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3197 break; 3198 } 3199 3200 case IDENTIFIER_TABLE: 3201 F.IdentifierTableData = 3202 reinterpret_cast<const unsigned char *>(Blob.data()); 3203 if (Record[0]) { 3204 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3205 F.IdentifierTableData + Record[0], 3206 F.IdentifierTableData + sizeof(uint32_t), 3207 F.IdentifierTableData, 3208 ASTIdentifierLookupTrait(*this, F)); 3209 3210 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3211 } 3212 break; 3213 3214 case IDENTIFIER_OFFSET: { 3215 if (F.LocalNumIdentifiers != 0) { 3216 Error("duplicate IDENTIFIER_OFFSET record in AST file"); 3217 return Failure; 3218 } 3219 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3220 F.LocalNumIdentifiers = Record[0]; 3221 unsigned LocalBaseIdentifierID = Record[1]; 3222 F.BaseIdentifierID = getTotalNumIdentifiers(); 3223 3224 if (F.LocalNumIdentifiers > 0) { 3225 // Introduce the global -> local mapping for identifiers within this 3226 // module. 3227 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3228 &F)); 3229 3230 // Introduce the local -> global mapping for identifiers within this 3231 // module. 3232 F.IdentifierRemap.insertOrReplace( 3233 std::make_pair(LocalBaseIdentifierID, 3234 F.BaseIdentifierID - LocalBaseIdentifierID)); 3235 3236 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3237 + F.LocalNumIdentifiers); 3238 } 3239 break; 3240 } 3241 3242 case INTERESTING_IDENTIFIERS: 3243 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3244 break; 3245 3246 case EAGERLY_DESERIALIZED_DECLS: 3247 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3248 // about "interesting" decls (for instance, if we're building a module). 3249 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3250 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3251 break; 3252 3253 case MODULAR_CODEGEN_DECLS: 3254 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3255 // them (ie: if we're not codegenerating this module). 3256 if (F.Kind == MK_MainFile || 3257 getContext().getLangOpts().BuildingPCHWithObjectFile) 3258 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3259 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3260 break; 3261 3262 case SPECIAL_TYPES: 3263 if (SpecialTypes.empty()) { 3264 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3265 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3266 break; 3267 } 3268 3269 if (SpecialTypes.size() != Record.size()) { 3270 Error("invalid special-types record"); 3271 return Failure; 3272 } 3273 3274 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3275 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3276 if (!SpecialTypes[I]) 3277 SpecialTypes[I] = ID; 3278 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3279 // merge step? 3280 } 3281 break; 3282 3283 case STATISTICS: 3284 TotalNumStatements += Record[0]; 3285 TotalNumMacros += Record[1]; 3286 TotalLexicalDeclContexts += Record[2]; 3287 TotalVisibleDeclContexts += Record[3]; 3288 break; 3289 3290 case UNUSED_FILESCOPED_DECLS: 3291 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3292 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3293 break; 3294 3295 case DELEGATING_CTORS: 3296 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3297 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3298 break; 3299 3300 case WEAK_UNDECLARED_IDENTIFIERS: 3301 if (Record.size() % 4 != 0) { 3302 Error("invalid weak identifiers record"); 3303 return Failure; 3304 } 3305 3306 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3307 // files. This isn't the way to do it :) 3308 WeakUndeclaredIdentifiers.clear(); 3309 3310 // Translate the weak, undeclared identifiers into global IDs. 3311 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3312 WeakUndeclaredIdentifiers.push_back( 3313 getGlobalIdentifierID(F, Record[I++])); 3314 WeakUndeclaredIdentifiers.push_back( 3315 getGlobalIdentifierID(F, Record[I++])); 3316 WeakUndeclaredIdentifiers.push_back( 3317 ReadSourceLocation(F, Record, I).getRawEncoding()); 3318 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3319 } 3320 break; 3321 3322 case SELECTOR_OFFSETS: { 3323 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3324 F.LocalNumSelectors = Record[0]; 3325 unsigned LocalBaseSelectorID = Record[1]; 3326 F.BaseSelectorID = getTotalNumSelectors(); 3327 3328 if (F.LocalNumSelectors > 0) { 3329 // Introduce the global -> local mapping for selectors within this 3330 // module. 3331 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3332 3333 // Introduce the local -> global mapping for selectors within this 3334 // module. 3335 F.SelectorRemap.insertOrReplace( 3336 std::make_pair(LocalBaseSelectorID, 3337 F.BaseSelectorID - LocalBaseSelectorID)); 3338 3339 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3340 } 3341 break; 3342 } 3343 3344 case METHOD_POOL: 3345 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3346 if (Record[0]) 3347 F.SelectorLookupTable 3348 = ASTSelectorLookupTable::Create( 3349 F.SelectorLookupTableData + Record[0], 3350 F.SelectorLookupTableData, 3351 ASTSelectorLookupTrait(*this, F)); 3352 TotalNumMethodPoolEntries += Record[1]; 3353 break; 3354 3355 case REFERENCED_SELECTOR_POOL: 3356 if (!Record.empty()) { 3357 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3358 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3359 Record[Idx++])); 3360 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3361 getRawEncoding()); 3362 } 3363 } 3364 break; 3365 3366 case PP_CONDITIONAL_STACK: 3367 if (!Record.empty()) { 3368 unsigned Idx = 0, End = Record.size() - 1; 3369 bool ReachedEOFWhileSkipping = Record[Idx++]; 3370 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3371 if (ReachedEOFWhileSkipping) { 3372 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3373 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3374 bool FoundNonSkipPortion = Record[Idx++]; 3375 bool FoundElse = Record[Idx++]; 3376 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3377 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3378 FoundElse, ElseLoc); 3379 } 3380 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3381 while (Idx < End) { 3382 auto Loc = ReadSourceLocation(F, Record, Idx); 3383 bool WasSkipping = Record[Idx++]; 3384 bool FoundNonSkip = Record[Idx++]; 3385 bool FoundElse = Record[Idx++]; 3386 ConditionalStack.push_back( 3387 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3388 } 3389 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3390 } 3391 break; 3392 3393 case PP_COUNTER_VALUE: 3394 if (!Record.empty() && Listener) 3395 Listener->ReadCounter(F, Record[0]); 3396 break; 3397 3398 case FILE_SORTED_DECLS: 3399 F.FileSortedDecls = (const DeclID *)Blob.data(); 3400 F.NumFileSortedDecls = Record[0]; 3401 break; 3402 3403 case SOURCE_LOCATION_OFFSETS: { 3404 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3405 F.LocalNumSLocEntries = Record[0]; 3406 unsigned SLocSpaceSize = Record[1]; 3407 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset; 3408 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3409 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3410 SLocSpaceSize); 3411 if (!F.SLocEntryBaseID) { 3412 Error("ran out of source locations"); 3413 break; 3414 } 3415 // Make our entry in the range map. BaseID is negative and growing, so 3416 // we invert it. Because we invert it, though, we need the other end of 3417 // the range. 3418 unsigned RangeStart = 3419 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3420 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3421 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3422 3423 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3424 assert((F.SLocEntryBaseOffset & (1U << 31U)) == 0); 3425 GlobalSLocOffsetMap.insert( 3426 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3427 - SLocSpaceSize,&F)); 3428 3429 // Initialize the remapping table. 3430 // Invalid stays invalid. 3431 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3432 // This module. Base was 2 when being compiled. 3433 F.SLocRemap.insertOrReplace(std::make_pair(2U, 3434 static_cast<int>(F.SLocEntryBaseOffset - 2))); 3435 3436 TotalNumSLocEntries += F.LocalNumSLocEntries; 3437 break; 3438 } 3439 3440 case MODULE_OFFSET_MAP: 3441 F.ModuleOffsetMap = Blob; 3442 break; 3443 3444 case SOURCE_MANAGER_LINE_TABLE: 3445 if (ParseLineTable(F, Record)) { 3446 Error("malformed SOURCE_MANAGER_LINE_TABLE in AST file"); 3447 return Failure; 3448 } 3449 break; 3450 3451 case SOURCE_LOCATION_PRELOADS: { 3452 // Need to transform from the local view (1-based IDs) to the global view, 3453 // which is based off F.SLocEntryBaseID. 3454 if (!F.PreloadSLocEntries.empty()) { 3455 Error("Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3456 return Failure; 3457 } 3458 3459 F.PreloadSLocEntries.swap(Record); 3460 break; 3461 } 3462 3463 case EXT_VECTOR_DECLS: 3464 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3465 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3466 break; 3467 3468 case VTABLE_USES: 3469 if (Record.size() % 3 != 0) { 3470 Error("Invalid VTABLE_USES record"); 3471 return Failure; 3472 } 3473 3474 // Later tables overwrite earlier ones. 3475 // FIXME: Modules will have some trouble with this. This is clearly not 3476 // the right way to do this. 3477 VTableUses.clear(); 3478 3479 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3480 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3481 VTableUses.push_back( 3482 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3483 VTableUses.push_back(Record[Idx++]); 3484 } 3485 break; 3486 3487 case PENDING_IMPLICIT_INSTANTIATIONS: 3488 if (PendingInstantiations.size() % 2 != 0) { 3489 Error("Invalid existing PendingInstantiations"); 3490 return Failure; 3491 } 3492 3493 if (Record.size() % 2 != 0) { 3494 Error("Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3495 return Failure; 3496 } 3497 3498 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3499 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3500 PendingInstantiations.push_back( 3501 ReadSourceLocation(F, Record, I).getRawEncoding()); 3502 } 3503 break; 3504 3505 case SEMA_DECL_REFS: 3506 if (Record.size() != 3) { 3507 Error("Invalid SEMA_DECL_REFS block"); 3508 return Failure; 3509 } 3510 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3511 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3512 break; 3513 3514 case PPD_ENTITIES_OFFSETS: { 3515 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3516 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3517 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3518 3519 unsigned LocalBasePreprocessedEntityID = Record[0]; 3520 3521 unsigned StartingID; 3522 if (!PP.getPreprocessingRecord()) 3523 PP.createPreprocessingRecord(); 3524 if (!PP.getPreprocessingRecord()->getExternalSource()) 3525 PP.getPreprocessingRecord()->SetExternalSource(*this); 3526 StartingID 3527 = PP.getPreprocessingRecord() 3528 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3529 F.BasePreprocessedEntityID = StartingID; 3530 3531 if (F.NumPreprocessedEntities > 0) { 3532 // Introduce the global -> local mapping for preprocessed entities in 3533 // this module. 3534 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3535 3536 // Introduce the local -> global mapping for preprocessed entities in 3537 // this module. 3538 F.PreprocessedEntityRemap.insertOrReplace( 3539 std::make_pair(LocalBasePreprocessedEntityID, 3540 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3541 } 3542 3543 break; 3544 } 3545 3546 case PPD_SKIPPED_RANGES: { 3547 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3548 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3549 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3550 3551 if (!PP.getPreprocessingRecord()) 3552 PP.createPreprocessingRecord(); 3553 if (!PP.getPreprocessingRecord()->getExternalSource()) 3554 PP.getPreprocessingRecord()->SetExternalSource(*this); 3555 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3556 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3557 3558 if (F.NumPreprocessedSkippedRanges > 0) 3559 GlobalSkippedRangeMap.insert( 3560 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3561 break; 3562 } 3563 3564 case DECL_UPDATE_OFFSETS: 3565 if (Record.size() % 2 != 0) { 3566 Error("invalid DECL_UPDATE_OFFSETS block in AST file"); 3567 return Failure; 3568 } 3569 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3570 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3571 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3572 3573 // If we've already loaded the decl, perform the updates when we finish 3574 // loading this block. 3575 if (Decl *D = GetExistingDecl(ID)) 3576 PendingUpdateRecords.push_back( 3577 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3578 } 3579 break; 3580 3581 case OBJC_CATEGORIES_MAP: 3582 if (F.LocalNumObjCCategoriesInMap != 0) { 3583 Error("duplicate OBJC_CATEGORIES_MAP record in AST file"); 3584 return Failure; 3585 } 3586 3587 F.LocalNumObjCCategoriesInMap = Record[0]; 3588 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3589 break; 3590 3591 case OBJC_CATEGORIES: 3592 F.ObjCCategories.swap(Record); 3593 break; 3594 3595 case CUDA_SPECIAL_DECL_REFS: 3596 // Later tables overwrite earlier ones. 3597 // FIXME: Modules will have trouble with this. 3598 CUDASpecialDeclRefs.clear(); 3599 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3600 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3601 break; 3602 3603 case HEADER_SEARCH_TABLE: 3604 F.HeaderFileInfoTableData = Blob.data(); 3605 F.LocalNumHeaderFileInfos = Record[1]; 3606 if (Record[0]) { 3607 F.HeaderFileInfoTable 3608 = HeaderFileInfoLookupTable::Create( 3609 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3610 (const unsigned char *)F.HeaderFileInfoTableData, 3611 HeaderFileInfoTrait(*this, F, 3612 &PP.getHeaderSearchInfo(), 3613 Blob.data() + Record[2])); 3614 3615 PP.getHeaderSearchInfo().SetExternalSource(this); 3616 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3617 PP.getHeaderSearchInfo().SetExternalLookup(this); 3618 } 3619 break; 3620 3621 case FP_PRAGMA_OPTIONS: 3622 // Later tables overwrite earlier ones. 3623 FPPragmaOptions.swap(Record); 3624 break; 3625 3626 case OPENCL_EXTENSIONS: 3627 for (unsigned I = 0, E = Record.size(); I != E; ) { 3628 auto Name = ReadString(Record, I); 3629 auto &OptInfo = OpenCLExtensions.OptMap[Name]; 3630 OptInfo.Supported = Record[I++] != 0; 3631 OptInfo.Enabled = Record[I++] != 0; 3632 OptInfo.Avail = Record[I++]; 3633 OptInfo.Core = Record[I++]; 3634 OptInfo.Opt = Record[I++]; 3635 } 3636 break; 3637 3638 case OPENCL_EXTENSION_TYPES: 3639 for (unsigned I = 0, E = Record.size(); I != E;) { 3640 auto TypeID = static_cast<::TypeID>(Record[I++]); 3641 auto *Type = GetType(TypeID).getTypePtr(); 3642 auto NumExt = static_cast<unsigned>(Record[I++]); 3643 for (unsigned II = 0; II != NumExt; ++II) { 3644 auto Ext = ReadString(Record, I); 3645 OpenCLTypeExtMap[Type].insert(Ext); 3646 } 3647 } 3648 break; 3649 3650 case OPENCL_EXTENSION_DECLS: 3651 for (unsigned I = 0, E = Record.size(); I != E;) { 3652 auto DeclID = static_cast<::DeclID>(Record[I++]); 3653 auto *Decl = GetDecl(DeclID); 3654 auto NumExt = static_cast<unsigned>(Record[I++]); 3655 for (unsigned II = 0; II != NumExt; ++II) { 3656 auto Ext = ReadString(Record, I); 3657 OpenCLDeclExtMap[Decl].insert(Ext); 3658 } 3659 } 3660 break; 3661 3662 case TENTATIVE_DEFINITIONS: 3663 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3664 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3665 break; 3666 3667 case KNOWN_NAMESPACES: 3668 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3669 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3670 break; 3671 3672 case UNDEFINED_BUT_USED: 3673 if (UndefinedButUsed.size() % 2 != 0) { 3674 Error("Invalid existing UndefinedButUsed"); 3675 return Failure; 3676 } 3677 3678 if (Record.size() % 2 != 0) { 3679 Error("invalid undefined-but-used record"); 3680 return Failure; 3681 } 3682 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3683 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3684 UndefinedButUsed.push_back( 3685 ReadSourceLocation(F, Record, I).getRawEncoding()); 3686 } 3687 break; 3688 3689 case DELETE_EXPRS_TO_ANALYZE: 3690 for (unsigned I = 0, N = Record.size(); I != N;) { 3691 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3692 const uint64_t Count = Record[I++]; 3693 DelayedDeleteExprs.push_back(Count); 3694 for (uint64_t C = 0; C < Count; ++C) { 3695 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3696 bool IsArrayForm = Record[I++] == 1; 3697 DelayedDeleteExprs.push_back(IsArrayForm); 3698 } 3699 } 3700 break; 3701 3702 case IMPORTED_MODULES: 3703 if (!F.isModule()) { 3704 // If we aren't loading a module (which has its own exports), make 3705 // all of the imported modules visible. 3706 // FIXME: Deal with macros-only imports. 3707 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3708 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3709 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3710 if (GlobalID) { 3711 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3712 if (DeserializationListener) 3713 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3714 } 3715 } 3716 } 3717 break; 3718 3719 case MACRO_OFFSET: { 3720 if (F.LocalNumMacros != 0) { 3721 Error("duplicate MACRO_OFFSET record in AST file"); 3722 return Failure; 3723 } 3724 F.MacroOffsets = (const uint32_t *)Blob.data(); 3725 F.LocalNumMacros = Record[0]; 3726 unsigned LocalBaseMacroID = Record[1]; 3727 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset; 3728 F.BaseMacroID = getTotalNumMacros(); 3729 3730 if (F.LocalNumMacros > 0) { 3731 // Introduce the global -> local mapping for macros within this module. 3732 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3733 3734 // Introduce the local -> global mapping for macros within this module. 3735 F.MacroRemap.insertOrReplace( 3736 std::make_pair(LocalBaseMacroID, 3737 F.BaseMacroID - LocalBaseMacroID)); 3738 3739 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3740 } 3741 break; 3742 } 3743 3744 case LATE_PARSED_TEMPLATE: 3745 LateParsedTemplates.emplace_back( 3746 std::piecewise_construct, std::forward_as_tuple(&F), 3747 std::forward_as_tuple(Record.begin(), Record.end())); 3748 break; 3749 3750 case OPTIMIZE_PRAGMA_OPTIONS: 3751 if (Record.size() != 1) { 3752 Error("invalid pragma optimize record"); 3753 return Failure; 3754 } 3755 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3756 break; 3757 3758 case MSSTRUCT_PRAGMA_OPTIONS: 3759 if (Record.size() != 1) { 3760 Error("invalid pragma ms_struct record"); 3761 return Failure; 3762 } 3763 PragmaMSStructState = Record[0]; 3764 break; 3765 3766 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3767 if (Record.size() != 2) { 3768 Error("invalid pragma ms_struct record"); 3769 return Failure; 3770 } 3771 PragmaMSPointersToMembersState = Record[0]; 3772 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3773 break; 3774 3775 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3776 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3777 UnusedLocalTypedefNameCandidates.push_back( 3778 getGlobalDeclID(F, Record[I])); 3779 break; 3780 3781 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3782 if (Record.size() != 1) { 3783 Error("invalid cuda pragma options record"); 3784 return Failure; 3785 } 3786 ForceCUDAHostDeviceDepth = Record[0]; 3787 break; 3788 3789 case ALIGN_PACK_PRAGMA_OPTIONS: { 3790 if (Record.size() < 3) { 3791 Error("invalid pragma pack record"); 3792 return Failure; 3793 } 3794 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]); 3795 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3796 unsigned NumStackEntries = Record[2]; 3797 unsigned Idx = 3; 3798 // Reset the stack when importing a new module. 3799 PragmaAlignPackStack.clear(); 3800 for (unsigned I = 0; I < NumStackEntries; ++I) { 3801 PragmaAlignPackStackEntry Entry; 3802 Entry.Value = ReadAlignPackInfo(Record[Idx++]); 3803 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3804 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3805 PragmaAlignPackStrings.push_back(ReadString(Record, Idx)); 3806 Entry.SlotLabel = PragmaAlignPackStrings.back(); 3807 PragmaAlignPackStack.push_back(Entry); 3808 } 3809 break; 3810 } 3811 3812 case FLOAT_CONTROL_PRAGMA_OPTIONS: { 3813 if (Record.size() < 3) { 3814 Error("invalid pragma pack record"); 3815 return Failure; 3816 } 3817 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]); 3818 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3819 unsigned NumStackEntries = Record[2]; 3820 unsigned Idx = 3; 3821 // Reset the stack when importing a new module. 3822 FpPragmaStack.clear(); 3823 for (unsigned I = 0; I < NumStackEntries; ++I) { 3824 FpPragmaStackEntry Entry; 3825 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]); 3826 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3827 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3828 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3829 Entry.SlotLabel = FpPragmaStrings.back(); 3830 FpPragmaStack.push_back(Entry); 3831 } 3832 break; 3833 } 3834 3835 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3836 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3837 DeclsToCheckForDeferredDiags.push_back(getGlobalDeclID(F, Record[I])); 3838 break; 3839 } 3840 } 3841 } 3842 3843 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3844 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3845 3846 // Additional remapping information. 3847 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3848 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3849 F.ModuleOffsetMap = StringRef(); 3850 3851 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3852 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3853 F.SLocRemap.insert(std::make_pair(0U, 0)); 3854 F.SLocRemap.insert(std::make_pair(2U, 1)); 3855 } 3856 3857 // Continuous range maps we may be updating in our module. 3858 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3859 RemapBuilder SLocRemap(F.SLocRemap); 3860 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3861 RemapBuilder MacroRemap(F.MacroRemap); 3862 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3863 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3864 RemapBuilder SelectorRemap(F.SelectorRemap); 3865 RemapBuilder DeclRemap(F.DeclRemap); 3866 RemapBuilder TypeRemap(F.TypeRemap); 3867 3868 while (Data < DataEnd) { 3869 // FIXME: Looking up dependency modules by filename is horrible. Let's 3870 // start fixing this with prebuilt, explicit and implicit modules and see 3871 // how it goes... 3872 using namespace llvm::support; 3873 ModuleKind Kind = static_cast<ModuleKind>( 3874 endian::readNext<uint8_t, little, unaligned>(Data)); 3875 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3876 StringRef Name = StringRef((const char*)Data, Len); 3877 Data += Len; 3878 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule || 3879 Kind == MK_ImplicitModule 3880 ? ModuleMgr.lookupByModuleName(Name) 3881 : ModuleMgr.lookupByFileName(Name)); 3882 if (!OM) { 3883 std::string Msg = 3884 "SourceLocation remap refers to unknown module, cannot find "; 3885 Msg.append(std::string(Name)); 3886 Error(Msg); 3887 return; 3888 } 3889 3890 uint32_t SLocOffset = 3891 endian::readNext<uint32_t, little, unaligned>(Data); 3892 uint32_t IdentifierIDOffset = 3893 endian::readNext<uint32_t, little, unaligned>(Data); 3894 uint32_t MacroIDOffset = 3895 endian::readNext<uint32_t, little, unaligned>(Data); 3896 uint32_t PreprocessedEntityIDOffset = 3897 endian::readNext<uint32_t, little, unaligned>(Data); 3898 uint32_t SubmoduleIDOffset = 3899 endian::readNext<uint32_t, little, unaligned>(Data); 3900 uint32_t SelectorIDOffset = 3901 endian::readNext<uint32_t, little, unaligned>(Data); 3902 uint32_t DeclIDOffset = 3903 endian::readNext<uint32_t, little, unaligned>(Data); 3904 uint32_t TypeIndexOffset = 3905 endian::readNext<uint32_t, little, unaligned>(Data); 3906 3907 uint32_t None = std::numeric_limits<uint32_t>::max(); 3908 3909 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3910 RemapBuilder &Remap) { 3911 if (Offset != None) 3912 Remap.insert(std::make_pair(Offset, 3913 static_cast<int>(BaseOffset - Offset))); 3914 }; 3915 mapOffset(SLocOffset, OM->SLocEntryBaseOffset, SLocRemap); 3916 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3917 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3918 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3919 PreprocessedEntityRemap); 3920 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3921 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3922 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3923 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3924 3925 // Global -> local mappings. 3926 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3927 } 3928 } 3929 3930 ASTReader::ASTReadResult 3931 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3932 const ModuleFile *ImportedBy, 3933 unsigned ClientLoadCapabilities) { 3934 unsigned Idx = 0; 3935 F.ModuleMapPath = ReadPath(F, Record, Idx); 3936 3937 // Try to resolve ModuleName in the current header search context and 3938 // verify that it is found in the same module map file as we saved. If the 3939 // top-level AST file is a main file, skip this check because there is no 3940 // usable header search context. 3941 assert(!F.ModuleName.empty() && 3942 "MODULE_NAME should come before MODULE_MAP_FILE"); 3943 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3944 // An implicitly-loaded module file should have its module listed in some 3945 // module map file that we've already loaded. 3946 Module *M = PP.getHeaderSearchInfo().lookupModule(F.ModuleName); 3947 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3948 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3949 // Don't emit module relocation error if we have -fno-validate-pch 3950 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 3951 DisableValidationForModuleKind::Module) && 3952 !ModMap) { 3953 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) { 3954 if (auto ASTFE = M ? M->getASTFile() : None) { 3955 // This module was defined by an imported (explicit) module. 3956 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3957 << ASTFE->getName(); 3958 } else { 3959 // This module was built with a different module map. 3960 Diag(diag::err_imported_module_not_found) 3961 << F.ModuleName << F.FileName 3962 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3963 << !ImportedBy; 3964 // In case it was imported by a PCH, there's a chance the user is 3965 // just missing to include the search path to the directory containing 3966 // the modulemap. 3967 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3968 Diag(diag::note_imported_by_pch_module_not_found) 3969 << llvm::sys::path::parent_path(F.ModuleMapPath); 3970 } 3971 } 3972 return OutOfDate; 3973 } 3974 3975 assert(M && M->Name == F.ModuleName && "found module with different name"); 3976 3977 // Check the primary module map file. 3978 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3979 if (!StoredModMap || *StoredModMap != ModMap) { 3980 assert(ModMap && "found module is missing module map file"); 3981 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3982 "top-level import should be verified"); 3983 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3984 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3985 Diag(diag::err_imported_module_modmap_changed) 3986 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3987 << ModMap->getName() << F.ModuleMapPath << NotImported; 3988 return OutOfDate; 3989 } 3990 3991 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3992 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3993 // FIXME: we should use input files rather than storing names. 3994 std::string Filename = ReadPath(F, Record, Idx); 3995 auto F = FileMgr.getFile(Filename, false, false); 3996 if (!F) { 3997 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 3998 Error("could not find file '" + Filename +"' referenced by AST file"); 3999 return OutOfDate; 4000 } 4001 AdditionalStoredMaps.insert(*F); 4002 } 4003 4004 // Check any additional module map files (e.g. module.private.modulemap) 4005 // that are not in the pcm. 4006 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 4007 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 4008 // Remove files that match 4009 // Note: SmallPtrSet::erase is really remove 4010 if (!AdditionalStoredMaps.erase(ModMap)) { 4011 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4012 Diag(diag::err_module_different_modmap) 4013 << F.ModuleName << /*new*/0 << ModMap->getName(); 4014 return OutOfDate; 4015 } 4016 } 4017 } 4018 4019 // Check any additional module map files that are in the pcm, but not 4020 // found in header search. Cases that match are already removed. 4021 for (const FileEntry *ModMap : AdditionalStoredMaps) { 4022 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 4023 Diag(diag::err_module_different_modmap) 4024 << F.ModuleName << /*not new*/1 << ModMap->getName(); 4025 return OutOfDate; 4026 } 4027 } 4028 4029 if (Listener) 4030 Listener->ReadModuleMapFile(F.ModuleMapPath); 4031 return Success; 4032 } 4033 4034 /// Move the given method to the back of the global list of methods. 4035 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4036 // Find the entry for this selector in the method pool. 4037 Sema::GlobalMethodPool::iterator Known 4038 = S.MethodPool.find(Method->getSelector()); 4039 if (Known == S.MethodPool.end()) 4040 return; 4041 4042 // Retrieve the appropriate method list. 4043 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4044 : Known->second.second; 4045 bool Found = false; 4046 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4047 if (!Found) { 4048 if (List->getMethod() == Method) { 4049 Found = true; 4050 } else { 4051 // Keep searching. 4052 continue; 4053 } 4054 } 4055 4056 if (List->getNext()) 4057 List->setMethod(List->getNext()->getMethod()); 4058 else 4059 List->setMethod(Method); 4060 } 4061 } 4062 4063 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4064 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4065 for (Decl *D : Names) { 4066 bool wasHidden = !D->isUnconditionallyVisible(); 4067 D->setVisibleDespiteOwningModule(); 4068 4069 if (wasHidden && SemaObj) { 4070 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4071 moveMethodToBackOfGlobalList(*SemaObj, Method); 4072 } 4073 } 4074 } 4075 } 4076 4077 void ASTReader::makeModuleVisible(Module *Mod, 4078 Module::NameVisibilityKind NameVisibility, 4079 SourceLocation ImportLoc) { 4080 llvm::SmallPtrSet<Module *, 4> Visited; 4081 SmallVector<Module *, 4> Stack; 4082 Stack.push_back(Mod); 4083 while (!Stack.empty()) { 4084 Mod = Stack.pop_back_val(); 4085 4086 if (NameVisibility <= Mod->NameVisibility) { 4087 // This module already has this level of visibility (or greater), so 4088 // there is nothing more to do. 4089 continue; 4090 } 4091 4092 if (Mod->isUnimportable()) { 4093 // Modules that aren't importable cannot be made visible. 4094 continue; 4095 } 4096 4097 // Update the module's name visibility. 4098 Mod->NameVisibility = NameVisibility; 4099 4100 // If we've already deserialized any names from this module, 4101 // mark them as visible. 4102 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4103 if (Hidden != HiddenNamesMap.end()) { 4104 auto HiddenNames = std::move(*Hidden); 4105 HiddenNamesMap.erase(Hidden); 4106 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4107 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4108 "making names visible added hidden names"); 4109 } 4110 4111 // Push any exported modules onto the stack to be marked as visible. 4112 SmallVector<Module *, 16> Exports; 4113 Mod->getExportedModules(Exports); 4114 for (SmallVectorImpl<Module *>::iterator 4115 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4116 Module *Exported = *I; 4117 if (Visited.insert(Exported).second) 4118 Stack.push_back(Exported); 4119 } 4120 } 4121 } 4122 4123 /// We've merged the definition \p MergedDef into the existing definition 4124 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4125 /// visible. 4126 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4127 NamedDecl *MergedDef) { 4128 if (!Def->isUnconditionallyVisible()) { 4129 // If MergedDef is visible or becomes visible, make the definition visible. 4130 if (MergedDef->isUnconditionallyVisible()) 4131 Def->setVisibleDespiteOwningModule(); 4132 else { 4133 getContext().mergeDefinitionIntoModule( 4134 Def, MergedDef->getImportedOwningModule(), 4135 /*NotifyListeners*/ false); 4136 PendingMergedDefinitionsToDeduplicate.insert(Def); 4137 } 4138 } 4139 } 4140 4141 bool ASTReader::loadGlobalIndex() { 4142 if (GlobalIndex) 4143 return false; 4144 4145 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4146 !PP.getLangOpts().Modules) 4147 return true; 4148 4149 // Try to load the global index. 4150 TriedLoadingGlobalIndex = true; 4151 StringRef ModuleCachePath 4152 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4153 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4154 GlobalModuleIndex::readIndex(ModuleCachePath); 4155 if (llvm::Error Err = std::move(Result.second)) { 4156 assert(!Result.first); 4157 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4158 return true; 4159 } 4160 4161 GlobalIndex.reset(Result.first); 4162 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4163 return false; 4164 } 4165 4166 bool ASTReader::isGlobalIndexUnavailable() const { 4167 return PP.getLangOpts().Modules && UseGlobalIndex && 4168 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4169 } 4170 4171 static void updateModuleTimestamp(ModuleFile &MF) { 4172 // Overwrite the timestamp file contents so that file's mtime changes. 4173 std::string TimestampFilename = MF.getTimestampFilename(); 4174 std::error_code EC; 4175 llvm::raw_fd_ostream OS(TimestampFilename, EC, llvm::sys::fs::OF_Text); 4176 if (EC) 4177 return; 4178 OS << "Timestamp file\n"; 4179 OS.close(); 4180 OS.clear_error(); // Avoid triggering a fatal error. 4181 } 4182 4183 /// Given a cursor at the start of an AST file, scan ahead and drop the 4184 /// cursor into the start of the given block ID, returning false on success and 4185 /// true on failure. 4186 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4187 while (true) { 4188 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4189 if (!MaybeEntry) { 4190 // FIXME this drops errors on the floor. 4191 consumeError(MaybeEntry.takeError()); 4192 return true; 4193 } 4194 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4195 4196 switch (Entry.Kind) { 4197 case llvm::BitstreamEntry::Error: 4198 case llvm::BitstreamEntry::EndBlock: 4199 return true; 4200 4201 case llvm::BitstreamEntry::Record: 4202 // Ignore top-level records. 4203 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4204 break; 4205 else { 4206 // FIXME this drops errors on the floor. 4207 consumeError(Skipped.takeError()); 4208 return true; 4209 } 4210 4211 case llvm::BitstreamEntry::SubBlock: 4212 if (Entry.ID == BlockID) { 4213 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4214 // FIXME this drops the error on the floor. 4215 consumeError(std::move(Err)); 4216 return true; 4217 } 4218 // Found it! 4219 return false; 4220 } 4221 4222 if (llvm::Error Err = Cursor.SkipBlock()) { 4223 // FIXME this drops the error on the floor. 4224 consumeError(std::move(Err)); 4225 return true; 4226 } 4227 } 4228 } 4229 } 4230 4231 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4232 ModuleKind Type, 4233 SourceLocation ImportLoc, 4234 unsigned ClientLoadCapabilities, 4235 SmallVectorImpl<ImportedSubmodule> *Imported) { 4236 llvm::SaveAndRestore<SourceLocation> 4237 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4238 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII( 4239 CurrentDeserializingModuleKind, Type); 4240 4241 // Defer any pending actions until we get to the end of reading the AST file. 4242 Deserializing AnASTFile(this); 4243 4244 // Bump the generation number. 4245 unsigned PreviousGeneration = 0; 4246 if (ContextObj) 4247 PreviousGeneration = incrementGeneration(*ContextObj); 4248 4249 unsigned NumModules = ModuleMgr.size(); 4250 auto removeModulesAndReturn = [&](ASTReadResult ReadResult) { 4251 assert(ReadResult && "expected to return error"); 4252 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4253 PP.getLangOpts().Modules 4254 ? &PP.getHeaderSearchInfo().getModuleMap() 4255 : nullptr); 4256 4257 // If we find that any modules are unusable, the global index is going 4258 // to be out-of-date. Just remove it. 4259 GlobalIndex.reset(); 4260 ModuleMgr.setGlobalIndex(nullptr); 4261 return ReadResult; 4262 }; 4263 4264 SmallVector<ImportedModule, 4> Loaded; 4265 switch (ASTReadResult ReadResult = 4266 ReadASTCore(FileName, Type, ImportLoc, 4267 /*ImportedBy=*/nullptr, Loaded, 0, 0, 4268 ASTFileSignature(), ClientLoadCapabilities)) { 4269 case Failure: 4270 case Missing: 4271 case OutOfDate: 4272 case VersionMismatch: 4273 case ConfigurationMismatch: 4274 case HadErrors: 4275 return removeModulesAndReturn(ReadResult); 4276 case Success: 4277 break; 4278 } 4279 4280 // Here comes stuff that we only do once the entire chain is loaded. 4281 4282 // Load the AST blocks of all of the modules that we loaded. We can still 4283 // hit errors parsing the ASTs at this point. 4284 for (ImportedModule &M : Loaded) { 4285 ModuleFile &F = *M.Mod; 4286 4287 // Read the AST block. 4288 if (ASTReadResult Result = ReadASTBlock(F, ClientLoadCapabilities)) 4289 return removeModulesAndReturn(Result); 4290 4291 // The AST block should always have a definition for the main module. 4292 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4293 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4294 return removeModulesAndReturn(Failure); 4295 } 4296 4297 // Read the extension blocks. 4298 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4299 if (ASTReadResult Result = ReadExtensionBlock(F)) 4300 return removeModulesAndReturn(Result); 4301 } 4302 4303 // Once read, set the ModuleFile bit base offset and update the size in 4304 // bits of all files we've seen. 4305 F.GlobalBitOffset = TotalModulesSizeInBits; 4306 TotalModulesSizeInBits += F.SizeInBits; 4307 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4308 } 4309 4310 // Preload source locations and interesting indentifiers. 4311 for (ImportedModule &M : Loaded) { 4312 ModuleFile &F = *M.Mod; 4313 4314 // Preload SLocEntries. 4315 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4316 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4317 // Load it through the SourceManager and don't call ReadSLocEntry() 4318 // directly because the entry may have already been loaded in which case 4319 // calling ReadSLocEntry() directly would trigger an assertion in 4320 // SourceManager. 4321 SourceMgr.getLoadedSLocEntryByID(Index); 4322 } 4323 4324 // Map the original source file ID into the ID space of the current 4325 // compilation. 4326 if (F.OriginalSourceFileID.isValid()) { 4327 F.OriginalSourceFileID = FileID::get( 4328 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4329 } 4330 4331 // Preload all the pending interesting identifiers by marking them out of 4332 // date. 4333 for (auto Offset : F.PreloadIdentifierOffsets) { 4334 const unsigned char *Data = F.IdentifierTableData + Offset; 4335 4336 ASTIdentifierLookupTrait Trait(*this, F); 4337 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4338 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4339 auto &II = PP.getIdentifierTable().getOwn(Key); 4340 II.setOutOfDate(true); 4341 4342 // Mark this identifier as being from an AST file so that we can track 4343 // whether we need to serialize it. 4344 markIdentifierFromAST(*this, II); 4345 4346 // Associate the ID with the identifier so that the writer can reuse it. 4347 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4348 SetIdentifierInfo(ID, &II); 4349 } 4350 } 4351 4352 // Setup the import locations and notify the module manager that we've 4353 // committed to these module files. 4354 for (ImportedModule &M : Loaded) { 4355 ModuleFile &F = *M.Mod; 4356 4357 ModuleMgr.moduleFileAccepted(&F); 4358 4359 // Set the import location. 4360 F.DirectImportLoc = ImportLoc; 4361 // FIXME: We assume that locations from PCH / preamble do not need 4362 // any translation. 4363 if (!M.ImportedBy) 4364 F.ImportLoc = M.ImportLoc; 4365 else 4366 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4367 } 4368 4369 if (!PP.getLangOpts().CPlusPlus || 4370 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4371 Type != MK_PrebuiltModule)) { 4372 // Mark all of the identifiers in the identifier table as being out of date, 4373 // so that various accessors know to check the loaded modules when the 4374 // identifier is used. 4375 // 4376 // For C++ modules, we don't need information on many identifiers (just 4377 // those that provide macros or are poisoned), so we mark all of 4378 // the interesting ones via PreloadIdentifierOffsets. 4379 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4380 IdEnd = PP.getIdentifierTable().end(); 4381 Id != IdEnd; ++Id) 4382 Id->second->setOutOfDate(true); 4383 } 4384 // Mark selectors as out of date. 4385 for (auto Sel : SelectorGeneration) 4386 SelectorOutOfDate[Sel.first] = true; 4387 4388 // Resolve any unresolved module exports. 4389 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4390 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4391 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4392 Module *ResolvedMod = getSubmodule(GlobalID); 4393 4394 switch (Unresolved.Kind) { 4395 case UnresolvedModuleRef::Conflict: 4396 if (ResolvedMod) { 4397 Module::Conflict Conflict; 4398 Conflict.Other = ResolvedMod; 4399 Conflict.Message = Unresolved.String.str(); 4400 Unresolved.Mod->Conflicts.push_back(Conflict); 4401 } 4402 continue; 4403 4404 case UnresolvedModuleRef::Import: 4405 if (ResolvedMod) 4406 Unresolved.Mod->Imports.insert(ResolvedMod); 4407 continue; 4408 4409 case UnresolvedModuleRef::Export: 4410 if (ResolvedMod || Unresolved.IsWildcard) 4411 Unresolved.Mod->Exports.push_back( 4412 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4413 continue; 4414 } 4415 } 4416 UnresolvedModuleRefs.clear(); 4417 4418 if (Imported) 4419 Imported->append(ImportedModules.begin(), 4420 ImportedModules.end()); 4421 4422 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4423 // Might be unnecessary as use declarations are only used to build the 4424 // module itself. 4425 4426 if (ContextObj) 4427 InitializeContext(); 4428 4429 if (SemaObj) 4430 UpdateSema(); 4431 4432 if (DeserializationListener) 4433 DeserializationListener->ReaderInitialized(this); 4434 4435 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4436 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4437 // If this AST file is a precompiled preamble, then set the 4438 // preamble file ID of the source manager to the file source file 4439 // from which the preamble was built. 4440 if (Type == MK_Preamble) { 4441 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4442 } else if (Type == MK_MainFile) { 4443 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4444 } 4445 } 4446 4447 // For any Objective-C class definitions we have already loaded, make sure 4448 // that we load any additional categories. 4449 if (ContextObj) { 4450 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4451 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4452 ObjCClassesLoaded[I], 4453 PreviousGeneration); 4454 } 4455 } 4456 4457 if (PP.getHeaderSearchInfo() 4458 .getHeaderSearchOpts() 4459 .ModulesValidateOncePerBuildSession) { 4460 // Now we are certain that the module and all modules it depends on are 4461 // up to date. Create or update timestamp files for modules that are 4462 // located in the module cache (not for PCH files that could be anywhere 4463 // in the filesystem). 4464 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4465 ImportedModule &M = Loaded[I]; 4466 if (M.Mod->Kind == MK_ImplicitModule) { 4467 updateModuleTimestamp(*M.Mod); 4468 } 4469 } 4470 } 4471 4472 return Success; 4473 } 4474 4475 static ASTFileSignature readASTFileSignature(StringRef PCH); 4476 4477 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4478 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4479 // FIXME checking magic headers is done in other places such as 4480 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4481 // always done the same. Unify it all with a helper. 4482 if (!Stream.canSkipToPos(4)) 4483 return llvm::createStringError(std::errc::illegal_byte_sequence, 4484 "file too small to contain AST file magic"); 4485 for (unsigned C : {'C', 'P', 'C', 'H'}) 4486 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4487 if (Res.get() != C) 4488 return llvm::createStringError( 4489 std::errc::illegal_byte_sequence, 4490 "file doesn't start with AST file magic"); 4491 } else 4492 return Res.takeError(); 4493 return llvm::Error::success(); 4494 } 4495 4496 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4497 switch (Kind) { 4498 case MK_PCH: 4499 return 0; // PCH 4500 case MK_ImplicitModule: 4501 case MK_ExplicitModule: 4502 case MK_PrebuiltModule: 4503 return 1; // module 4504 case MK_MainFile: 4505 case MK_Preamble: 4506 return 2; // main source file 4507 } 4508 llvm_unreachable("unknown module kind"); 4509 } 4510 4511 ASTReader::ASTReadResult 4512 ASTReader::ReadASTCore(StringRef FileName, 4513 ModuleKind Type, 4514 SourceLocation ImportLoc, 4515 ModuleFile *ImportedBy, 4516 SmallVectorImpl<ImportedModule> &Loaded, 4517 off_t ExpectedSize, time_t ExpectedModTime, 4518 ASTFileSignature ExpectedSignature, 4519 unsigned ClientLoadCapabilities) { 4520 ModuleFile *M; 4521 std::string ErrorStr; 4522 ModuleManager::AddModuleResult AddResult 4523 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4524 getGeneration(), ExpectedSize, ExpectedModTime, 4525 ExpectedSignature, readASTFileSignature, 4526 M, ErrorStr); 4527 4528 switch (AddResult) { 4529 case ModuleManager::AlreadyLoaded: 4530 Diag(diag::remark_module_import) 4531 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4532 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4533 return Success; 4534 4535 case ModuleManager::NewlyLoaded: 4536 // Load module file below. 4537 break; 4538 4539 case ModuleManager::Missing: 4540 // The module file was missing; if the client can handle that, return 4541 // it. 4542 if (ClientLoadCapabilities & ARR_Missing) 4543 return Missing; 4544 4545 // Otherwise, return an error. 4546 Diag(diag::err_ast_file_not_found) 4547 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4548 << ErrorStr; 4549 return Failure; 4550 4551 case ModuleManager::OutOfDate: 4552 // We couldn't load the module file because it is out-of-date. If the 4553 // client can handle out-of-date, return it. 4554 if (ClientLoadCapabilities & ARR_OutOfDate) 4555 return OutOfDate; 4556 4557 // Otherwise, return an error. 4558 Diag(diag::err_ast_file_out_of_date) 4559 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4560 << ErrorStr; 4561 return Failure; 4562 } 4563 4564 assert(M && "Missing module file"); 4565 4566 bool ShouldFinalizePCM = false; 4567 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4568 auto &MC = getModuleManager().getModuleCache(); 4569 if (ShouldFinalizePCM) 4570 MC.finalizePCM(FileName); 4571 else 4572 MC.tryToDropPCM(FileName); 4573 }); 4574 ModuleFile &F = *M; 4575 BitstreamCursor &Stream = F.Stream; 4576 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4577 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4578 4579 // Sniff for the signature. 4580 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4581 Diag(diag::err_ast_file_invalid) 4582 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4583 return Failure; 4584 } 4585 4586 // This is used for compatibility with older PCH formats. 4587 bool HaveReadControlBlock = false; 4588 while (true) { 4589 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4590 if (!MaybeEntry) { 4591 Error(MaybeEntry.takeError()); 4592 return Failure; 4593 } 4594 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4595 4596 switch (Entry.Kind) { 4597 case llvm::BitstreamEntry::Error: 4598 case llvm::BitstreamEntry::Record: 4599 case llvm::BitstreamEntry::EndBlock: 4600 Error("invalid record at top-level of AST file"); 4601 return Failure; 4602 4603 case llvm::BitstreamEntry::SubBlock: 4604 break; 4605 } 4606 4607 switch (Entry.ID) { 4608 case CONTROL_BLOCK_ID: 4609 HaveReadControlBlock = true; 4610 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4611 case Success: 4612 // Check that we didn't try to load a non-module AST file as a module. 4613 // 4614 // FIXME: Should we also perform the converse check? Loading a module as 4615 // a PCH file sort of works, but it's a bit wonky. 4616 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4617 Type == MK_PrebuiltModule) && 4618 F.ModuleName.empty()) { 4619 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4620 if (Result != OutOfDate || 4621 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4622 Diag(diag::err_module_file_not_module) << FileName; 4623 return Result; 4624 } 4625 break; 4626 4627 case Failure: return Failure; 4628 case Missing: return Missing; 4629 case OutOfDate: return OutOfDate; 4630 case VersionMismatch: return VersionMismatch; 4631 case ConfigurationMismatch: return ConfigurationMismatch; 4632 case HadErrors: return HadErrors; 4633 } 4634 break; 4635 4636 case AST_BLOCK_ID: 4637 if (!HaveReadControlBlock) { 4638 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4639 Diag(diag::err_pch_version_too_old); 4640 return VersionMismatch; 4641 } 4642 4643 // Record that we've loaded this module. 4644 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4645 ShouldFinalizePCM = true; 4646 return Success; 4647 4648 case UNHASHED_CONTROL_BLOCK_ID: 4649 // This block is handled using look-ahead during ReadControlBlock. We 4650 // shouldn't get here! 4651 Error("malformed block record in AST file"); 4652 return Failure; 4653 4654 default: 4655 if (llvm::Error Err = Stream.SkipBlock()) { 4656 Error(std::move(Err)); 4657 return Failure; 4658 } 4659 break; 4660 } 4661 } 4662 4663 llvm_unreachable("unexpected break; expected return"); 4664 } 4665 4666 ASTReader::ASTReadResult 4667 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4668 unsigned ClientLoadCapabilities) { 4669 const HeaderSearchOptions &HSOpts = 4670 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4671 bool AllowCompatibleConfigurationMismatch = 4672 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4673 bool DisableValidation = shouldDisableValidationForFile(F); 4674 4675 ASTReadResult Result = readUnhashedControlBlockImpl( 4676 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4677 Listener.get(), 4678 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4679 4680 // If F was directly imported by another module, it's implicitly validated by 4681 // the importing module. 4682 if (DisableValidation || WasImportedBy || 4683 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4684 return Success; 4685 4686 if (Result == Failure) { 4687 Error("malformed block record in AST file"); 4688 return Failure; 4689 } 4690 4691 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4692 // If this module has already been finalized in the ModuleCache, we're stuck 4693 // with it; we can only load a single version of each module. 4694 // 4695 // This can happen when a module is imported in two contexts: in one, as a 4696 // user module; in another, as a system module (due to an import from 4697 // another module marked with the [system] flag). It usually indicates a 4698 // bug in the module map: this module should also be marked with [system]. 4699 // 4700 // If -Wno-system-headers (the default), and the first import is as a 4701 // system module, then validation will fail during the as-user import, 4702 // since -Werror flags won't have been validated. However, it's reasonable 4703 // to treat this consistently as a system module. 4704 // 4705 // If -Wsystem-headers, the PCM on disk was built with 4706 // -Wno-system-headers, and the first import is as a user module, then 4707 // validation will fail during the as-system import since the PCM on disk 4708 // doesn't guarantee that -Werror was respected. However, the -Werror 4709 // flags were checked during the initial as-user import. 4710 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4711 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4712 return Success; 4713 } 4714 } 4715 4716 return Result; 4717 } 4718 4719 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4720 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4721 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4722 bool ValidateDiagnosticOptions) { 4723 // Initialize a stream. 4724 BitstreamCursor Stream(StreamData); 4725 4726 // Sniff for the signature. 4727 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4728 // FIXME this drops the error on the floor. 4729 consumeError(std::move(Err)); 4730 return Failure; 4731 } 4732 4733 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4734 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4735 return Failure; 4736 4737 // Read all of the records in the options block. 4738 RecordData Record; 4739 ASTReadResult Result = Success; 4740 while (true) { 4741 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4742 if (!MaybeEntry) { 4743 // FIXME this drops the error on the floor. 4744 consumeError(MaybeEntry.takeError()); 4745 return Failure; 4746 } 4747 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4748 4749 switch (Entry.Kind) { 4750 case llvm::BitstreamEntry::Error: 4751 case llvm::BitstreamEntry::SubBlock: 4752 return Failure; 4753 4754 case llvm::BitstreamEntry::EndBlock: 4755 return Result; 4756 4757 case llvm::BitstreamEntry::Record: 4758 // The interesting case. 4759 break; 4760 } 4761 4762 // Read and process a record. 4763 Record.clear(); 4764 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 4765 if (!MaybeRecordType) { 4766 // FIXME this drops the error. 4767 return Failure; 4768 } 4769 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4770 case SIGNATURE: 4771 if (F) 4772 F->Signature = ASTFileSignature::create(Record.begin(), Record.end()); 4773 break; 4774 case AST_BLOCK_HASH: 4775 if (F) 4776 F->ASTBlockHash = 4777 ASTFileSignature::create(Record.begin(), Record.end()); 4778 break; 4779 case DIAGNOSTIC_OPTIONS: { 4780 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4781 if (Listener && ValidateDiagnosticOptions && 4782 !AllowCompatibleConfigurationMismatch && 4783 ParseDiagnosticOptions(Record, Complain, *Listener)) 4784 Result = OutOfDate; // Don't return early. Read the signature. 4785 break; 4786 } 4787 case DIAG_PRAGMA_MAPPINGS: 4788 if (!F) 4789 break; 4790 if (F->PragmaDiagMappings.empty()) 4791 F->PragmaDiagMappings.swap(Record); 4792 else 4793 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4794 Record.begin(), Record.end()); 4795 break; 4796 } 4797 } 4798 } 4799 4800 /// Parse a record and blob containing module file extension metadata. 4801 static bool parseModuleFileExtensionMetadata( 4802 const SmallVectorImpl<uint64_t> &Record, 4803 StringRef Blob, 4804 ModuleFileExtensionMetadata &Metadata) { 4805 if (Record.size() < 4) return true; 4806 4807 Metadata.MajorVersion = Record[0]; 4808 Metadata.MinorVersion = Record[1]; 4809 4810 unsigned BlockNameLen = Record[2]; 4811 unsigned UserInfoLen = Record[3]; 4812 4813 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4814 4815 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4816 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4817 Blob.data() + BlockNameLen + UserInfoLen); 4818 return false; 4819 } 4820 4821 ASTReader::ASTReadResult ASTReader::ReadExtensionBlock(ModuleFile &F) { 4822 BitstreamCursor &Stream = F.Stream; 4823 4824 RecordData Record; 4825 while (true) { 4826 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4827 if (!MaybeEntry) { 4828 Error(MaybeEntry.takeError()); 4829 return Failure; 4830 } 4831 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4832 4833 switch (Entry.Kind) { 4834 case llvm::BitstreamEntry::SubBlock: 4835 if (llvm::Error Err = Stream.SkipBlock()) { 4836 Error(std::move(Err)); 4837 return Failure; 4838 } 4839 continue; 4840 4841 case llvm::BitstreamEntry::EndBlock: 4842 return Success; 4843 4844 case llvm::BitstreamEntry::Error: 4845 return HadErrors; 4846 4847 case llvm::BitstreamEntry::Record: 4848 break; 4849 } 4850 4851 Record.clear(); 4852 StringRef Blob; 4853 Expected<unsigned> MaybeRecCode = 4854 Stream.readRecord(Entry.ID, Record, &Blob); 4855 if (!MaybeRecCode) { 4856 Error(MaybeRecCode.takeError()); 4857 return Failure; 4858 } 4859 switch (MaybeRecCode.get()) { 4860 case EXTENSION_METADATA: { 4861 ModuleFileExtensionMetadata Metadata; 4862 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) { 4863 Error("malformed EXTENSION_METADATA in AST file"); 4864 return Failure; 4865 } 4866 4867 // Find a module file extension with this block name. 4868 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4869 if (Known == ModuleFileExtensions.end()) break; 4870 4871 // Form a reader. 4872 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4873 F, Stream)) { 4874 F.ExtensionReaders.push_back(std::move(Reader)); 4875 } 4876 4877 break; 4878 } 4879 } 4880 } 4881 4882 return Success; 4883 } 4884 4885 void ASTReader::InitializeContext() { 4886 assert(ContextObj && "no context to initialize"); 4887 ASTContext &Context = *ContextObj; 4888 4889 // If there's a listener, notify them that we "read" the translation unit. 4890 if (DeserializationListener) 4891 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4892 Context.getTranslationUnitDecl()); 4893 4894 // FIXME: Find a better way to deal with collisions between these 4895 // built-in types. Right now, we just ignore the problem. 4896 4897 // Load the special types. 4898 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4899 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4900 if (!Context.CFConstantStringTypeDecl) 4901 Context.setCFConstantStringType(GetType(String)); 4902 } 4903 4904 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4905 QualType FileType = GetType(File); 4906 if (FileType.isNull()) { 4907 Error("FILE type is NULL"); 4908 return; 4909 } 4910 4911 if (!Context.FILEDecl) { 4912 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4913 Context.setFILEDecl(Typedef->getDecl()); 4914 else { 4915 const TagType *Tag = FileType->getAs<TagType>(); 4916 if (!Tag) { 4917 Error("Invalid FILE type in AST file"); 4918 return; 4919 } 4920 Context.setFILEDecl(Tag->getDecl()); 4921 } 4922 } 4923 } 4924 4925 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4926 QualType Jmp_bufType = GetType(Jmp_buf); 4927 if (Jmp_bufType.isNull()) { 4928 Error("jmp_buf type is NULL"); 4929 return; 4930 } 4931 4932 if (!Context.jmp_bufDecl) { 4933 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4934 Context.setjmp_bufDecl(Typedef->getDecl()); 4935 else { 4936 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4937 if (!Tag) { 4938 Error("Invalid jmp_buf type in AST file"); 4939 return; 4940 } 4941 Context.setjmp_bufDecl(Tag->getDecl()); 4942 } 4943 } 4944 } 4945 4946 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4947 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4948 if (Sigjmp_bufType.isNull()) { 4949 Error("sigjmp_buf type is NULL"); 4950 return; 4951 } 4952 4953 if (!Context.sigjmp_bufDecl) { 4954 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4955 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4956 else { 4957 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4958 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4959 Context.setsigjmp_bufDecl(Tag->getDecl()); 4960 } 4961 } 4962 } 4963 4964 if (unsigned ObjCIdRedef 4965 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4966 if (Context.ObjCIdRedefinitionType.isNull()) 4967 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4968 } 4969 4970 if (unsigned ObjCClassRedef 4971 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4972 if (Context.ObjCClassRedefinitionType.isNull()) 4973 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4974 } 4975 4976 if (unsigned ObjCSelRedef 4977 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4978 if (Context.ObjCSelRedefinitionType.isNull()) 4979 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4980 } 4981 4982 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4983 QualType Ucontext_tType = GetType(Ucontext_t); 4984 if (Ucontext_tType.isNull()) { 4985 Error("ucontext_t type is NULL"); 4986 return; 4987 } 4988 4989 if (!Context.ucontext_tDecl) { 4990 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4991 Context.setucontext_tDecl(Typedef->getDecl()); 4992 else { 4993 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4994 assert(Tag && "Invalid ucontext_t type in AST file"); 4995 Context.setucontext_tDecl(Tag->getDecl()); 4996 } 4997 } 4998 } 4999 } 5000 5001 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 5002 5003 // If there were any CUDA special declarations, deserialize them. 5004 if (!CUDASpecialDeclRefs.empty()) { 5005 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 5006 Context.setcudaConfigureCallDecl( 5007 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 5008 } 5009 5010 // Re-export any modules that were imported by a non-module AST file. 5011 // FIXME: This does not make macro-only imports visible again. 5012 for (auto &Import : ImportedModules) { 5013 if (Module *Imported = getSubmodule(Import.ID)) { 5014 makeModuleVisible(Imported, Module::AllVisible, 5015 /*ImportLoc=*/Import.ImportLoc); 5016 if (Import.ImportLoc.isValid()) 5017 PP.makeModuleVisible(Imported, Import.ImportLoc); 5018 // This updates visibility for Preprocessor only. For Sema, which can be 5019 // nullptr here, we do the same later, in UpdateSema(). 5020 } 5021 } 5022 } 5023 5024 void ASTReader::finalizeForWriting() { 5025 // Nothing to do for now. 5026 } 5027 5028 /// Reads and return the signature record from \p PCH's control block, or 5029 /// else returns 0. 5030 static ASTFileSignature readASTFileSignature(StringRef PCH) { 5031 BitstreamCursor Stream(PCH); 5032 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5033 // FIXME this drops the error on the floor. 5034 consumeError(std::move(Err)); 5035 return ASTFileSignature(); 5036 } 5037 5038 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5039 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 5040 return ASTFileSignature(); 5041 5042 // Scan for SIGNATURE inside the diagnostic options block. 5043 ASTReader::RecordData Record; 5044 while (true) { 5045 Expected<llvm::BitstreamEntry> MaybeEntry = 5046 Stream.advanceSkippingSubblocks(); 5047 if (!MaybeEntry) { 5048 // FIXME this drops the error on the floor. 5049 consumeError(MaybeEntry.takeError()); 5050 return ASTFileSignature(); 5051 } 5052 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5053 5054 if (Entry.Kind != llvm::BitstreamEntry::Record) 5055 return ASTFileSignature(); 5056 5057 Record.clear(); 5058 StringRef Blob; 5059 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5060 if (!MaybeRecord) { 5061 // FIXME this drops the error on the floor. 5062 consumeError(MaybeRecord.takeError()); 5063 return ASTFileSignature(); 5064 } 5065 if (SIGNATURE == MaybeRecord.get()) 5066 return ASTFileSignature::create(Record.begin(), 5067 Record.begin() + ASTFileSignature::size); 5068 } 5069 } 5070 5071 /// Retrieve the name of the original source file name 5072 /// directly from the AST file, without actually loading the AST 5073 /// file. 5074 std::string ASTReader::getOriginalSourceFile( 5075 const std::string &ASTFileName, FileManager &FileMgr, 5076 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5077 // Open the AST file. 5078 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5079 if (!Buffer) { 5080 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5081 << ASTFileName << Buffer.getError().message(); 5082 return std::string(); 5083 } 5084 5085 // Initialize the stream 5086 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5087 5088 // Sniff for the signature. 5089 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5090 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5091 return std::string(); 5092 } 5093 5094 // Scan for the CONTROL_BLOCK_ID block. 5095 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5096 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5097 return std::string(); 5098 } 5099 5100 // Scan for ORIGINAL_FILE inside the control block. 5101 RecordData Record; 5102 while (true) { 5103 Expected<llvm::BitstreamEntry> MaybeEntry = 5104 Stream.advanceSkippingSubblocks(); 5105 if (!MaybeEntry) { 5106 // FIXME this drops errors on the floor. 5107 consumeError(MaybeEntry.takeError()); 5108 return std::string(); 5109 } 5110 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5111 5112 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5113 return std::string(); 5114 5115 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5116 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5117 return std::string(); 5118 } 5119 5120 Record.clear(); 5121 StringRef Blob; 5122 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5123 if (!MaybeRecord) { 5124 // FIXME this drops the errors on the floor. 5125 consumeError(MaybeRecord.takeError()); 5126 return std::string(); 5127 } 5128 if (ORIGINAL_FILE == MaybeRecord.get()) 5129 return Blob.str(); 5130 } 5131 } 5132 5133 namespace { 5134 5135 class SimplePCHValidator : public ASTReaderListener { 5136 const LangOptions &ExistingLangOpts; 5137 const TargetOptions &ExistingTargetOpts; 5138 const PreprocessorOptions &ExistingPPOpts; 5139 std::string ExistingModuleCachePath; 5140 FileManager &FileMgr; 5141 5142 public: 5143 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5144 const TargetOptions &ExistingTargetOpts, 5145 const PreprocessorOptions &ExistingPPOpts, 5146 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5147 : ExistingLangOpts(ExistingLangOpts), 5148 ExistingTargetOpts(ExistingTargetOpts), 5149 ExistingPPOpts(ExistingPPOpts), 5150 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5151 5152 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5153 bool AllowCompatibleDifferences) override { 5154 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5155 AllowCompatibleDifferences); 5156 } 5157 5158 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5159 bool AllowCompatibleDifferences) override { 5160 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5161 AllowCompatibleDifferences); 5162 } 5163 5164 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5165 StringRef SpecificModuleCachePath, 5166 bool Complain) override { 5167 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5168 ExistingModuleCachePath, 5169 nullptr, ExistingLangOpts); 5170 } 5171 5172 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5173 bool Complain, 5174 std::string &SuggestedPredefines) override { 5175 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5176 SuggestedPredefines, ExistingLangOpts); 5177 } 5178 }; 5179 5180 } // namespace 5181 5182 bool ASTReader::readASTFileControlBlock( 5183 StringRef Filename, FileManager &FileMgr, 5184 const PCHContainerReader &PCHContainerRdr, 5185 bool FindModuleFileExtensions, 5186 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5187 // Open the AST file. 5188 // FIXME: This allows use of the VFS; we do not allow use of the 5189 // VFS when actually loading a module. 5190 auto Buffer = FileMgr.getBufferForFile(Filename); 5191 if (!Buffer) { 5192 return true; 5193 } 5194 5195 // Initialize the stream 5196 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5197 BitstreamCursor Stream(Bytes); 5198 5199 // Sniff for the signature. 5200 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5201 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5202 return true; 5203 } 5204 5205 // Scan for the CONTROL_BLOCK_ID block. 5206 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5207 return true; 5208 5209 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5210 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5211 bool NeedsImports = Listener.needsImportVisitation(); 5212 BitstreamCursor InputFilesCursor; 5213 5214 RecordData Record; 5215 std::string ModuleDir; 5216 bool DoneWithControlBlock = false; 5217 while (!DoneWithControlBlock) { 5218 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5219 if (!MaybeEntry) { 5220 // FIXME this drops the error on the floor. 5221 consumeError(MaybeEntry.takeError()); 5222 return true; 5223 } 5224 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5225 5226 switch (Entry.Kind) { 5227 case llvm::BitstreamEntry::SubBlock: { 5228 switch (Entry.ID) { 5229 case OPTIONS_BLOCK_ID: { 5230 std::string IgnoredSuggestedPredefines; 5231 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5232 /*AllowCompatibleConfigurationMismatch*/ false, 5233 Listener, IgnoredSuggestedPredefines) != Success) 5234 return true; 5235 break; 5236 } 5237 5238 case INPUT_FILES_BLOCK_ID: 5239 InputFilesCursor = Stream; 5240 if (llvm::Error Err = Stream.SkipBlock()) { 5241 // FIXME this drops the error on the floor. 5242 consumeError(std::move(Err)); 5243 return true; 5244 } 5245 if (NeedsInputFiles && 5246 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5247 return true; 5248 break; 5249 5250 default: 5251 if (llvm::Error Err = Stream.SkipBlock()) { 5252 // FIXME this drops the error on the floor. 5253 consumeError(std::move(Err)); 5254 return true; 5255 } 5256 break; 5257 } 5258 5259 continue; 5260 } 5261 5262 case llvm::BitstreamEntry::EndBlock: 5263 DoneWithControlBlock = true; 5264 break; 5265 5266 case llvm::BitstreamEntry::Error: 5267 return true; 5268 5269 case llvm::BitstreamEntry::Record: 5270 break; 5271 } 5272 5273 if (DoneWithControlBlock) break; 5274 5275 Record.clear(); 5276 StringRef Blob; 5277 Expected<unsigned> MaybeRecCode = 5278 Stream.readRecord(Entry.ID, Record, &Blob); 5279 if (!MaybeRecCode) { 5280 // FIXME this drops the error. 5281 return Failure; 5282 } 5283 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5284 case METADATA: 5285 if (Record[0] != VERSION_MAJOR) 5286 return true; 5287 if (Listener.ReadFullVersionInformation(Blob)) 5288 return true; 5289 break; 5290 case MODULE_NAME: 5291 Listener.ReadModuleName(Blob); 5292 break; 5293 case MODULE_DIRECTORY: 5294 ModuleDir = std::string(Blob); 5295 break; 5296 case MODULE_MAP_FILE: { 5297 unsigned Idx = 0; 5298 auto Path = ReadString(Record, Idx); 5299 ResolveImportedPath(Path, ModuleDir); 5300 Listener.ReadModuleMapFile(Path); 5301 break; 5302 } 5303 case INPUT_FILE_OFFSETS: { 5304 if (!NeedsInputFiles) 5305 break; 5306 5307 unsigned NumInputFiles = Record[0]; 5308 unsigned NumUserFiles = Record[1]; 5309 const llvm::support::unaligned_uint64_t *InputFileOffs = 5310 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5311 for (unsigned I = 0; I != NumInputFiles; ++I) { 5312 // Go find this input file. 5313 bool isSystemFile = I >= NumUserFiles; 5314 5315 if (isSystemFile && !NeedsSystemInputFiles) 5316 break; // the rest are system input files 5317 5318 BitstreamCursor &Cursor = InputFilesCursor; 5319 SavedStreamPosition SavedPosition(Cursor); 5320 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5321 // FIXME this drops errors on the floor. 5322 consumeError(std::move(Err)); 5323 } 5324 5325 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5326 if (!MaybeCode) { 5327 // FIXME this drops errors on the floor. 5328 consumeError(MaybeCode.takeError()); 5329 } 5330 unsigned Code = MaybeCode.get(); 5331 5332 RecordData Record; 5333 StringRef Blob; 5334 bool shouldContinue = false; 5335 Expected<unsigned> MaybeRecordType = 5336 Cursor.readRecord(Code, Record, &Blob); 5337 if (!MaybeRecordType) { 5338 // FIXME this drops errors on the floor. 5339 consumeError(MaybeRecordType.takeError()); 5340 } 5341 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5342 case INPUT_FILE_HASH: 5343 break; 5344 case INPUT_FILE: 5345 bool Overridden = static_cast<bool>(Record[3]); 5346 std::string Filename = std::string(Blob); 5347 ResolveImportedPath(Filename, ModuleDir); 5348 shouldContinue = Listener.visitInputFile( 5349 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5350 break; 5351 } 5352 if (!shouldContinue) 5353 break; 5354 } 5355 break; 5356 } 5357 5358 case IMPORTS: { 5359 if (!NeedsImports) 5360 break; 5361 5362 unsigned Idx = 0, N = Record.size(); 5363 while (Idx < N) { 5364 // Read information about the AST file. 5365 Idx += 5366 1 + 1 + 1 + 1 + 5367 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature 5368 std::string ModuleName = ReadString(Record, Idx); 5369 std::string Filename = ReadString(Record, Idx); 5370 ResolveImportedPath(Filename, ModuleDir); 5371 Listener.visitImport(ModuleName, Filename); 5372 } 5373 break; 5374 } 5375 5376 default: 5377 // No other validation to perform. 5378 break; 5379 } 5380 } 5381 5382 // Look for module file extension blocks, if requested. 5383 if (FindModuleFileExtensions) { 5384 BitstreamCursor SavedStream = Stream; 5385 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5386 bool DoneWithExtensionBlock = false; 5387 while (!DoneWithExtensionBlock) { 5388 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5389 if (!MaybeEntry) { 5390 // FIXME this drops the error. 5391 return true; 5392 } 5393 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5394 5395 switch (Entry.Kind) { 5396 case llvm::BitstreamEntry::SubBlock: 5397 if (llvm::Error Err = Stream.SkipBlock()) { 5398 // FIXME this drops the error on the floor. 5399 consumeError(std::move(Err)); 5400 return true; 5401 } 5402 continue; 5403 5404 case llvm::BitstreamEntry::EndBlock: 5405 DoneWithExtensionBlock = true; 5406 continue; 5407 5408 case llvm::BitstreamEntry::Error: 5409 return true; 5410 5411 case llvm::BitstreamEntry::Record: 5412 break; 5413 } 5414 5415 Record.clear(); 5416 StringRef Blob; 5417 Expected<unsigned> MaybeRecCode = 5418 Stream.readRecord(Entry.ID, Record, &Blob); 5419 if (!MaybeRecCode) { 5420 // FIXME this drops the error. 5421 return true; 5422 } 5423 switch (MaybeRecCode.get()) { 5424 case EXTENSION_METADATA: { 5425 ModuleFileExtensionMetadata Metadata; 5426 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5427 return true; 5428 5429 Listener.readModuleFileExtension(Metadata); 5430 break; 5431 } 5432 } 5433 } 5434 } 5435 Stream = SavedStream; 5436 } 5437 5438 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5439 if (readUnhashedControlBlockImpl( 5440 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5441 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5442 ValidateDiagnosticOptions) != Success) 5443 return true; 5444 5445 return false; 5446 } 5447 5448 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5449 const PCHContainerReader &PCHContainerRdr, 5450 const LangOptions &LangOpts, 5451 const TargetOptions &TargetOpts, 5452 const PreprocessorOptions &PPOpts, 5453 StringRef ExistingModuleCachePath) { 5454 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5455 ExistingModuleCachePath, FileMgr); 5456 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5457 /*FindModuleFileExtensions=*/false, 5458 validator, 5459 /*ValidateDiagnosticOptions=*/true); 5460 } 5461 5462 ASTReader::ASTReadResult 5463 ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) { 5464 // Enter the submodule block. 5465 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) { 5466 Error(std::move(Err)); 5467 return Failure; 5468 } 5469 5470 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5471 bool First = true; 5472 Module *CurrentModule = nullptr; 5473 RecordData Record; 5474 while (true) { 5475 Expected<llvm::BitstreamEntry> MaybeEntry = 5476 F.Stream.advanceSkippingSubblocks(); 5477 if (!MaybeEntry) { 5478 Error(MaybeEntry.takeError()); 5479 return Failure; 5480 } 5481 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5482 5483 switch (Entry.Kind) { 5484 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5485 case llvm::BitstreamEntry::Error: 5486 Error("malformed block record in AST file"); 5487 return Failure; 5488 case llvm::BitstreamEntry::EndBlock: 5489 return Success; 5490 case llvm::BitstreamEntry::Record: 5491 // The interesting case. 5492 break; 5493 } 5494 5495 // Read a record. 5496 StringRef Blob; 5497 Record.clear(); 5498 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5499 if (!MaybeKind) { 5500 Error(MaybeKind.takeError()); 5501 return Failure; 5502 } 5503 unsigned Kind = MaybeKind.get(); 5504 5505 if ((Kind == SUBMODULE_METADATA) != First) { 5506 Error("submodule metadata record should be at beginning of block"); 5507 return Failure; 5508 } 5509 First = false; 5510 5511 // Submodule information is only valid if we have a current module. 5512 // FIXME: Should we error on these cases? 5513 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5514 Kind != SUBMODULE_DEFINITION) 5515 continue; 5516 5517 switch (Kind) { 5518 default: // Default behavior: ignore. 5519 break; 5520 5521 case SUBMODULE_DEFINITION: { 5522 if (Record.size() < 12) { 5523 Error("malformed module definition"); 5524 return Failure; 5525 } 5526 5527 StringRef Name = Blob; 5528 unsigned Idx = 0; 5529 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5530 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5531 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5532 bool IsFramework = Record[Idx++]; 5533 bool IsExplicit = Record[Idx++]; 5534 bool IsSystem = Record[Idx++]; 5535 bool IsExternC = Record[Idx++]; 5536 bool InferSubmodules = Record[Idx++]; 5537 bool InferExplicitSubmodules = Record[Idx++]; 5538 bool InferExportWildcard = Record[Idx++]; 5539 bool ConfigMacrosExhaustive = Record[Idx++]; 5540 bool ModuleMapIsPrivate = Record[Idx++]; 5541 5542 Module *ParentModule = nullptr; 5543 if (Parent) 5544 ParentModule = getSubmodule(Parent); 5545 5546 // Retrieve this (sub)module from the module map, creating it if 5547 // necessary. 5548 CurrentModule = 5549 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5550 .first; 5551 5552 // FIXME: set the definition loc for CurrentModule, or call 5553 // ModMap.setInferredModuleAllowedBy() 5554 5555 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5556 if (GlobalIndex >= SubmodulesLoaded.size() || 5557 SubmodulesLoaded[GlobalIndex]) { 5558 Error("too many submodules"); 5559 return Failure; 5560 } 5561 5562 if (!ParentModule) { 5563 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5564 // Don't emit module relocation error if we have -fno-validate-pch 5565 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 5566 DisableValidationForModuleKind::Module) && 5567 CurFile != F.File) { 5568 Error(diag::err_module_file_conflict, 5569 CurrentModule->getTopLevelModuleName(), CurFile->getName(), 5570 F.File->getName()); 5571 return Failure; 5572 } 5573 } 5574 5575 F.DidReadTopLevelSubmodule = true; 5576 CurrentModule->setASTFile(F.File); 5577 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5578 } 5579 5580 CurrentModule->Kind = Kind; 5581 CurrentModule->Signature = F.Signature; 5582 CurrentModule->IsFromModuleFile = true; 5583 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5584 CurrentModule->IsExternC = IsExternC; 5585 CurrentModule->InferSubmodules = InferSubmodules; 5586 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5587 CurrentModule->InferExportWildcard = InferExportWildcard; 5588 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5589 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5590 if (DeserializationListener) 5591 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5592 5593 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5594 5595 // Clear out data that will be replaced by what is in the module file. 5596 CurrentModule->LinkLibraries.clear(); 5597 CurrentModule->ConfigMacros.clear(); 5598 CurrentModule->UnresolvedConflicts.clear(); 5599 CurrentModule->Conflicts.clear(); 5600 5601 // The module is available unless it's missing a requirement; relevant 5602 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5603 // Missing headers that were present when the module was built do not 5604 // make it unavailable -- if we got this far, this must be an explicitly 5605 // imported module file. 5606 CurrentModule->Requirements.clear(); 5607 CurrentModule->MissingHeaders.clear(); 5608 CurrentModule->IsUnimportable = 5609 ParentModule && ParentModule->IsUnimportable; 5610 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable; 5611 break; 5612 } 5613 5614 case SUBMODULE_UMBRELLA_HEADER: { 5615 std::string Filename = std::string(Blob); 5616 ResolveImportedPath(F, Filename); 5617 if (auto Umbrella = PP.getFileManager().getOptionalFileRef(Filename)) { 5618 if (!CurrentModule->getUmbrellaHeader()) 5619 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob); 5620 else if (CurrentModule->getUmbrellaHeader().Entry != *Umbrella) { 5621 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5622 Error("mismatched umbrella headers in submodule"); 5623 return OutOfDate; 5624 } 5625 } 5626 break; 5627 } 5628 5629 case SUBMODULE_HEADER: 5630 case SUBMODULE_EXCLUDED_HEADER: 5631 case SUBMODULE_PRIVATE_HEADER: 5632 // We lazily associate headers with their modules via the HeaderInfo table. 5633 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5634 // of complete filenames or remove it entirely. 5635 break; 5636 5637 case SUBMODULE_TEXTUAL_HEADER: 5638 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5639 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5640 // them here. 5641 break; 5642 5643 case SUBMODULE_TOPHEADER: 5644 CurrentModule->addTopHeaderFilename(Blob); 5645 break; 5646 5647 case SUBMODULE_UMBRELLA_DIR: { 5648 std::string Dirname = std::string(Blob); 5649 ResolveImportedPath(F, Dirname); 5650 if (auto Umbrella = 5651 PP.getFileManager().getOptionalDirectoryRef(Dirname)) { 5652 if (!CurrentModule->getUmbrellaDir()) 5653 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob); 5654 else if (CurrentModule->getUmbrellaDir().Entry != *Umbrella) { 5655 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 5656 Error("mismatched umbrella directories in submodule"); 5657 return OutOfDate; 5658 } 5659 } 5660 break; 5661 } 5662 5663 case SUBMODULE_METADATA: { 5664 F.BaseSubmoduleID = getTotalNumSubmodules(); 5665 F.LocalNumSubmodules = Record[0]; 5666 unsigned LocalBaseSubmoduleID = Record[1]; 5667 if (F.LocalNumSubmodules > 0) { 5668 // Introduce the global -> local mapping for submodules within this 5669 // module. 5670 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5671 5672 // Introduce the local -> global mapping for submodules within this 5673 // module. 5674 F.SubmoduleRemap.insertOrReplace( 5675 std::make_pair(LocalBaseSubmoduleID, 5676 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5677 5678 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5679 } 5680 break; 5681 } 5682 5683 case SUBMODULE_IMPORTS: 5684 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5685 UnresolvedModuleRef Unresolved; 5686 Unresolved.File = &F; 5687 Unresolved.Mod = CurrentModule; 5688 Unresolved.ID = Record[Idx]; 5689 Unresolved.Kind = UnresolvedModuleRef::Import; 5690 Unresolved.IsWildcard = false; 5691 UnresolvedModuleRefs.push_back(Unresolved); 5692 } 5693 break; 5694 5695 case SUBMODULE_EXPORTS: 5696 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5697 UnresolvedModuleRef Unresolved; 5698 Unresolved.File = &F; 5699 Unresolved.Mod = CurrentModule; 5700 Unresolved.ID = Record[Idx]; 5701 Unresolved.Kind = UnresolvedModuleRef::Export; 5702 Unresolved.IsWildcard = Record[Idx + 1]; 5703 UnresolvedModuleRefs.push_back(Unresolved); 5704 } 5705 5706 // Once we've loaded the set of exports, there's no reason to keep 5707 // the parsed, unresolved exports around. 5708 CurrentModule->UnresolvedExports.clear(); 5709 break; 5710 5711 case SUBMODULE_REQUIRES: 5712 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5713 PP.getTargetInfo()); 5714 break; 5715 5716 case SUBMODULE_LINK_LIBRARY: 5717 ModMap.resolveLinkAsDependencies(CurrentModule); 5718 CurrentModule->LinkLibraries.push_back( 5719 Module::LinkLibrary(std::string(Blob), Record[0])); 5720 break; 5721 5722 case SUBMODULE_CONFIG_MACRO: 5723 CurrentModule->ConfigMacros.push_back(Blob.str()); 5724 break; 5725 5726 case SUBMODULE_CONFLICT: { 5727 UnresolvedModuleRef Unresolved; 5728 Unresolved.File = &F; 5729 Unresolved.Mod = CurrentModule; 5730 Unresolved.ID = Record[0]; 5731 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5732 Unresolved.IsWildcard = false; 5733 Unresolved.String = Blob; 5734 UnresolvedModuleRefs.push_back(Unresolved); 5735 break; 5736 } 5737 5738 case SUBMODULE_INITIALIZERS: { 5739 if (!ContextObj) 5740 break; 5741 SmallVector<uint32_t, 16> Inits; 5742 for (auto &ID : Record) 5743 Inits.push_back(getGlobalDeclID(F, ID)); 5744 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5745 break; 5746 } 5747 5748 case SUBMODULE_EXPORT_AS: 5749 CurrentModule->ExportAsModule = Blob.str(); 5750 ModMap.addLinkAsDependency(CurrentModule); 5751 break; 5752 } 5753 } 5754 } 5755 5756 /// Parse the record that corresponds to a LangOptions data 5757 /// structure. 5758 /// 5759 /// This routine parses the language options from the AST file and then gives 5760 /// them to the AST listener if one is set. 5761 /// 5762 /// \returns true if the listener deems the file unacceptable, false otherwise. 5763 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5764 bool Complain, 5765 ASTReaderListener &Listener, 5766 bool AllowCompatibleDifferences) { 5767 LangOptions LangOpts; 5768 unsigned Idx = 0; 5769 #define LANGOPT(Name, Bits, Default, Description) \ 5770 LangOpts.Name = Record[Idx++]; 5771 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5772 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5773 #include "clang/Basic/LangOptions.def" 5774 #define SANITIZER(NAME, ID) \ 5775 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5776 #include "clang/Basic/Sanitizers.def" 5777 5778 for (unsigned N = Record[Idx++]; N; --N) 5779 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5780 5781 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5782 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5783 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5784 5785 LangOpts.CurrentModule = ReadString(Record, Idx); 5786 5787 // Comment options. 5788 for (unsigned N = Record[Idx++]; N; --N) { 5789 LangOpts.CommentOpts.BlockCommandNames.push_back( 5790 ReadString(Record, Idx)); 5791 } 5792 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5793 5794 // OpenMP offloading options. 5795 for (unsigned N = Record[Idx++]; N; --N) { 5796 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5797 } 5798 5799 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5800 5801 return Listener.ReadLanguageOptions(LangOpts, Complain, 5802 AllowCompatibleDifferences); 5803 } 5804 5805 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5806 ASTReaderListener &Listener, 5807 bool AllowCompatibleDifferences) { 5808 unsigned Idx = 0; 5809 TargetOptions TargetOpts; 5810 TargetOpts.Triple = ReadString(Record, Idx); 5811 TargetOpts.CPU = ReadString(Record, Idx); 5812 TargetOpts.TuneCPU = ReadString(Record, Idx); 5813 TargetOpts.ABI = ReadString(Record, Idx); 5814 for (unsigned N = Record[Idx++]; N; --N) { 5815 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5816 } 5817 for (unsigned N = Record[Idx++]; N; --N) { 5818 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5819 } 5820 5821 return Listener.ReadTargetOptions(TargetOpts, Complain, 5822 AllowCompatibleDifferences); 5823 } 5824 5825 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5826 ASTReaderListener &Listener) { 5827 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5828 unsigned Idx = 0; 5829 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5830 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5831 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5832 #include "clang/Basic/DiagnosticOptions.def" 5833 5834 for (unsigned N = Record[Idx++]; N; --N) 5835 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5836 for (unsigned N = Record[Idx++]; N; --N) 5837 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5838 5839 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5840 } 5841 5842 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5843 ASTReaderListener &Listener) { 5844 FileSystemOptions FSOpts; 5845 unsigned Idx = 0; 5846 FSOpts.WorkingDir = ReadString(Record, Idx); 5847 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5848 } 5849 5850 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5851 bool Complain, 5852 ASTReaderListener &Listener) { 5853 HeaderSearchOptions HSOpts; 5854 unsigned Idx = 0; 5855 HSOpts.Sysroot = ReadString(Record, Idx); 5856 5857 // Include entries. 5858 for (unsigned N = Record[Idx++]; N; --N) { 5859 std::string Path = ReadString(Record, Idx); 5860 frontend::IncludeDirGroup Group 5861 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5862 bool IsFramework = Record[Idx++]; 5863 bool IgnoreSysRoot = Record[Idx++]; 5864 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5865 IgnoreSysRoot); 5866 } 5867 5868 // System header prefixes. 5869 for (unsigned N = Record[Idx++]; N; --N) { 5870 std::string Prefix = ReadString(Record, Idx); 5871 bool IsSystemHeader = Record[Idx++]; 5872 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5873 } 5874 5875 HSOpts.ResourceDir = ReadString(Record, Idx); 5876 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5877 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5878 HSOpts.DisableModuleHash = Record[Idx++]; 5879 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5880 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5881 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++]; 5882 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5883 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5884 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5885 HSOpts.UseLibcxx = Record[Idx++]; 5886 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5887 5888 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5889 Complain); 5890 } 5891 5892 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5893 bool Complain, 5894 ASTReaderListener &Listener, 5895 std::string &SuggestedPredefines) { 5896 PreprocessorOptions PPOpts; 5897 unsigned Idx = 0; 5898 5899 // Macro definitions/undefs 5900 for (unsigned N = Record[Idx++]; N; --N) { 5901 std::string Macro = ReadString(Record, Idx); 5902 bool IsUndef = Record[Idx++]; 5903 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5904 } 5905 5906 // Includes 5907 for (unsigned N = Record[Idx++]; N; --N) { 5908 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5909 } 5910 5911 // Macro Includes 5912 for (unsigned N = Record[Idx++]; N; --N) { 5913 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5914 } 5915 5916 PPOpts.UsePredefines = Record[Idx++]; 5917 PPOpts.DetailedRecord = Record[Idx++]; 5918 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5919 PPOpts.ObjCXXARCStandardLibrary = 5920 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5921 SuggestedPredefines.clear(); 5922 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5923 SuggestedPredefines); 5924 } 5925 5926 std::pair<ModuleFile *, unsigned> 5927 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5928 GlobalPreprocessedEntityMapType::iterator 5929 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5930 assert(I != GlobalPreprocessedEntityMap.end() && 5931 "Corrupted global preprocessed entity map"); 5932 ModuleFile *M = I->second; 5933 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5934 return std::make_pair(M, LocalIndex); 5935 } 5936 5937 llvm::iterator_range<PreprocessingRecord::iterator> 5938 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5939 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5940 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5941 Mod.NumPreprocessedEntities); 5942 5943 return llvm::make_range(PreprocessingRecord::iterator(), 5944 PreprocessingRecord::iterator()); 5945 } 5946 5947 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5948 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5949 return llvm::make_range( 5950 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5951 ModuleDeclIterator(this, &Mod, 5952 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5953 } 5954 5955 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5956 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5957 assert(I != GlobalSkippedRangeMap.end() && 5958 "Corrupted global skipped range map"); 5959 ModuleFile *M = I->second; 5960 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5961 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5962 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5963 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5964 TranslateSourceLocation(*M, RawRange.getEnd())); 5965 assert(Range.isValid()); 5966 return Range; 5967 } 5968 5969 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5970 PreprocessedEntityID PPID = Index+1; 5971 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5972 ModuleFile &M = *PPInfo.first; 5973 unsigned LocalIndex = PPInfo.second; 5974 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5975 5976 if (!PP.getPreprocessingRecord()) { 5977 Error("no preprocessing record"); 5978 return nullptr; 5979 } 5980 5981 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5982 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5983 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5984 Error(std::move(Err)); 5985 return nullptr; 5986 } 5987 5988 Expected<llvm::BitstreamEntry> MaybeEntry = 5989 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5990 if (!MaybeEntry) { 5991 Error(MaybeEntry.takeError()); 5992 return nullptr; 5993 } 5994 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5995 5996 if (Entry.Kind != llvm::BitstreamEntry::Record) 5997 return nullptr; 5998 5999 // Read the record. 6000 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 6001 TranslateSourceLocation(M, PPOffs.getEnd())); 6002 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 6003 StringRef Blob; 6004 RecordData Record; 6005 Expected<unsigned> MaybeRecType = 6006 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 6007 if (!MaybeRecType) { 6008 Error(MaybeRecType.takeError()); 6009 return nullptr; 6010 } 6011 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 6012 case PPD_MACRO_EXPANSION: { 6013 bool isBuiltin = Record[0]; 6014 IdentifierInfo *Name = nullptr; 6015 MacroDefinitionRecord *Def = nullptr; 6016 if (isBuiltin) 6017 Name = getLocalIdentifier(M, Record[1]); 6018 else { 6019 PreprocessedEntityID GlobalID = 6020 getGlobalPreprocessedEntityID(M, Record[1]); 6021 Def = cast<MacroDefinitionRecord>( 6022 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 6023 } 6024 6025 MacroExpansion *ME; 6026 if (isBuiltin) 6027 ME = new (PPRec) MacroExpansion(Name, Range); 6028 else 6029 ME = new (PPRec) MacroExpansion(Def, Range); 6030 6031 return ME; 6032 } 6033 6034 case PPD_MACRO_DEFINITION: { 6035 // Decode the identifier info and then check again; if the macro is 6036 // still defined and associated with the identifier, 6037 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 6038 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 6039 6040 if (DeserializationListener) 6041 DeserializationListener->MacroDefinitionRead(PPID, MD); 6042 6043 return MD; 6044 } 6045 6046 case PPD_INCLUSION_DIRECTIVE: { 6047 const char *FullFileNameStart = Blob.data() + Record[0]; 6048 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 6049 const FileEntry *File = nullptr; 6050 if (!FullFileName.empty()) 6051 if (auto FE = PP.getFileManager().getFile(FullFileName)) 6052 File = *FE; 6053 6054 // FIXME: Stable encoding 6055 InclusionDirective::InclusionKind Kind 6056 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 6057 InclusionDirective *ID 6058 = new (PPRec) InclusionDirective(PPRec, Kind, 6059 StringRef(Blob.data(), Record[0]), 6060 Record[1], Record[3], 6061 File, 6062 Range); 6063 return ID; 6064 } 6065 } 6066 6067 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 6068 } 6069 6070 /// Find the next module that contains entities and return the ID 6071 /// of the first entry. 6072 /// 6073 /// \param SLocMapI points at a chunk of a module that contains no 6074 /// preprocessed entities or the entities it contains are not the ones we are 6075 /// looking for. 6076 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6077 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6078 ++SLocMapI; 6079 for (GlobalSLocOffsetMapType::const_iterator 6080 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6081 ModuleFile &M = *SLocMapI->second; 6082 if (M.NumPreprocessedEntities) 6083 return M.BasePreprocessedEntityID; 6084 } 6085 6086 return getTotalNumPreprocessedEntities(); 6087 } 6088 6089 namespace { 6090 6091 struct PPEntityComp { 6092 const ASTReader &Reader; 6093 ModuleFile &M; 6094 6095 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6096 6097 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6098 SourceLocation LHS = getLoc(L); 6099 SourceLocation RHS = getLoc(R); 6100 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6101 } 6102 6103 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6104 SourceLocation LHS = getLoc(L); 6105 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6106 } 6107 6108 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6109 SourceLocation RHS = getLoc(R); 6110 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6111 } 6112 6113 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6114 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6115 } 6116 }; 6117 6118 } // namespace 6119 6120 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6121 bool EndsAfter) const { 6122 if (SourceMgr.isLocalSourceLocation(Loc)) 6123 return getTotalNumPreprocessedEntities(); 6124 6125 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6126 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6127 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6128 "Corrupted global sloc offset map"); 6129 6130 if (SLocMapI->second->NumPreprocessedEntities == 0) 6131 return findNextPreprocessedEntity(SLocMapI); 6132 6133 ModuleFile &M = *SLocMapI->second; 6134 6135 using pp_iterator = const PPEntityOffset *; 6136 6137 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6138 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6139 6140 size_t Count = M.NumPreprocessedEntities; 6141 size_t Half; 6142 pp_iterator First = pp_begin; 6143 pp_iterator PPI; 6144 6145 if (EndsAfter) { 6146 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6147 PPEntityComp(*this, M)); 6148 } else { 6149 // Do a binary search manually instead of using std::lower_bound because 6150 // The end locations of entities may be unordered (when a macro expansion 6151 // is inside another macro argument), but for this case it is not important 6152 // whether we get the first macro expansion or its containing macro. 6153 while (Count > 0) { 6154 Half = Count / 2; 6155 PPI = First; 6156 std::advance(PPI, Half); 6157 if (SourceMgr.isBeforeInTranslationUnit( 6158 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6159 First = PPI; 6160 ++First; 6161 Count = Count - Half - 1; 6162 } else 6163 Count = Half; 6164 } 6165 } 6166 6167 if (PPI == pp_end) 6168 return findNextPreprocessedEntity(SLocMapI); 6169 6170 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6171 } 6172 6173 /// Returns a pair of [Begin, End) indices of preallocated 6174 /// preprocessed entities that \arg Range encompasses. 6175 std::pair<unsigned, unsigned> 6176 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6177 if (Range.isInvalid()) 6178 return std::make_pair(0,0); 6179 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6180 6181 PreprocessedEntityID BeginID = 6182 findPreprocessedEntity(Range.getBegin(), false); 6183 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6184 return std::make_pair(BeginID, EndID); 6185 } 6186 6187 /// Optionally returns true or false if the preallocated preprocessed 6188 /// entity with index \arg Index came from file \arg FID. 6189 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6190 FileID FID) { 6191 if (FID.isInvalid()) 6192 return false; 6193 6194 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6195 ModuleFile &M = *PPInfo.first; 6196 unsigned LocalIndex = PPInfo.second; 6197 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6198 6199 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6200 if (Loc.isInvalid()) 6201 return false; 6202 6203 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6204 return true; 6205 else 6206 return false; 6207 } 6208 6209 namespace { 6210 6211 /// Visitor used to search for information about a header file. 6212 class HeaderFileInfoVisitor { 6213 const FileEntry *FE; 6214 Optional<HeaderFileInfo> HFI; 6215 6216 public: 6217 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6218 6219 bool operator()(ModuleFile &M) { 6220 HeaderFileInfoLookupTable *Table 6221 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6222 if (!Table) 6223 return false; 6224 6225 // Look in the on-disk hash table for an entry for this file name. 6226 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6227 if (Pos == Table->end()) 6228 return false; 6229 6230 HFI = *Pos; 6231 return true; 6232 } 6233 6234 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6235 }; 6236 6237 } // namespace 6238 6239 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6240 HeaderFileInfoVisitor Visitor(FE); 6241 ModuleMgr.visit(Visitor); 6242 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6243 return *HFI; 6244 6245 return HeaderFileInfo(); 6246 } 6247 6248 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6249 using DiagState = DiagnosticsEngine::DiagState; 6250 SmallVector<DiagState *, 32> DiagStates; 6251 6252 for (ModuleFile &F : ModuleMgr) { 6253 unsigned Idx = 0; 6254 auto &Record = F.PragmaDiagMappings; 6255 if (Record.empty()) 6256 continue; 6257 6258 DiagStates.clear(); 6259 6260 auto ReadDiagState = 6261 [&](const DiagState &BasedOn, SourceLocation Loc, 6262 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6263 unsigned BackrefID = Record[Idx++]; 6264 if (BackrefID != 0) 6265 return DiagStates[BackrefID - 1]; 6266 6267 // A new DiagState was created here. 6268 Diag.DiagStates.push_back(BasedOn); 6269 DiagState *NewState = &Diag.DiagStates.back(); 6270 DiagStates.push_back(NewState); 6271 unsigned Size = Record[Idx++]; 6272 assert(Idx + Size * 2 <= Record.size() && 6273 "Invalid data, not enough diag/map pairs"); 6274 while (Size--) { 6275 unsigned DiagID = Record[Idx++]; 6276 DiagnosticMapping NewMapping = 6277 DiagnosticMapping::deserialize(Record[Idx++]); 6278 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6279 continue; 6280 6281 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6282 6283 // If this mapping was specified as a warning but the severity was 6284 // upgraded due to diagnostic settings, simulate the current diagnostic 6285 // settings (and use a warning). 6286 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6287 NewMapping.setSeverity(diag::Severity::Warning); 6288 NewMapping.setUpgradedFromWarning(false); 6289 } 6290 6291 Mapping = NewMapping; 6292 } 6293 return NewState; 6294 }; 6295 6296 // Read the first state. 6297 DiagState *FirstState; 6298 if (F.Kind == MK_ImplicitModule) { 6299 // Implicitly-built modules are reused with different diagnostic 6300 // settings. Use the initial diagnostic state from Diag to simulate this 6301 // compilation's diagnostic settings. 6302 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6303 DiagStates.push_back(FirstState); 6304 6305 // Skip the initial diagnostic state from the serialized module. 6306 assert(Record[1] == 0 && 6307 "Invalid data, unexpected backref in initial state"); 6308 Idx = 3 + Record[2] * 2; 6309 assert(Idx < Record.size() && 6310 "Invalid data, not enough state change pairs in initial state"); 6311 } else if (F.isModule()) { 6312 // For an explicit module, preserve the flags from the module build 6313 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6314 // -Wblah flags. 6315 unsigned Flags = Record[Idx++]; 6316 DiagState Initial; 6317 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6318 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6319 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6320 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6321 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6322 Initial.ExtBehavior = (diag::Severity)Flags; 6323 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6324 6325 assert(F.OriginalSourceFileID.isValid()); 6326 6327 // Set up the root buffer of the module to start with the initial 6328 // diagnostic state of the module itself, to cover files that contain no 6329 // explicit transitions (for which we did not serialize anything). 6330 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6331 .StateTransitions.push_back({FirstState, 0}); 6332 } else { 6333 // For prefix ASTs, start with whatever the user configured on the 6334 // command line. 6335 Idx++; // Skip flags. 6336 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6337 SourceLocation(), false); 6338 } 6339 6340 // Read the state transitions. 6341 unsigned NumLocations = Record[Idx++]; 6342 while (NumLocations--) { 6343 assert(Idx < Record.size() && 6344 "Invalid data, missing pragma diagnostic states"); 6345 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6346 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6347 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6348 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6349 unsigned Transitions = Record[Idx++]; 6350 6351 // Note that we don't need to set up Parent/ParentOffset here, because 6352 // we won't be changing the diagnostic state within imported FileIDs 6353 // (other than perhaps appending to the main source file, which has no 6354 // parent). 6355 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6356 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6357 for (unsigned I = 0; I != Transitions; ++I) { 6358 unsigned Offset = Record[Idx++]; 6359 auto *State = 6360 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6361 F.StateTransitions.push_back({State, Offset}); 6362 } 6363 } 6364 6365 // Read the final state. 6366 assert(Idx < Record.size() && 6367 "Invalid data, missing final pragma diagnostic state"); 6368 SourceLocation CurStateLoc = 6369 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6370 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6371 6372 if (!F.isModule()) { 6373 Diag.DiagStatesByLoc.CurDiagState = CurState; 6374 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6375 6376 // Preserve the property that the imaginary root file describes the 6377 // current state. 6378 FileID NullFile; 6379 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6380 if (T.empty()) 6381 T.push_back({CurState, 0}); 6382 else 6383 T[0].State = CurState; 6384 } 6385 6386 // Don't try to read these mappings again. 6387 Record.clear(); 6388 } 6389 } 6390 6391 /// Get the correct cursor and offset for loading a type. 6392 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6393 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6394 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6395 ModuleFile *M = I->second; 6396 return RecordLocation( 6397 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() + 6398 M->DeclsBlockStartOffset); 6399 } 6400 6401 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6402 switch (code) { 6403 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6404 case TYPE_##CODE_ID: return Type::CLASS_ID; 6405 #include "clang/Serialization/TypeBitCodes.def" 6406 default: return llvm::None; 6407 } 6408 } 6409 6410 /// Read and return the type with the given index.. 6411 /// 6412 /// The index is the type ID, shifted and minus the number of predefs. This 6413 /// routine actually reads the record corresponding to the type at the given 6414 /// location. It is a helper routine for GetType, which deals with reading type 6415 /// IDs. 6416 QualType ASTReader::readTypeRecord(unsigned Index) { 6417 assert(ContextObj && "reading type with no AST context"); 6418 ASTContext &Context = *ContextObj; 6419 RecordLocation Loc = TypeCursorForIndex(Index); 6420 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6421 6422 // Keep track of where we are in the stream, then jump back there 6423 // after reading this type. 6424 SavedStreamPosition SavedPosition(DeclsCursor); 6425 6426 ReadingKindTracker ReadingKind(Read_Type, *this); 6427 6428 // Note that we are loading a type record. 6429 Deserializing AType(this); 6430 6431 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6432 Error(std::move(Err)); 6433 return QualType(); 6434 } 6435 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6436 if (!RawCode) { 6437 Error(RawCode.takeError()); 6438 return QualType(); 6439 } 6440 6441 ASTRecordReader Record(*this, *Loc.F); 6442 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6443 if (!Code) { 6444 Error(Code.takeError()); 6445 return QualType(); 6446 } 6447 if (Code.get() == TYPE_EXT_QUAL) { 6448 QualType baseType = Record.readQualType(); 6449 Qualifiers quals = Record.readQualifiers(); 6450 return Context.getQualifiedType(baseType, quals); 6451 } 6452 6453 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6454 if (!maybeClass) { 6455 Error("Unexpected code for type"); 6456 return QualType(); 6457 } 6458 6459 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6460 return TypeReader.read(*maybeClass); 6461 } 6462 6463 namespace clang { 6464 6465 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6466 ASTRecordReader &Reader; 6467 6468 SourceLocation readSourceLocation() { 6469 return Reader.readSourceLocation(); 6470 } 6471 6472 TypeSourceInfo *GetTypeSourceInfo() { 6473 return Reader.readTypeSourceInfo(); 6474 } 6475 6476 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6477 return Reader.readNestedNameSpecifierLoc(); 6478 } 6479 6480 Attr *ReadAttr() { 6481 return Reader.readAttr(); 6482 } 6483 6484 public: 6485 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6486 6487 // We want compile-time assurance that we've enumerated all of 6488 // these, so unfortunately we have to declare them first, then 6489 // define them out-of-line. 6490 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6491 #define TYPELOC(CLASS, PARENT) \ 6492 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6493 #include "clang/AST/TypeLocNodes.def" 6494 6495 void VisitFunctionTypeLoc(FunctionTypeLoc); 6496 void VisitArrayTypeLoc(ArrayTypeLoc); 6497 }; 6498 6499 } // namespace clang 6500 6501 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6502 // nothing to do 6503 } 6504 6505 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6506 TL.setBuiltinLoc(readSourceLocation()); 6507 if (TL.needsExtraLocalData()) { 6508 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6509 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt())); 6510 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt())); 6511 TL.setModeAttr(Reader.readInt()); 6512 } 6513 } 6514 6515 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6516 TL.setNameLoc(readSourceLocation()); 6517 } 6518 6519 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6520 TL.setStarLoc(readSourceLocation()); 6521 } 6522 6523 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6524 // nothing to do 6525 } 6526 6527 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6528 // nothing to do 6529 } 6530 6531 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6532 TL.setExpansionLoc(readSourceLocation()); 6533 } 6534 6535 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6536 TL.setCaretLoc(readSourceLocation()); 6537 } 6538 6539 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6540 TL.setAmpLoc(readSourceLocation()); 6541 } 6542 6543 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6544 TL.setAmpAmpLoc(readSourceLocation()); 6545 } 6546 6547 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6548 TL.setStarLoc(readSourceLocation()); 6549 TL.setClassTInfo(GetTypeSourceInfo()); 6550 } 6551 6552 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6553 TL.setLBracketLoc(readSourceLocation()); 6554 TL.setRBracketLoc(readSourceLocation()); 6555 if (Reader.readBool()) 6556 TL.setSizeExpr(Reader.readExpr()); 6557 else 6558 TL.setSizeExpr(nullptr); 6559 } 6560 6561 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6562 VisitArrayTypeLoc(TL); 6563 } 6564 6565 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6566 VisitArrayTypeLoc(TL); 6567 } 6568 6569 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6570 VisitArrayTypeLoc(TL); 6571 } 6572 6573 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6574 DependentSizedArrayTypeLoc TL) { 6575 VisitArrayTypeLoc(TL); 6576 } 6577 6578 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6579 DependentAddressSpaceTypeLoc TL) { 6580 6581 TL.setAttrNameLoc(readSourceLocation()); 6582 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6583 TL.setAttrExprOperand(Reader.readExpr()); 6584 } 6585 6586 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6587 DependentSizedExtVectorTypeLoc TL) { 6588 TL.setNameLoc(readSourceLocation()); 6589 } 6590 6591 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6592 TL.setNameLoc(readSourceLocation()); 6593 } 6594 6595 void TypeLocReader::VisitDependentVectorTypeLoc( 6596 DependentVectorTypeLoc TL) { 6597 TL.setNameLoc(readSourceLocation()); 6598 } 6599 6600 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6601 TL.setNameLoc(readSourceLocation()); 6602 } 6603 6604 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) { 6605 TL.setAttrNameLoc(readSourceLocation()); 6606 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6607 TL.setAttrRowOperand(Reader.readExpr()); 6608 TL.setAttrColumnOperand(Reader.readExpr()); 6609 } 6610 6611 void TypeLocReader::VisitDependentSizedMatrixTypeLoc( 6612 DependentSizedMatrixTypeLoc TL) { 6613 TL.setAttrNameLoc(readSourceLocation()); 6614 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6615 TL.setAttrRowOperand(Reader.readExpr()); 6616 TL.setAttrColumnOperand(Reader.readExpr()); 6617 } 6618 6619 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6620 TL.setLocalRangeBegin(readSourceLocation()); 6621 TL.setLParenLoc(readSourceLocation()); 6622 TL.setRParenLoc(readSourceLocation()); 6623 TL.setExceptionSpecRange(Reader.readSourceRange()); 6624 TL.setLocalRangeEnd(readSourceLocation()); 6625 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6626 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6627 } 6628 } 6629 6630 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6631 VisitFunctionTypeLoc(TL); 6632 } 6633 6634 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6635 VisitFunctionTypeLoc(TL); 6636 } 6637 6638 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6639 TL.setNameLoc(readSourceLocation()); 6640 } 6641 6642 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6643 TL.setNameLoc(readSourceLocation()); 6644 } 6645 6646 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6647 TL.setTypeofLoc(readSourceLocation()); 6648 TL.setLParenLoc(readSourceLocation()); 6649 TL.setRParenLoc(readSourceLocation()); 6650 } 6651 6652 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6653 TL.setTypeofLoc(readSourceLocation()); 6654 TL.setLParenLoc(readSourceLocation()); 6655 TL.setRParenLoc(readSourceLocation()); 6656 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6657 } 6658 6659 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6660 TL.setNameLoc(readSourceLocation()); 6661 } 6662 6663 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6664 TL.setKWLoc(readSourceLocation()); 6665 TL.setLParenLoc(readSourceLocation()); 6666 TL.setRParenLoc(readSourceLocation()); 6667 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6668 } 6669 6670 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6671 TL.setNameLoc(readSourceLocation()); 6672 if (Reader.readBool()) { 6673 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6674 TL.setTemplateKWLoc(readSourceLocation()); 6675 TL.setConceptNameLoc(readSourceLocation()); 6676 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6677 TL.setLAngleLoc(readSourceLocation()); 6678 TL.setRAngleLoc(readSourceLocation()); 6679 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6680 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6681 TL.getTypePtr()->getArg(i).getKind())); 6682 } 6683 } 6684 6685 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6686 DeducedTemplateSpecializationTypeLoc TL) { 6687 TL.setTemplateNameLoc(readSourceLocation()); 6688 } 6689 6690 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6691 TL.setNameLoc(readSourceLocation()); 6692 } 6693 6694 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6695 TL.setNameLoc(readSourceLocation()); 6696 } 6697 6698 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6699 TL.setAttr(ReadAttr()); 6700 } 6701 6702 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6703 TL.setNameLoc(readSourceLocation()); 6704 } 6705 6706 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6707 SubstTemplateTypeParmTypeLoc TL) { 6708 TL.setNameLoc(readSourceLocation()); 6709 } 6710 6711 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6712 SubstTemplateTypeParmPackTypeLoc TL) { 6713 TL.setNameLoc(readSourceLocation()); 6714 } 6715 6716 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6717 TemplateSpecializationTypeLoc TL) { 6718 TL.setTemplateKeywordLoc(readSourceLocation()); 6719 TL.setTemplateNameLoc(readSourceLocation()); 6720 TL.setLAngleLoc(readSourceLocation()); 6721 TL.setRAngleLoc(readSourceLocation()); 6722 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6723 TL.setArgLocInfo( 6724 i, 6725 Reader.readTemplateArgumentLocInfo( 6726 TL.getTypePtr()->getArg(i).getKind())); 6727 } 6728 6729 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6730 TL.setLParenLoc(readSourceLocation()); 6731 TL.setRParenLoc(readSourceLocation()); 6732 } 6733 6734 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6735 TL.setElaboratedKeywordLoc(readSourceLocation()); 6736 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6737 } 6738 6739 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6740 TL.setNameLoc(readSourceLocation()); 6741 } 6742 6743 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6744 TL.setElaboratedKeywordLoc(readSourceLocation()); 6745 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6746 TL.setNameLoc(readSourceLocation()); 6747 } 6748 6749 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6750 DependentTemplateSpecializationTypeLoc TL) { 6751 TL.setElaboratedKeywordLoc(readSourceLocation()); 6752 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6753 TL.setTemplateKeywordLoc(readSourceLocation()); 6754 TL.setTemplateNameLoc(readSourceLocation()); 6755 TL.setLAngleLoc(readSourceLocation()); 6756 TL.setRAngleLoc(readSourceLocation()); 6757 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6758 TL.setArgLocInfo( 6759 I, 6760 Reader.readTemplateArgumentLocInfo( 6761 TL.getTypePtr()->getArg(I).getKind())); 6762 } 6763 6764 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6765 TL.setEllipsisLoc(readSourceLocation()); 6766 } 6767 6768 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6769 TL.setNameLoc(readSourceLocation()); 6770 } 6771 6772 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6773 if (TL.getNumProtocols()) { 6774 TL.setProtocolLAngleLoc(readSourceLocation()); 6775 TL.setProtocolRAngleLoc(readSourceLocation()); 6776 } 6777 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6778 TL.setProtocolLoc(i, readSourceLocation()); 6779 } 6780 6781 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6782 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6783 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6784 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6785 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6786 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6787 TL.setProtocolLAngleLoc(readSourceLocation()); 6788 TL.setProtocolRAngleLoc(readSourceLocation()); 6789 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6790 TL.setProtocolLoc(i, readSourceLocation()); 6791 } 6792 6793 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6794 TL.setStarLoc(readSourceLocation()); 6795 } 6796 6797 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6798 TL.setKWLoc(readSourceLocation()); 6799 TL.setLParenLoc(readSourceLocation()); 6800 TL.setRParenLoc(readSourceLocation()); 6801 } 6802 6803 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6804 TL.setKWLoc(readSourceLocation()); 6805 } 6806 6807 void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) { 6808 TL.setNameLoc(readSourceLocation()); 6809 } 6810 void TypeLocReader::VisitDependentExtIntTypeLoc( 6811 clang::DependentExtIntTypeLoc TL) { 6812 TL.setNameLoc(readSourceLocation()); 6813 } 6814 6815 6816 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6817 TypeLocReader TLR(*this); 6818 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6819 TLR.Visit(TL); 6820 } 6821 6822 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6823 QualType InfoTy = readType(); 6824 if (InfoTy.isNull()) 6825 return nullptr; 6826 6827 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6828 readTypeLoc(TInfo->getTypeLoc()); 6829 return TInfo; 6830 } 6831 6832 QualType ASTReader::GetType(TypeID ID) { 6833 assert(ContextObj && "reading type with no AST context"); 6834 ASTContext &Context = *ContextObj; 6835 6836 unsigned FastQuals = ID & Qualifiers::FastMask; 6837 unsigned Index = ID >> Qualifiers::FastWidth; 6838 6839 if (Index < NUM_PREDEF_TYPE_IDS) { 6840 QualType T; 6841 switch ((PredefinedTypeIDs)Index) { 6842 case PREDEF_TYPE_NULL_ID: 6843 return QualType(); 6844 case PREDEF_TYPE_VOID_ID: 6845 T = Context.VoidTy; 6846 break; 6847 case PREDEF_TYPE_BOOL_ID: 6848 T = Context.BoolTy; 6849 break; 6850 case PREDEF_TYPE_CHAR_U_ID: 6851 case PREDEF_TYPE_CHAR_S_ID: 6852 // FIXME: Check that the signedness of CharTy is correct! 6853 T = Context.CharTy; 6854 break; 6855 case PREDEF_TYPE_UCHAR_ID: 6856 T = Context.UnsignedCharTy; 6857 break; 6858 case PREDEF_TYPE_USHORT_ID: 6859 T = Context.UnsignedShortTy; 6860 break; 6861 case PREDEF_TYPE_UINT_ID: 6862 T = Context.UnsignedIntTy; 6863 break; 6864 case PREDEF_TYPE_ULONG_ID: 6865 T = Context.UnsignedLongTy; 6866 break; 6867 case PREDEF_TYPE_ULONGLONG_ID: 6868 T = Context.UnsignedLongLongTy; 6869 break; 6870 case PREDEF_TYPE_UINT128_ID: 6871 T = Context.UnsignedInt128Ty; 6872 break; 6873 case PREDEF_TYPE_SCHAR_ID: 6874 T = Context.SignedCharTy; 6875 break; 6876 case PREDEF_TYPE_WCHAR_ID: 6877 T = Context.WCharTy; 6878 break; 6879 case PREDEF_TYPE_SHORT_ID: 6880 T = Context.ShortTy; 6881 break; 6882 case PREDEF_TYPE_INT_ID: 6883 T = Context.IntTy; 6884 break; 6885 case PREDEF_TYPE_LONG_ID: 6886 T = Context.LongTy; 6887 break; 6888 case PREDEF_TYPE_LONGLONG_ID: 6889 T = Context.LongLongTy; 6890 break; 6891 case PREDEF_TYPE_INT128_ID: 6892 T = Context.Int128Ty; 6893 break; 6894 case PREDEF_TYPE_BFLOAT16_ID: 6895 T = Context.BFloat16Ty; 6896 break; 6897 case PREDEF_TYPE_HALF_ID: 6898 T = Context.HalfTy; 6899 break; 6900 case PREDEF_TYPE_FLOAT_ID: 6901 T = Context.FloatTy; 6902 break; 6903 case PREDEF_TYPE_DOUBLE_ID: 6904 T = Context.DoubleTy; 6905 break; 6906 case PREDEF_TYPE_LONGDOUBLE_ID: 6907 T = Context.LongDoubleTy; 6908 break; 6909 case PREDEF_TYPE_SHORT_ACCUM_ID: 6910 T = Context.ShortAccumTy; 6911 break; 6912 case PREDEF_TYPE_ACCUM_ID: 6913 T = Context.AccumTy; 6914 break; 6915 case PREDEF_TYPE_LONG_ACCUM_ID: 6916 T = Context.LongAccumTy; 6917 break; 6918 case PREDEF_TYPE_USHORT_ACCUM_ID: 6919 T = Context.UnsignedShortAccumTy; 6920 break; 6921 case PREDEF_TYPE_UACCUM_ID: 6922 T = Context.UnsignedAccumTy; 6923 break; 6924 case PREDEF_TYPE_ULONG_ACCUM_ID: 6925 T = Context.UnsignedLongAccumTy; 6926 break; 6927 case PREDEF_TYPE_SHORT_FRACT_ID: 6928 T = Context.ShortFractTy; 6929 break; 6930 case PREDEF_TYPE_FRACT_ID: 6931 T = Context.FractTy; 6932 break; 6933 case PREDEF_TYPE_LONG_FRACT_ID: 6934 T = Context.LongFractTy; 6935 break; 6936 case PREDEF_TYPE_USHORT_FRACT_ID: 6937 T = Context.UnsignedShortFractTy; 6938 break; 6939 case PREDEF_TYPE_UFRACT_ID: 6940 T = Context.UnsignedFractTy; 6941 break; 6942 case PREDEF_TYPE_ULONG_FRACT_ID: 6943 T = Context.UnsignedLongFractTy; 6944 break; 6945 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6946 T = Context.SatShortAccumTy; 6947 break; 6948 case PREDEF_TYPE_SAT_ACCUM_ID: 6949 T = Context.SatAccumTy; 6950 break; 6951 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6952 T = Context.SatLongAccumTy; 6953 break; 6954 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6955 T = Context.SatUnsignedShortAccumTy; 6956 break; 6957 case PREDEF_TYPE_SAT_UACCUM_ID: 6958 T = Context.SatUnsignedAccumTy; 6959 break; 6960 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6961 T = Context.SatUnsignedLongAccumTy; 6962 break; 6963 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6964 T = Context.SatShortFractTy; 6965 break; 6966 case PREDEF_TYPE_SAT_FRACT_ID: 6967 T = Context.SatFractTy; 6968 break; 6969 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6970 T = Context.SatLongFractTy; 6971 break; 6972 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6973 T = Context.SatUnsignedShortFractTy; 6974 break; 6975 case PREDEF_TYPE_SAT_UFRACT_ID: 6976 T = Context.SatUnsignedFractTy; 6977 break; 6978 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6979 T = Context.SatUnsignedLongFractTy; 6980 break; 6981 case PREDEF_TYPE_FLOAT16_ID: 6982 T = Context.Float16Ty; 6983 break; 6984 case PREDEF_TYPE_FLOAT128_ID: 6985 T = Context.Float128Ty; 6986 break; 6987 case PREDEF_TYPE_OVERLOAD_ID: 6988 T = Context.OverloadTy; 6989 break; 6990 case PREDEF_TYPE_BOUND_MEMBER: 6991 T = Context.BoundMemberTy; 6992 break; 6993 case PREDEF_TYPE_PSEUDO_OBJECT: 6994 T = Context.PseudoObjectTy; 6995 break; 6996 case PREDEF_TYPE_DEPENDENT_ID: 6997 T = Context.DependentTy; 6998 break; 6999 case PREDEF_TYPE_UNKNOWN_ANY: 7000 T = Context.UnknownAnyTy; 7001 break; 7002 case PREDEF_TYPE_NULLPTR_ID: 7003 T = Context.NullPtrTy; 7004 break; 7005 case PREDEF_TYPE_CHAR8_ID: 7006 T = Context.Char8Ty; 7007 break; 7008 case PREDEF_TYPE_CHAR16_ID: 7009 T = Context.Char16Ty; 7010 break; 7011 case PREDEF_TYPE_CHAR32_ID: 7012 T = Context.Char32Ty; 7013 break; 7014 case PREDEF_TYPE_OBJC_ID: 7015 T = Context.ObjCBuiltinIdTy; 7016 break; 7017 case PREDEF_TYPE_OBJC_CLASS: 7018 T = Context.ObjCBuiltinClassTy; 7019 break; 7020 case PREDEF_TYPE_OBJC_SEL: 7021 T = Context.ObjCBuiltinSelTy; 7022 break; 7023 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 7024 case PREDEF_TYPE_##Id##_ID: \ 7025 T = Context.SingletonId; \ 7026 break; 7027 #include "clang/Basic/OpenCLImageTypes.def" 7028 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 7029 case PREDEF_TYPE_##Id##_ID: \ 7030 T = Context.Id##Ty; \ 7031 break; 7032 #include "clang/Basic/OpenCLExtensionTypes.def" 7033 case PREDEF_TYPE_SAMPLER_ID: 7034 T = Context.OCLSamplerTy; 7035 break; 7036 case PREDEF_TYPE_EVENT_ID: 7037 T = Context.OCLEventTy; 7038 break; 7039 case PREDEF_TYPE_CLK_EVENT_ID: 7040 T = Context.OCLClkEventTy; 7041 break; 7042 case PREDEF_TYPE_QUEUE_ID: 7043 T = Context.OCLQueueTy; 7044 break; 7045 case PREDEF_TYPE_RESERVE_ID_ID: 7046 T = Context.OCLReserveIDTy; 7047 break; 7048 case PREDEF_TYPE_AUTO_DEDUCT: 7049 T = Context.getAutoDeductType(); 7050 break; 7051 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 7052 T = Context.getAutoRRefDeductType(); 7053 break; 7054 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 7055 T = Context.ARCUnbridgedCastTy; 7056 break; 7057 case PREDEF_TYPE_BUILTIN_FN: 7058 T = Context.BuiltinFnTy; 7059 break; 7060 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX: 7061 T = Context.IncompleteMatrixIdxTy; 7062 break; 7063 case PREDEF_TYPE_OMP_ARRAY_SECTION: 7064 T = Context.OMPArraySectionTy; 7065 break; 7066 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 7067 T = Context.OMPArraySectionTy; 7068 break; 7069 case PREDEF_TYPE_OMP_ITERATOR: 7070 T = Context.OMPIteratorTy; 7071 break; 7072 #define SVE_TYPE(Name, Id, SingletonId) \ 7073 case PREDEF_TYPE_##Id##_ID: \ 7074 T = Context.SingletonId; \ 7075 break; 7076 #include "clang/Basic/AArch64SVEACLETypes.def" 7077 #define PPC_VECTOR_TYPE(Name, Id, Size) \ 7078 case PREDEF_TYPE_##Id##_ID: \ 7079 T = Context.Id##Ty; \ 7080 break; 7081 #include "clang/Basic/PPCTypes.def" 7082 #define RVV_TYPE(Name, Id, SingletonId) \ 7083 case PREDEF_TYPE_##Id##_ID: \ 7084 T = Context.SingletonId; \ 7085 break; 7086 #include "clang/Basic/RISCVVTypes.def" 7087 } 7088 7089 assert(!T.isNull() && "Unknown predefined type"); 7090 return T.withFastQualifiers(FastQuals); 7091 } 7092 7093 Index -= NUM_PREDEF_TYPE_IDS; 7094 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 7095 if (TypesLoaded[Index].isNull()) { 7096 TypesLoaded[Index] = readTypeRecord(Index); 7097 if (TypesLoaded[Index].isNull()) 7098 return QualType(); 7099 7100 TypesLoaded[Index]->setFromAST(); 7101 if (DeserializationListener) 7102 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 7103 TypesLoaded[Index]); 7104 } 7105 7106 return TypesLoaded[Index].withFastQualifiers(FastQuals); 7107 } 7108 7109 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 7110 return GetType(getGlobalTypeID(F, LocalID)); 7111 } 7112 7113 serialization::TypeID 7114 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7115 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7116 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7117 7118 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7119 return LocalID; 7120 7121 if (!F.ModuleOffsetMap.empty()) 7122 ReadModuleOffsetMap(F); 7123 7124 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7125 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7126 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7127 7128 unsigned GlobalIndex = LocalIndex + I->second; 7129 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7130 } 7131 7132 TemplateArgumentLocInfo 7133 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7134 switch (Kind) { 7135 case TemplateArgument::Expression: 7136 return readExpr(); 7137 case TemplateArgument::Type: 7138 return readTypeSourceInfo(); 7139 case TemplateArgument::Template: { 7140 NestedNameSpecifierLoc QualifierLoc = 7141 readNestedNameSpecifierLoc(); 7142 SourceLocation TemplateNameLoc = readSourceLocation(); 7143 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7144 TemplateNameLoc, SourceLocation()); 7145 } 7146 case TemplateArgument::TemplateExpansion: { 7147 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7148 SourceLocation TemplateNameLoc = readSourceLocation(); 7149 SourceLocation EllipsisLoc = readSourceLocation(); 7150 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7151 TemplateNameLoc, EllipsisLoc); 7152 } 7153 case TemplateArgument::Null: 7154 case TemplateArgument::Integral: 7155 case TemplateArgument::Declaration: 7156 case TemplateArgument::NullPtr: 7157 case TemplateArgument::Pack: 7158 // FIXME: Is this right? 7159 return TemplateArgumentLocInfo(); 7160 } 7161 llvm_unreachable("unexpected template argument loc"); 7162 } 7163 7164 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7165 TemplateArgument Arg = readTemplateArgument(); 7166 7167 if (Arg.getKind() == TemplateArgument::Expression) { 7168 if (readBool()) // bool InfoHasSameExpr. 7169 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7170 } 7171 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7172 } 7173 7174 const ASTTemplateArgumentListInfo * 7175 ASTRecordReader::readASTTemplateArgumentListInfo() { 7176 SourceLocation LAngleLoc = readSourceLocation(); 7177 SourceLocation RAngleLoc = readSourceLocation(); 7178 unsigned NumArgsAsWritten = readInt(); 7179 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7180 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7181 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7182 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7183 } 7184 7185 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7186 return GetDecl(ID); 7187 } 7188 7189 void ASTReader::CompleteRedeclChain(const Decl *D) { 7190 if (NumCurrentElementsDeserializing) { 7191 // We arrange to not care about the complete redeclaration chain while we're 7192 // deserializing. Just remember that the AST has marked this one as complete 7193 // but that it's not actually complete yet, so we know we still need to 7194 // complete it later. 7195 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7196 return; 7197 } 7198 7199 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7200 7201 // If this is a named declaration, complete it by looking it up 7202 // within its context. 7203 // 7204 // FIXME: Merging a function definition should merge 7205 // all mergeable entities within it. 7206 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7207 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7208 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7209 if (!getContext().getLangOpts().CPlusPlus && 7210 isa<TranslationUnitDecl>(DC)) { 7211 // Outside of C++, we don't have a lookup table for the TU, so update 7212 // the identifier instead. (For C++ modules, we don't store decls 7213 // in the serialized identifier table, so we do the lookup in the TU.) 7214 auto *II = Name.getAsIdentifierInfo(); 7215 assert(II && "non-identifier name in C?"); 7216 if (II->isOutOfDate()) 7217 updateOutOfDateIdentifier(*II); 7218 } else 7219 DC->lookup(Name); 7220 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7221 // Find all declarations of this kind from the relevant context. 7222 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7223 auto *DC = cast<DeclContext>(DCDecl); 7224 SmallVector<Decl*, 8> Decls; 7225 FindExternalLexicalDecls( 7226 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7227 } 7228 } 7229 } 7230 7231 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7232 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7233 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7234 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7235 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7236 if (auto *Template = FD->getPrimaryTemplate()) 7237 Template->LoadLazySpecializations(); 7238 } 7239 } 7240 7241 CXXCtorInitializer ** 7242 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7243 RecordLocation Loc = getLocalBitOffset(Offset); 7244 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7245 SavedStreamPosition SavedPosition(Cursor); 7246 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7247 Error(std::move(Err)); 7248 return nullptr; 7249 } 7250 ReadingKindTracker ReadingKind(Read_Decl, *this); 7251 7252 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7253 if (!MaybeCode) { 7254 Error(MaybeCode.takeError()); 7255 return nullptr; 7256 } 7257 unsigned Code = MaybeCode.get(); 7258 7259 ASTRecordReader Record(*this, *Loc.F); 7260 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7261 if (!MaybeRecCode) { 7262 Error(MaybeRecCode.takeError()); 7263 return nullptr; 7264 } 7265 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7266 Error("malformed AST file: missing C++ ctor initializers"); 7267 return nullptr; 7268 } 7269 7270 return Record.readCXXCtorInitializers(); 7271 } 7272 7273 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7274 assert(ContextObj && "reading base specifiers with no AST context"); 7275 ASTContext &Context = *ContextObj; 7276 7277 RecordLocation Loc = getLocalBitOffset(Offset); 7278 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7279 SavedStreamPosition SavedPosition(Cursor); 7280 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7281 Error(std::move(Err)); 7282 return nullptr; 7283 } 7284 ReadingKindTracker ReadingKind(Read_Decl, *this); 7285 7286 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7287 if (!MaybeCode) { 7288 Error(MaybeCode.takeError()); 7289 return nullptr; 7290 } 7291 unsigned Code = MaybeCode.get(); 7292 7293 ASTRecordReader Record(*this, *Loc.F); 7294 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7295 if (!MaybeRecCode) { 7296 Error(MaybeCode.takeError()); 7297 return nullptr; 7298 } 7299 unsigned RecCode = MaybeRecCode.get(); 7300 7301 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7302 Error("malformed AST file: missing C++ base specifiers"); 7303 return nullptr; 7304 } 7305 7306 unsigned NumBases = Record.readInt(); 7307 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7308 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7309 for (unsigned I = 0; I != NumBases; ++I) 7310 Bases[I] = Record.readCXXBaseSpecifier(); 7311 return Bases; 7312 } 7313 7314 serialization::DeclID 7315 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7316 if (LocalID < NUM_PREDEF_DECL_IDS) 7317 return LocalID; 7318 7319 if (!F.ModuleOffsetMap.empty()) 7320 ReadModuleOffsetMap(F); 7321 7322 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7323 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7324 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7325 7326 return LocalID + I->second; 7327 } 7328 7329 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7330 ModuleFile &M) const { 7331 // Predefined decls aren't from any module. 7332 if (ID < NUM_PREDEF_DECL_IDS) 7333 return false; 7334 7335 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7336 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7337 } 7338 7339 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7340 if (!D->isFromASTFile()) 7341 return nullptr; 7342 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7343 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7344 return I->second; 7345 } 7346 7347 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7348 if (ID < NUM_PREDEF_DECL_IDS) 7349 return SourceLocation(); 7350 7351 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7352 7353 if (Index > DeclsLoaded.size()) { 7354 Error("declaration ID out-of-range for AST file"); 7355 return SourceLocation(); 7356 } 7357 7358 if (Decl *D = DeclsLoaded[Index]) 7359 return D->getLocation(); 7360 7361 SourceLocation Loc; 7362 DeclCursorForID(ID, Loc); 7363 return Loc; 7364 } 7365 7366 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7367 switch (ID) { 7368 case PREDEF_DECL_NULL_ID: 7369 return nullptr; 7370 7371 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7372 return Context.getTranslationUnitDecl(); 7373 7374 case PREDEF_DECL_OBJC_ID_ID: 7375 return Context.getObjCIdDecl(); 7376 7377 case PREDEF_DECL_OBJC_SEL_ID: 7378 return Context.getObjCSelDecl(); 7379 7380 case PREDEF_DECL_OBJC_CLASS_ID: 7381 return Context.getObjCClassDecl(); 7382 7383 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7384 return Context.getObjCProtocolDecl(); 7385 7386 case PREDEF_DECL_INT_128_ID: 7387 return Context.getInt128Decl(); 7388 7389 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7390 return Context.getUInt128Decl(); 7391 7392 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7393 return Context.getObjCInstanceTypeDecl(); 7394 7395 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7396 return Context.getBuiltinVaListDecl(); 7397 7398 case PREDEF_DECL_VA_LIST_TAG: 7399 return Context.getVaListTagDecl(); 7400 7401 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7402 return Context.getBuiltinMSVaListDecl(); 7403 7404 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7405 return Context.getMSGuidTagDecl(); 7406 7407 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7408 return Context.getExternCContextDecl(); 7409 7410 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7411 return Context.getMakeIntegerSeqDecl(); 7412 7413 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7414 return Context.getCFConstantStringDecl(); 7415 7416 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7417 return Context.getCFConstantStringTagDecl(); 7418 7419 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7420 return Context.getTypePackElementDecl(); 7421 } 7422 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7423 } 7424 7425 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7426 assert(ContextObj && "reading decl with no AST context"); 7427 if (ID < NUM_PREDEF_DECL_IDS) { 7428 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7429 if (D) { 7430 // Track that we have merged the declaration with ID \p ID into the 7431 // pre-existing predefined declaration \p D. 7432 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7433 if (Merged.empty()) 7434 Merged.push_back(ID); 7435 } 7436 return D; 7437 } 7438 7439 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7440 7441 if (Index >= DeclsLoaded.size()) { 7442 assert(0 && "declaration ID out-of-range for AST file"); 7443 Error("declaration ID out-of-range for AST file"); 7444 return nullptr; 7445 } 7446 7447 return DeclsLoaded[Index]; 7448 } 7449 7450 Decl *ASTReader::GetDecl(DeclID ID) { 7451 if (ID < NUM_PREDEF_DECL_IDS) 7452 return GetExistingDecl(ID); 7453 7454 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7455 7456 if (Index >= DeclsLoaded.size()) { 7457 assert(0 && "declaration ID out-of-range for AST file"); 7458 Error("declaration ID out-of-range for AST file"); 7459 return nullptr; 7460 } 7461 7462 if (!DeclsLoaded[Index]) { 7463 ReadDeclRecord(ID); 7464 if (DeserializationListener) 7465 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7466 } 7467 7468 return DeclsLoaded[Index]; 7469 } 7470 7471 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7472 DeclID GlobalID) { 7473 if (GlobalID < NUM_PREDEF_DECL_IDS) 7474 return GlobalID; 7475 7476 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7477 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7478 ModuleFile *Owner = I->second; 7479 7480 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7481 = M.GlobalToLocalDeclIDs.find(Owner); 7482 if (Pos == M.GlobalToLocalDeclIDs.end()) 7483 return 0; 7484 7485 return GlobalID - Owner->BaseDeclID + Pos->second; 7486 } 7487 7488 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7489 const RecordData &Record, 7490 unsigned &Idx) { 7491 if (Idx >= Record.size()) { 7492 Error("Corrupted AST file"); 7493 return 0; 7494 } 7495 7496 return getGlobalDeclID(F, Record[Idx++]); 7497 } 7498 7499 /// Resolve the offset of a statement into a statement. 7500 /// 7501 /// This operation will read a new statement from the external 7502 /// source each time it is called, and is meant to be used via a 7503 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7504 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7505 // Switch case IDs are per Decl. 7506 ClearSwitchCaseIDs(); 7507 7508 // Offset here is a global offset across the entire chain. 7509 RecordLocation Loc = getLocalBitOffset(Offset); 7510 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7511 Error(std::move(Err)); 7512 return nullptr; 7513 } 7514 assert(NumCurrentElementsDeserializing == 0 && 7515 "should not be called while already deserializing"); 7516 Deserializing D(this); 7517 return ReadStmtFromStream(*Loc.F); 7518 } 7519 7520 void ASTReader::FindExternalLexicalDecls( 7521 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7522 SmallVectorImpl<Decl *> &Decls) { 7523 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7524 7525 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7526 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7527 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7528 auto K = (Decl::Kind)+LexicalDecls[I]; 7529 if (!IsKindWeWant(K)) 7530 continue; 7531 7532 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7533 7534 // Don't add predefined declarations to the lexical context more 7535 // than once. 7536 if (ID < NUM_PREDEF_DECL_IDS) { 7537 if (PredefsVisited[ID]) 7538 continue; 7539 7540 PredefsVisited[ID] = true; 7541 } 7542 7543 if (Decl *D = GetLocalDecl(*M, ID)) { 7544 assert(D->getKind() == K && "wrong kind for lexical decl"); 7545 if (!DC->isDeclInLexicalTraversal(D)) 7546 Decls.push_back(D); 7547 } 7548 } 7549 }; 7550 7551 if (isa<TranslationUnitDecl>(DC)) { 7552 for (auto Lexical : TULexicalDecls) 7553 Visit(Lexical.first, Lexical.second); 7554 } else { 7555 auto I = LexicalDecls.find(DC); 7556 if (I != LexicalDecls.end()) 7557 Visit(I->second.first, I->second.second); 7558 } 7559 7560 ++NumLexicalDeclContextsRead; 7561 } 7562 7563 namespace { 7564 7565 class DeclIDComp { 7566 ASTReader &Reader; 7567 ModuleFile &Mod; 7568 7569 public: 7570 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7571 7572 bool operator()(LocalDeclID L, LocalDeclID R) const { 7573 SourceLocation LHS = getLocation(L); 7574 SourceLocation RHS = getLocation(R); 7575 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7576 } 7577 7578 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7579 SourceLocation RHS = getLocation(R); 7580 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7581 } 7582 7583 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7584 SourceLocation LHS = getLocation(L); 7585 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7586 } 7587 7588 SourceLocation getLocation(LocalDeclID ID) const { 7589 return Reader.getSourceManager().getFileLoc( 7590 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7591 } 7592 }; 7593 7594 } // namespace 7595 7596 void ASTReader::FindFileRegionDecls(FileID File, 7597 unsigned Offset, unsigned Length, 7598 SmallVectorImpl<Decl *> &Decls) { 7599 SourceManager &SM = getSourceManager(); 7600 7601 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7602 if (I == FileDeclIDs.end()) 7603 return; 7604 7605 FileDeclsInfo &DInfo = I->second; 7606 if (DInfo.Decls.empty()) 7607 return; 7608 7609 SourceLocation 7610 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7611 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7612 7613 DeclIDComp DIDComp(*this, *DInfo.Mod); 7614 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7615 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7616 if (BeginIt != DInfo.Decls.begin()) 7617 --BeginIt; 7618 7619 // If we are pointing at a top-level decl inside an objc container, we need 7620 // to backtrack until we find it otherwise we will fail to report that the 7621 // region overlaps with an objc container. 7622 while (BeginIt != DInfo.Decls.begin() && 7623 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7624 ->isTopLevelDeclInObjCContainer()) 7625 --BeginIt; 7626 7627 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7628 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7629 if (EndIt != DInfo.Decls.end()) 7630 ++EndIt; 7631 7632 for (ArrayRef<serialization::LocalDeclID>::iterator 7633 DIt = BeginIt; DIt != EndIt; ++DIt) 7634 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7635 } 7636 7637 bool 7638 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7639 DeclarationName Name) { 7640 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7641 "DeclContext has no visible decls in storage"); 7642 if (!Name) 7643 return false; 7644 7645 auto It = Lookups.find(DC); 7646 if (It == Lookups.end()) 7647 return false; 7648 7649 Deserializing LookupResults(this); 7650 7651 // Load the list of declarations. 7652 SmallVector<NamedDecl *, 64> Decls; 7653 for (DeclID ID : It->second.Table.find(Name)) { 7654 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7655 if (ND->getDeclName() == Name) 7656 Decls.push_back(ND); 7657 } 7658 7659 ++NumVisibleDeclContextsRead; 7660 SetExternalVisibleDeclsForName(DC, Name, Decls); 7661 return !Decls.empty(); 7662 } 7663 7664 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7665 if (!DC->hasExternalVisibleStorage()) 7666 return; 7667 7668 auto It = Lookups.find(DC); 7669 assert(It != Lookups.end() && 7670 "have external visible storage but no lookup tables"); 7671 7672 DeclsMap Decls; 7673 7674 for (DeclID ID : It->second.Table.findAll()) { 7675 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7676 Decls[ND->getDeclName()].push_back(ND); 7677 } 7678 7679 ++NumVisibleDeclContextsRead; 7680 7681 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7682 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7683 } 7684 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7685 } 7686 7687 const serialization::reader::DeclContextLookupTable * 7688 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7689 auto I = Lookups.find(Primary); 7690 return I == Lookups.end() ? nullptr : &I->second; 7691 } 7692 7693 /// Under non-PCH compilation the consumer receives the objc methods 7694 /// before receiving the implementation, and codegen depends on this. 7695 /// We simulate this by deserializing and passing to consumer the methods of the 7696 /// implementation before passing the deserialized implementation decl. 7697 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7698 ASTConsumer *Consumer) { 7699 assert(ImplD && Consumer); 7700 7701 for (auto *I : ImplD->methods()) 7702 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7703 7704 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7705 } 7706 7707 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7708 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7709 PassObjCImplDeclToConsumer(ImplD, Consumer); 7710 else 7711 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7712 } 7713 7714 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7715 this->Consumer = Consumer; 7716 7717 if (Consumer) 7718 PassInterestingDeclsToConsumer(); 7719 7720 if (DeserializationListener) 7721 DeserializationListener->ReaderInitialized(this); 7722 } 7723 7724 void ASTReader::PrintStats() { 7725 std::fprintf(stderr, "*** AST File Statistics:\n"); 7726 7727 unsigned NumTypesLoaded 7728 = TypesLoaded.size() - std::count(TypesLoaded.begin(), TypesLoaded.end(), 7729 QualType()); 7730 unsigned NumDeclsLoaded 7731 = DeclsLoaded.size() - std::count(DeclsLoaded.begin(), DeclsLoaded.end(), 7732 (Decl *)nullptr); 7733 unsigned NumIdentifiersLoaded 7734 = IdentifiersLoaded.size() - std::count(IdentifiersLoaded.begin(), 7735 IdentifiersLoaded.end(), 7736 (IdentifierInfo *)nullptr); 7737 unsigned NumMacrosLoaded 7738 = MacrosLoaded.size() - std::count(MacrosLoaded.begin(), 7739 MacrosLoaded.end(), 7740 (MacroInfo *)nullptr); 7741 unsigned NumSelectorsLoaded 7742 = SelectorsLoaded.size() - std::count(SelectorsLoaded.begin(), 7743 SelectorsLoaded.end(), 7744 Selector()); 7745 7746 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7747 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7748 NumSLocEntriesRead, TotalNumSLocEntries, 7749 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7750 if (!TypesLoaded.empty()) 7751 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7752 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7753 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7754 if (!DeclsLoaded.empty()) 7755 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7756 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7757 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7758 if (!IdentifiersLoaded.empty()) 7759 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7760 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7761 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7762 if (!MacrosLoaded.empty()) 7763 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7764 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7765 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7766 if (!SelectorsLoaded.empty()) 7767 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7768 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7769 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7770 if (TotalNumStatements) 7771 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7772 NumStatementsRead, TotalNumStatements, 7773 ((float)NumStatementsRead/TotalNumStatements * 100)); 7774 if (TotalNumMacros) 7775 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7776 NumMacrosRead, TotalNumMacros, 7777 ((float)NumMacrosRead/TotalNumMacros * 100)); 7778 if (TotalLexicalDeclContexts) 7779 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7780 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7781 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7782 * 100)); 7783 if (TotalVisibleDeclContexts) 7784 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7785 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7786 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7787 * 100)); 7788 if (TotalNumMethodPoolEntries) 7789 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7790 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7791 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7792 * 100)); 7793 if (NumMethodPoolLookups) 7794 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7795 NumMethodPoolHits, NumMethodPoolLookups, 7796 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7797 if (NumMethodPoolTableLookups) 7798 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7799 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7800 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7801 * 100.0)); 7802 if (NumIdentifierLookupHits) 7803 std::fprintf(stderr, 7804 " %u / %u identifier table lookups succeeded (%f%%)\n", 7805 NumIdentifierLookupHits, NumIdentifierLookups, 7806 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7807 7808 if (GlobalIndex) { 7809 std::fprintf(stderr, "\n"); 7810 GlobalIndex->printStats(); 7811 } 7812 7813 std::fprintf(stderr, "\n"); 7814 dump(); 7815 std::fprintf(stderr, "\n"); 7816 } 7817 7818 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7819 LLVM_DUMP_METHOD static void 7820 dumpModuleIDMap(StringRef Name, 7821 const ContinuousRangeMap<Key, ModuleFile *, 7822 InitialCapacity> &Map) { 7823 if (Map.begin() == Map.end()) 7824 return; 7825 7826 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7827 7828 llvm::errs() << Name << ":\n"; 7829 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7830 I != IEnd; ++I) { 7831 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7832 << "\n"; 7833 } 7834 } 7835 7836 LLVM_DUMP_METHOD void ASTReader::dump() { 7837 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7838 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7839 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7840 dumpModuleIDMap("Global type map", GlobalTypeMap); 7841 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7842 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7843 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7844 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7845 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7846 dumpModuleIDMap("Global preprocessed entity map", 7847 GlobalPreprocessedEntityMap); 7848 7849 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7850 for (ModuleFile &M : ModuleMgr) 7851 M.dump(); 7852 } 7853 7854 /// Return the amount of memory used by memory buffers, breaking down 7855 /// by heap-backed versus mmap'ed memory. 7856 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7857 for (ModuleFile &I : ModuleMgr) { 7858 if (llvm::MemoryBuffer *buf = I.Buffer) { 7859 size_t bytes = buf->getBufferSize(); 7860 switch (buf->getBufferKind()) { 7861 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7862 sizes.malloc_bytes += bytes; 7863 break; 7864 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7865 sizes.mmap_bytes += bytes; 7866 break; 7867 } 7868 } 7869 } 7870 } 7871 7872 void ASTReader::InitializeSema(Sema &S) { 7873 SemaObj = &S; 7874 S.addExternalSource(this); 7875 7876 // Makes sure any declarations that were deserialized "too early" 7877 // still get added to the identifier's declaration chains. 7878 for (uint64_t ID : PreloadedDeclIDs) { 7879 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7880 pushExternalDeclIntoScope(D, D->getDeclName()); 7881 } 7882 PreloadedDeclIDs.clear(); 7883 7884 // FIXME: What happens if these are changed by a module import? 7885 if (!FPPragmaOptions.empty()) { 7886 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7887 FPOptionsOverride NewOverrides = 7888 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]); 7889 SemaObj->CurFPFeatures = 7890 NewOverrides.applyOverrides(SemaObj->getLangOpts()); 7891 } 7892 7893 SemaObj->OpenCLFeatures = OpenCLExtensions; 7894 SemaObj->OpenCLTypeExtMap = OpenCLTypeExtMap; 7895 SemaObj->OpenCLDeclExtMap = OpenCLDeclExtMap; 7896 7897 UpdateSema(); 7898 } 7899 7900 void ASTReader::UpdateSema() { 7901 assert(SemaObj && "no Sema to update"); 7902 7903 // Load the offsets of the declarations that Sema references. 7904 // They will be lazily deserialized when needed. 7905 if (!SemaDeclRefs.empty()) { 7906 assert(SemaDeclRefs.size() % 3 == 0); 7907 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7908 if (!SemaObj->StdNamespace) 7909 SemaObj->StdNamespace = SemaDeclRefs[I]; 7910 if (!SemaObj->StdBadAlloc) 7911 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7912 if (!SemaObj->StdAlignValT) 7913 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7914 } 7915 SemaDeclRefs.clear(); 7916 } 7917 7918 // Update the state of pragmas. Use the same API as if we had encountered the 7919 // pragma in the source. 7920 if(OptimizeOffPragmaLocation.isValid()) 7921 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7922 if (PragmaMSStructState != -1) 7923 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7924 if (PointersToMembersPragmaLocation.isValid()) { 7925 SemaObj->ActOnPragmaMSPointersToMembers( 7926 (LangOptions::PragmaMSPointersToMembersKind) 7927 PragmaMSPointersToMembersState, 7928 PointersToMembersPragmaLocation); 7929 } 7930 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7931 7932 if (PragmaAlignPackCurrentValue) { 7933 // The bottom of the stack might have a default value. It must be adjusted 7934 // to the current value to ensure that the packing state is preserved after 7935 // popping entries that were included/imported from a PCH/module. 7936 bool DropFirst = false; 7937 if (!PragmaAlignPackStack.empty() && 7938 PragmaAlignPackStack.front().Location.isInvalid()) { 7939 assert(PragmaAlignPackStack.front().Value == 7940 SemaObj->AlignPackStack.DefaultValue && 7941 "Expected a default alignment value"); 7942 SemaObj->AlignPackStack.Stack.emplace_back( 7943 PragmaAlignPackStack.front().SlotLabel, 7944 SemaObj->AlignPackStack.CurrentValue, 7945 SemaObj->AlignPackStack.CurrentPragmaLocation, 7946 PragmaAlignPackStack.front().PushLocation); 7947 DropFirst = true; 7948 } 7949 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack) 7950 .drop_front(DropFirst ? 1 : 0)) { 7951 SemaObj->AlignPackStack.Stack.emplace_back( 7952 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7953 } 7954 if (PragmaAlignPackCurrentLocation.isInvalid()) { 7955 assert(*PragmaAlignPackCurrentValue == 7956 SemaObj->AlignPackStack.DefaultValue && 7957 "Expected a default align and pack value"); 7958 // Keep the current values. 7959 } else { 7960 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue; 7961 SemaObj->AlignPackStack.CurrentPragmaLocation = 7962 PragmaAlignPackCurrentLocation; 7963 } 7964 } 7965 if (FpPragmaCurrentValue) { 7966 // The bottom of the stack might have a default value. It must be adjusted 7967 // to the current value to ensure that fp-pragma state is preserved after 7968 // popping entries that were included/imported from a PCH/module. 7969 bool DropFirst = false; 7970 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7971 assert(FpPragmaStack.front().Value == 7972 SemaObj->FpPragmaStack.DefaultValue && 7973 "Expected a default pragma float_control value"); 7974 SemaObj->FpPragmaStack.Stack.emplace_back( 7975 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7976 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7977 FpPragmaStack.front().PushLocation); 7978 DropFirst = true; 7979 } 7980 for (const auto &Entry : 7981 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7982 SemaObj->FpPragmaStack.Stack.emplace_back( 7983 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7984 if (FpPragmaCurrentLocation.isInvalid()) { 7985 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 7986 "Expected a default pragma float_control value"); 7987 // Keep the current values. 7988 } else { 7989 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 7990 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 7991 } 7992 } 7993 7994 // For non-modular AST files, restore visiblity of modules. 7995 for (auto &Import : ImportedModules) { 7996 if (Import.ImportLoc.isInvalid()) 7997 continue; 7998 if (Module *Imported = getSubmodule(Import.ID)) { 7999 SemaObj->makeModuleVisible(Imported, Import.ImportLoc); 8000 } 8001 } 8002 } 8003 8004 IdentifierInfo *ASTReader::get(StringRef Name) { 8005 // Note that we are loading an identifier. 8006 Deserializing AnIdentifier(this); 8007 8008 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 8009 NumIdentifierLookups, 8010 NumIdentifierLookupHits); 8011 8012 // We don't need to do identifier table lookups in C++ modules (we preload 8013 // all interesting declarations, and don't need to use the scope for name 8014 // lookups). Perform the lookup in PCH files, though, since we don't build 8015 // a complete initial identifier table if we're carrying on from a PCH. 8016 if (PP.getLangOpts().CPlusPlus) { 8017 for (auto F : ModuleMgr.pch_modules()) 8018 if (Visitor(*F)) 8019 break; 8020 } else { 8021 // If there is a global index, look there first to determine which modules 8022 // provably do not have any results for this identifier. 8023 GlobalModuleIndex::HitSet Hits; 8024 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 8025 if (!loadGlobalIndex()) { 8026 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 8027 HitsPtr = &Hits; 8028 } 8029 } 8030 8031 ModuleMgr.visit(Visitor, HitsPtr); 8032 } 8033 8034 IdentifierInfo *II = Visitor.getIdentifierInfo(); 8035 markIdentifierUpToDate(II); 8036 return II; 8037 } 8038 8039 namespace clang { 8040 8041 /// An identifier-lookup iterator that enumerates all of the 8042 /// identifiers stored within a set of AST files. 8043 class ASTIdentifierIterator : public IdentifierIterator { 8044 /// The AST reader whose identifiers are being enumerated. 8045 const ASTReader &Reader; 8046 8047 /// The current index into the chain of AST files stored in 8048 /// the AST reader. 8049 unsigned Index; 8050 8051 /// The current position within the identifier lookup table 8052 /// of the current AST file. 8053 ASTIdentifierLookupTable::key_iterator Current; 8054 8055 /// The end position within the identifier lookup table of 8056 /// the current AST file. 8057 ASTIdentifierLookupTable::key_iterator End; 8058 8059 /// Whether to skip any modules in the ASTReader. 8060 bool SkipModules; 8061 8062 public: 8063 explicit ASTIdentifierIterator(const ASTReader &Reader, 8064 bool SkipModules = false); 8065 8066 StringRef Next() override; 8067 }; 8068 8069 } // namespace clang 8070 8071 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 8072 bool SkipModules) 8073 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8074 } 8075 8076 StringRef ASTIdentifierIterator::Next() { 8077 while (Current == End) { 8078 // If we have exhausted all of our AST files, we're done. 8079 if (Index == 0) 8080 return StringRef(); 8081 8082 --Index; 8083 ModuleFile &F = Reader.ModuleMgr[Index]; 8084 if (SkipModules && F.isModule()) 8085 continue; 8086 8087 ASTIdentifierLookupTable *IdTable = 8088 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8089 Current = IdTable->key_begin(); 8090 End = IdTable->key_end(); 8091 } 8092 8093 // We have any identifiers remaining in the current AST file; return 8094 // the next one. 8095 StringRef Result = *Current; 8096 ++Current; 8097 return Result; 8098 } 8099 8100 namespace { 8101 8102 /// A utility for appending two IdentifierIterators. 8103 class ChainedIdentifierIterator : public IdentifierIterator { 8104 std::unique_ptr<IdentifierIterator> Current; 8105 std::unique_ptr<IdentifierIterator> Queued; 8106 8107 public: 8108 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8109 std::unique_ptr<IdentifierIterator> Second) 8110 : Current(std::move(First)), Queued(std::move(Second)) {} 8111 8112 StringRef Next() override { 8113 if (!Current) 8114 return StringRef(); 8115 8116 StringRef result = Current->Next(); 8117 if (!result.empty()) 8118 return result; 8119 8120 // Try the queued iterator, which may itself be empty. 8121 Current.reset(); 8122 std::swap(Current, Queued); 8123 return Next(); 8124 } 8125 }; 8126 8127 } // namespace 8128 8129 IdentifierIterator *ASTReader::getIdentifiers() { 8130 if (!loadGlobalIndex()) { 8131 std::unique_ptr<IdentifierIterator> ReaderIter( 8132 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8133 std::unique_ptr<IdentifierIterator> ModulesIter( 8134 GlobalIndex->createIdentifierIterator()); 8135 return new ChainedIdentifierIterator(std::move(ReaderIter), 8136 std::move(ModulesIter)); 8137 } 8138 8139 return new ASTIdentifierIterator(*this); 8140 } 8141 8142 namespace clang { 8143 namespace serialization { 8144 8145 class ReadMethodPoolVisitor { 8146 ASTReader &Reader; 8147 Selector Sel; 8148 unsigned PriorGeneration; 8149 unsigned InstanceBits = 0; 8150 unsigned FactoryBits = 0; 8151 bool InstanceHasMoreThanOneDecl = false; 8152 bool FactoryHasMoreThanOneDecl = false; 8153 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8154 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8155 8156 public: 8157 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8158 unsigned PriorGeneration) 8159 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8160 8161 bool operator()(ModuleFile &M) { 8162 if (!M.SelectorLookupTable) 8163 return false; 8164 8165 // If we've already searched this module file, skip it now. 8166 if (M.Generation <= PriorGeneration) 8167 return true; 8168 8169 ++Reader.NumMethodPoolTableLookups; 8170 ASTSelectorLookupTable *PoolTable 8171 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8172 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8173 if (Pos == PoolTable->end()) 8174 return false; 8175 8176 ++Reader.NumMethodPoolTableHits; 8177 ++Reader.NumSelectorsRead; 8178 // FIXME: Not quite happy with the statistics here. We probably should 8179 // disable this tracking when called via LoadSelector. 8180 // Also, should entries without methods count as misses? 8181 ++Reader.NumMethodPoolEntriesRead; 8182 ASTSelectorLookupTrait::data_type Data = *Pos; 8183 if (Reader.DeserializationListener) 8184 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8185 8186 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8187 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8188 InstanceBits = Data.InstanceBits; 8189 FactoryBits = Data.FactoryBits; 8190 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8191 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8192 return true; 8193 } 8194 8195 /// Retrieve the instance methods found by this visitor. 8196 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8197 return InstanceMethods; 8198 } 8199 8200 /// Retrieve the instance methods found by this visitor. 8201 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8202 return FactoryMethods; 8203 } 8204 8205 unsigned getInstanceBits() const { return InstanceBits; } 8206 unsigned getFactoryBits() const { return FactoryBits; } 8207 8208 bool instanceHasMoreThanOneDecl() const { 8209 return InstanceHasMoreThanOneDecl; 8210 } 8211 8212 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8213 }; 8214 8215 } // namespace serialization 8216 } // namespace clang 8217 8218 /// Add the given set of methods to the method list. 8219 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8220 ObjCMethodList &List) { 8221 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8222 S.addMethodToGlobalList(&List, Methods[I]); 8223 } 8224 } 8225 8226 void ASTReader::ReadMethodPool(Selector Sel) { 8227 // Get the selector generation and update it to the current generation. 8228 unsigned &Generation = SelectorGeneration[Sel]; 8229 unsigned PriorGeneration = Generation; 8230 Generation = getGeneration(); 8231 SelectorOutOfDate[Sel] = false; 8232 8233 // Search for methods defined with this selector. 8234 ++NumMethodPoolLookups; 8235 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8236 ModuleMgr.visit(Visitor); 8237 8238 if (Visitor.getInstanceMethods().empty() && 8239 Visitor.getFactoryMethods().empty()) 8240 return; 8241 8242 ++NumMethodPoolHits; 8243 8244 if (!getSema()) 8245 return; 8246 8247 Sema &S = *getSema(); 8248 Sema::GlobalMethodPool::iterator Pos 8249 = S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethods())).first; 8250 8251 Pos->second.first.setBits(Visitor.getInstanceBits()); 8252 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8253 Pos->second.second.setBits(Visitor.getFactoryBits()); 8254 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8255 8256 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8257 // when building a module we keep every method individually and may need to 8258 // update hasMoreThanOneDecl as we add the methods. 8259 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8260 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8261 } 8262 8263 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8264 if (SelectorOutOfDate[Sel]) 8265 ReadMethodPool(Sel); 8266 } 8267 8268 void ASTReader::ReadKnownNamespaces( 8269 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8270 Namespaces.clear(); 8271 8272 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8273 if (NamespaceDecl *Namespace 8274 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8275 Namespaces.push_back(Namespace); 8276 } 8277 } 8278 8279 void ASTReader::ReadUndefinedButUsed( 8280 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8281 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8282 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8283 SourceLocation Loc = 8284 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8285 Undefined.insert(std::make_pair(D, Loc)); 8286 } 8287 } 8288 8289 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8290 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8291 Exprs) { 8292 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8293 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8294 uint64_t Count = DelayedDeleteExprs[Idx++]; 8295 for (uint64_t C = 0; C < Count; ++C) { 8296 SourceLocation DeleteLoc = 8297 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8298 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8299 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8300 } 8301 } 8302 } 8303 8304 void ASTReader::ReadTentativeDefinitions( 8305 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8306 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8307 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8308 if (Var) 8309 TentativeDefs.push_back(Var); 8310 } 8311 TentativeDefinitions.clear(); 8312 } 8313 8314 void ASTReader::ReadUnusedFileScopedDecls( 8315 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8316 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8317 DeclaratorDecl *D 8318 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8319 if (D) 8320 Decls.push_back(D); 8321 } 8322 UnusedFileScopedDecls.clear(); 8323 } 8324 8325 void ASTReader::ReadDelegatingConstructors( 8326 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8327 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8328 CXXConstructorDecl *D 8329 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8330 if (D) 8331 Decls.push_back(D); 8332 } 8333 DelegatingCtorDecls.clear(); 8334 } 8335 8336 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8337 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8338 TypedefNameDecl *D 8339 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8340 if (D) 8341 Decls.push_back(D); 8342 } 8343 ExtVectorDecls.clear(); 8344 } 8345 8346 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8347 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8348 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8349 ++I) { 8350 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8351 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8352 if (D) 8353 Decls.insert(D); 8354 } 8355 UnusedLocalTypedefNameCandidates.clear(); 8356 } 8357 8358 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8359 llvm::SmallVector<Decl *, 4> &Decls) { 8360 for (unsigned I = 0, N = DeclsToCheckForDeferredDiags.size(); I != N; 8361 ++I) { 8362 auto *D = dyn_cast_or_null<Decl>( 8363 GetDecl(DeclsToCheckForDeferredDiags[I])); 8364 if (D) 8365 Decls.push_back(D); 8366 } 8367 DeclsToCheckForDeferredDiags.clear(); 8368 } 8369 8370 8371 void ASTReader::ReadReferencedSelectors( 8372 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8373 if (ReferencedSelectorsData.empty()) 8374 return; 8375 8376 // If there are @selector references added them to its pool. This is for 8377 // implementation of -Wselector. 8378 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8379 unsigned I = 0; 8380 while (I < DataSize) { 8381 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8382 SourceLocation SelLoc 8383 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8384 Sels.push_back(std::make_pair(Sel, SelLoc)); 8385 } 8386 ReferencedSelectorsData.clear(); 8387 } 8388 8389 void ASTReader::ReadWeakUndeclaredIdentifiers( 8390 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8391 if (WeakUndeclaredIdentifiers.empty()) 8392 return; 8393 8394 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8395 IdentifierInfo *WeakId 8396 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8397 IdentifierInfo *AliasId 8398 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8399 SourceLocation Loc 8400 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8401 bool Used = WeakUndeclaredIdentifiers[I++]; 8402 WeakInfo WI(AliasId, Loc); 8403 WI.setUsed(Used); 8404 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8405 } 8406 WeakUndeclaredIdentifiers.clear(); 8407 } 8408 8409 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8410 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8411 ExternalVTableUse VT; 8412 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8413 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8414 VT.DefinitionRequired = VTableUses[Idx++]; 8415 VTables.push_back(VT); 8416 } 8417 8418 VTableUses.clear(); 8419 } 8420 8421 void ASTReader::ReadPendingInstantiations( 8422 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8423 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8424 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8425 SourceLocation Loc 8426 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8427 8428 Pending.push_back(std::make_pair(D, Loc)); 8429 } 8430 PendingInstantiations.clear(); 8431 } 8432 8433 void ASTReader::ReadLateParsedTemplates( 8434 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8435 &LPTMap) { 8436 for (auto &LPT : LateParsedTemplates) { 8437 ModuleFile *FMod = LPT.first; 8438 RecordDataImpl &LateParsed = LPT.second; 8439 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; 8440 /* In loop */) { 8441 FunctionDecl *FD = 8442 cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++])); 8443 8444 auto LT = std::make_unique<LateParsedTemplate>(); 8445 LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]); 8446 8447 ModuleFile *F = getOwningModuleFile(LT->D); 8448 assert(F && "No module"); 8449 8450 unsigned TokN = LateParsed[Idx++]; 8451 LT->Toks.reserve(TokN); 8452 for (unsigned T = 0; T < TokN; ++T) 8453 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx)); 8454 8455 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8456 } 8457 } 8458 } 8459 8460 void ASTReader::LoadSelector(Selector Sel) { 8461 // It would be complicated to avoid reading the methods anyway. So don't. 8462 ReadMethodPool(Sel); 8463 } 8464 8465 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8466 assert(ID && "Non-zero identifier ID required"); 8467 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8468 IdentifiersLoaded[ID - 1] = II; 8469 if (DeserializationListener) 8470 DeserializationListener->IdentifierRead(ID, II); 8471 } 8472 8473 /// Set the globally-visible declarations associated with the given 8474 /// identifier. 8475 /// 8476 /// If the AST reader is currently in a state where the given declaration IDs 8477 /// cannot safely be resolved, they are queued until it is safe to resolve 8478 /// them. 8479 /// 8480 /// \param II an IdentifierInfo that refers to one or more globally-visible 8481 /// declarations. 8482 /// 8483 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8484 /// visible at global scope. 8485 /// 8486 /// \param Decls if non-null, this vector will be populated with the set of 8487 /// deserialized declarations. These declarations will not be pushed into 8488 /// scope. 8489 void 8490 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8491 const SmallVectorImpl<uint32_t> &DeclIDs, 8492 SmallVectorImpl<Decl *> *Decls) { 8493 if (NumCurrentElementsDeserializing && !Decls) { 8494 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8495 return; 8496 } 8497 8498 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8499 if (!SemaObj) { 8500 // Queue this declaration so that it will be added to the 8501 // translation unit scope and identifier's declaration chain 8502 // once a Sema object is known. 8503 PreloadedDeclIDs.push_back(DeclIDs[I]); 8504 continue; 8505 } 8506 8507 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8508 8509 // If we're simply supposed to record the declarations, do so now. 8510 if (Decls) { 8511 Decls->push_back(D); 8512 continue; 8513 } 8514 8515 // Introduce this declaration into the translation-unit scope 8516 // and add it to the declaration chain for this identifier, so 8517 // that (unqualified) name lookup will find it. 8518 pushExternalDeclIntoScope(D, II); 8519 } 8520 } 8521 8522 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8523 if (ID == 0) 8524 return nullptr; 8525 8526 if (IdentifiersLoaded.empty()) { 8527 Error("no identifier table in AST file"); 8528 return nullptr; 8529 } 8530 8531 ID -= 1; 8532 if (!IdentifiersLoaded[ID]) { 8533 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8534 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8535 ModuleFile *M = I->second; 8536 unsigned Index = ID - M->BaseIdentifierID; 8537 const unsigned char *Data = 8538 M->IdentifierTableData + M->IdentifierOffsets[Index]; 8539 8540 ASTIdentifierLookupTrait Trait(*this, *M); 8541 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 8542 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 8543 auto &II = PP.getIdentifierTable().get(Key); 8544 IdentifiersLoaded[ID] = &II; 8545 markIdentifierFromAST(*this, II); 8546 if (DeserializationListener) 8547 DeserializationListener->IdentifierRead(ID + 1, &II); 8548 } 8549 8550 return IdentifiersLoaded[ID]; 8551 } 8552 8553 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8554 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8555 } 8556 8557 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8558 if (LocalID < NUM_PREDEF_IDENT_IDS) 8559 return LocalID; 8560 8561 if (!M.ModuleOffsetMap.empty()) 8562 ReadModuleOffsetMap(M); 8563 8564 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8565 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8566 assert(I != M.IdentifierRemap.end() 8567 && "Invalid index into identifier index remap"); 8568 8569 return LocalID + I->second; 8570 } 8571 8572 MacroInfo *ASTReader::getMacro(MacroID ID) { 8573 if (ID == 0) 8574 return nullptr; 8575 8576 if (MacrosLoaded.empty()) { 8577 Error("no macro table in AST file"); 8578 return nullptr; 8579 } 8580 8581 ID -= NUM_PREDEF_MACRO_IDS; 8582 if (!MacrosLoaded[ID]) { 8583 GlobalMacroMapType::iterator I 8584 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8585 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8586 ModuleFile *M = I->second; 8587 unsigned Index = ID - M->BaseMacroID; 8588 MacrosLoaded[ID] = 8589 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8590 8591 if (DeserializationListener) 8592 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8593 MacrosLoaded[ID]); 8594 } 8595 8596 return MacrosLoaded[ID]; 8597 } 8598 8599 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8600 if (LocalID < NUM_PREDEF_MACRO_IDS) 8601 return LocalID; 8602 8603 if (!M.ModuleOffsetMap.empty()) 8604 ReadModuleOffsetMap(M); 8605 8606 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8607 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8608 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8609 8610 return LocalID + I->second; 8611 } 8612 8613 serialization::SubmoduleID 8614 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8615 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8616 return LocalID; 8617 8618 if (!M.ModuleOffsetMap.empty()) 8619 ReadModuleOffsetMap(M); 8620 8621 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8622 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8623 assert(I != M.SubmoduleRemap.end() 8624 && "Invalid index into submodule index remap"); 8625 8626 return LocalID + I->second; 8627 } 8628 8629 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8630 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8631 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8632 return nullptr; 8633 } 8634 8635 if (GlobalID > SubmodulesLoaded.size()) { 8636 Error("submodule ID out of range in AST file"); 8637 return nullptr; 8638 } 8639 8640 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8641 } 8642 8643 Module *ASTReader::getModule(unsigned ID) { 8644 return getSubmodule(ID); 8645 } 8646 8647 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8648 if (ID & 1) { 8649 // It's a module, look it up by submodule ID. 8650 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8651 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8652 } else { 8653 // It's a prefix (preamble, PCH, ...). Look it up by index. 8654 unsigned IndexFromEnd = ID >> 1; 8655 assert(IndexFromEnd && "got reference to unknown module file"); 8656 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8657 } 8658 } 8659 8660 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8661 if (!F) 8662 return 1; 8663 8664 // For a file representing a module, use the submodule ID of the top-level 8665 // module as the file ID. For any other kind of file, the number of such 8666 // files loaded beforehand will be the same on reload. 8667 // FIXME: Is this true even if we have an explicit module file and a PCH? 8668 if (F->isModule()) 8669 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8670 8671 auto PCHModules = getModuleManager().pch_modules(); 8672 auto I = llvm::find(PCHModules, F); 8673 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8674 return (I - PCHModules.end()) << 1; 8675 } 8676 8677 llvm::Optional<ASTSourceDescriptor> 8678 ASTReader::getSourceDescriptor(unsigned ID) { 8679 if (Module *M = getSubmodule(ID)) 8680 return ASTSourceDescriptor(*M); 8681 8682 // If there is only a single PCH, return it instead. 8683 // Chained PCH are not supported. 8684 const auto &PCHChain = ModuleMgr.pch_modules(); 8685 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8686 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8687 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8688 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8689 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8690 MF.Signature); 8691 } 8692 return None; 8693 } 8694 8695 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8696 auto I = DefinitionSource.find(FD); 8697 if (I == DefinitionSource.end()) 8698 return EK_ReplyHazy; 8699 return I->second ? EK_Never : EK_Always; 8700 } 8701 8702 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8703 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8704 } 8705 8706 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8707 if (ID == 0) 8708 return Selector(); 8709 8710 if (ID > SelectorsLoaded.size()) { 8711 Error("selector ID out of range in AST file"); 8712 return Selector(); 8713 } 8714 8715 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8716 // Load this selector from the selector table. 8717 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8718 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8719 ModuleFile &M = *I->second; 8720 ASTSelectorLookupTrait Trait(*this, M); 8721 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8722 SelectorsLoaded[ID - 1] = 8723 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8724 if (DeserializationListener) 8725 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8726 } 8727 8728 return SelectorsLoaded[ID - 1]; 8729 } 8730 8731 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8732 return DecodeSelector(ID); 8733 } 8734 8735 uint32_t ASTReader::GetNumExternalSelectors() { 8736 // ID 0 (the null selector) is considered an external selector. 8737 return getTotalNumSelectors() + 1; 8738 } 8739 8740 serialization::SelectorID 8741 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8742 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8743 return LocalID; 8744 8745 if (!M.ModuleOffsetMap.empty()) 8746 ReadModuleOffsetMap(M); 8747 8748 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8749 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8750 assert(I != M.SelectorRemap.end() 8751 && "Invalid index into selector index remap"); 8752 8753 return LocalID + I->second; 8754 } 8755 8756 DeclarationNameLoc 8757 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8758 switch (Name.getNameKind()) { 8759 case DeclarationName::CXXConstructorName: 8760 case DeclarationName::CXXDestructorName: 8761 case DeclarationName::CXXConversionFunctionName: 8762 return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo()); 8763 8764 case DeclarationName::CXXOperatorName: 8765 return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange()); 8766 8767 case DeclarationName::CXXLiteralOperatorName: 8768 return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc( 8769 readSourceLocation()); 8770 8771 case DeclarationName::Identifier: 8772 case DeclarationName::ObjCZeroArgSelector: 8773 case DeclarationName::ObjCOneArgSelector: 8774 case DeclarationName::ObjCMultiArgSelector: 8775 case DeclarationName::CXXUsingDirective: 8776 case DeclarationName::CXXDeductionGuideName: 8777 break; 8778 } 8779 return DeclarationNameLoc(); 8780 } 8781 8782 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8783 DeclarationNameInfo NameInfo; 8784 NameInfo.setName(readDeclarationName()); 8785 NameInfo.setLoc(readSourceLocation()); 8786 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8787 return NameInfo; 8788 } 8789 8790 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8791 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8792 unsigned NumTPLists = readInt(); 8793 Info.NumTemplParamLists = NumTPLists; 8794 if (NumTPLists) { 8795 Info.TemplParamLists = 8796 new (getContext()) TemplateParameterList *[NumTPLists]; 8797 for (unsigned i = 0; i != NumTPLists; ++i) 8798 Info.TemplParamLists[i] = readTemplateParameterList(); 8799 } 8800 } 8801 8802 TemplateParameterList * 8803 ASTRecordReader::readTemplateParameterList() { 8804 SourceLocation TemplateLoc = readSourceLocation(); 8805 SourceLocation LAngleLoc = readSourceLocation(); 8806 SourceLocation RAngleLoc = readSourceLocation(); 8807 8808 unsigned NumParams = readInt(); 8809 SmallVector<NamedDecl *, 16> Params; 8810 Params.reserve(NumParams); 8811 while (NumParams--) 8812 Params.push_back(readDeclAs<NamedDecl>()); 8813 8814 bool HasRequiresClause = readBool(); 8815 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8816 8817 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8818 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8819 return TemplateParams; 8820 } 8821 8822 void ASTRecordReader::readTemplateArgumentList( 8823 SmallVectorImpl<TemplateArgument> &TemplArgs, 8824 bool Canonicalize) { 8825 unsigned NumTemplateArgs = readInt(); 8826 TemplArgs.reserve(NumTemplateArgs); 8827 while (NumTemplateArgs--) 8828 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8829 } 8830 8831 /// Read a UnresolvedSet structure. 8832 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8833 unsigned NumDecls = readInt(); 8834 Set.reserve(getContext(), NumDecls); 8835 while (NumDecls--) { 8836 DeclID ID = readDeclID(); 8837 AccessSpecifier AS = (AccessSpecifier) readInt(); 8838 Set.addLazyDecl(getContext(), ID, AS); 8839 } 8840 } 8841 8842 CXXBaseSpecifier 8843 ASTRecordReader::readCXXBaseSpecifier() { 8844 bool isVirtual = readBool(); 8845 bool isBaseOfClass = readBool(); 8846 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8847 bool inheritConstructors = readBool(); 8848 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8849 SourceRange Range = readSourceRange(); 8850 SourceLocation EllipsisLoc = readSourceLocation(); 8851 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8852 EllipsisLoc); 8853 Result.setInheritConstructors(inheritConstructors); 8854 return Result; 8855 } 8856 8857 CXXCtorInitializer ** 8858 ASTRecordReader::readCXXCtorInitializers() { 8859 ASTContext &Context = getContext(); 8860 unsigned NumInitializers = readInt(); 8861 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8862 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8863 for (unsigned i = 0; i != NumInitializers; ++i) { 8864 TypeSourceInfo *TInfo = nullptr; 8865 bool IsBaseVirtual = false; 8866 FieldDecl *Member = nullptr; 8867 IndirectFieldDecl *IndirectMember = nullptr; 8868 8869 CtorInitializerType Type = (CtorInitializerType) readInt(); 8870 switch (Type) { 8871 case CTOR_INITIALIZER_BASE: 8872 TInfo = readTypeSourceInfo(); 8873 IsBaseVirtual = readBool(); 8874 break; 8875 8876 case CTOR_INITIALIZER_DELEGATING: 8877 TInfo = readTypeSourceInfo(); 8878 break; 8879 8880 case CTOR_INITIALIZER_MEMBER: 8881 Member = readDeclAs<FieldDecl>(); 8882 break; 8883 8884 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8885 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8886 break; 8887 } 8888 8889 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8890 Expr *Init = readExpr(); 8891 SourceLocation LParenLoc = readSourceLocation(); 8892 SourceLocation RParenLoc = readSourceLocation(); 8893 8894 CXXCtorInitializer *BOMInit; 8895 if (Type == CTOR_INITIALIZER_BASE) 8896 BOMInit = new (Context) 8897 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8898 RParenLoc, MemberOrEllipsisLoc); 8899 else if (Type == CTOR_INITIALIZER_DELEGATING) 8900 BOMInit = new (Context) 8901 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8902 else if (Member) 8903 BOMInit = new (Context) 8904 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8905 Init, RParenLoc); 8906 else 8907 BOMInit = new (Context) 8908 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8909 LParenLoc, Init, RParenLoc); 8910 8911 if (/*IsWritten*/readBool()) { 8912 unsigned SourceOrder = readInt(); 8913 BOMInit->setSourceOrder(SourceOrder); 8914 } 8915 8916 CtorInitializers[i] = BOMInit; 8917 } 8918 8919 return CtorInitializers; 8920 } 8921 8922 NestedNameSpecifierLoc 8923 ASTRecordReader::readNestedNameSpecifierLoc() { 8924 ASTContext &Context = getContext(); 8925 unsigned N = readInt(); 8926 NestedNameSpecifierLocBuilder Builder; 8927 for (unsigned I = 0; I != N; ++I) { 8928 auto Kind = readNestedNameSpecifierKind(); 8929 switch (Kind) { 8930 case NestedNameSpecifier::Identifier: { 8931 IdentifierInfo *II = readIdentifier(); 8932 SourceRange Range = readSourceRange(); 8933 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8934 break; 8935 } 8936 8937 case NestedNameSpecifier::Namespace: { 8938 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8939 SourceRange Range = readSourceRange(); 8940 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8941 break; 8942 } 8943 8944 case NestedNameSpecifier::NamespaceAlias: { 8945 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8946 SourceRange Range = readSourceRange(); 8947 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8948 break; 8949 } 8950 8951 case NestedNameSpecifier::TypeSpec: 8952 case NestedNameSpecifier::TypeSpecWithTemplate: { 8953 bool Template = readBool(); 8954 TypeSourceInfo *T = readTypeSourceInfo(); 8955 if (!T) 8956 return NestedNameSpecifierLoc(); 8957 SourceLocation ColonColonLoc = readSourceLocation(); 8958 8959 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8960 Builder.Extend(Context, 8961 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8962 T->getTypeLoc(), ColonColonLoc); 8963 break; 8964 } 8965 8966 case NestedNameSpecifier::Global: { 8967 SourceLocation ColonColonLoc = readSourceLocation(); 8968 Builder.MakeGlobal(Context, ColonColonLoc); 8969 break; 8970 } 8971 8972 case NestedNameSpecifier::Super: { 8973 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8974 SourceRange Range = readSourceRange(); 8975 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8976 break; 8977 } 8978 } 8979 } 8980 8981 return Builder.getWithLocInContext(Context); 8982 } 8983 8984 SourceRange 8985 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8986 unsigned &Idx) { 8987 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8988 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8989 return SourceRange(beg, end); 8990 } 8991 8992 /// Read a floating-point value 8993 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 8994 return llvm::APFloat(Sem, readAPInt()); 8995 } 8996 8997 // Read a string 8998 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8999 unsigned Len = Record[Idx++]; 9000 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 9001 Idx += Len; 9002 return Result; 9003 } 9004 9005 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 9006 unsigned &Idx) { 9007 std::string Filename = ReadString(Record, Idx); 9008 ResolveImportedPath(F, Filename); 9009 return Filename; 9010 } 9011 9012 std::string ASTReader::ReadPath(StringRef BaseDirectory, 9013 const RecordData &Record, unsigned &Idx) { 9014 std::string Filename = ReadString(Record, Idx); 9015 if (!BaseDirectory.empty()) 9016 ResolveImportedPath(Filename, BaseDirectory); 9017 return Filename; 9018 } 9019 9020 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 9021 unsigned &Idx) { 9022 unsigned Major = Record[Idx++]; 9023 unsigned Minor = Record[Idx++]; 9024 unsigned Subminor = Record[Idx++]; 9025 if (Minor == 0) 9026 return VersionTuple(Major); 9027 if (Subminor == 0) 9028 return VersionTuple(Major, Minor - 1); 9029 return VersionTuple(Major, Minor - 1, Subminor - 1); 9030 } 9031 9032 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 9033 const RecordData &Record, 9034 unsigned &Idx) { 9035 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 9036 return CXXTemporary::Create(getContext(), Decl); 9037 } 9038 9039 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9040 return Diag(CurrentImportLoc, DiagID); 9041 } 9042 9043 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9044 return Diags.Report(Loc, DiagID); 9045 } 9046 9047 /// Retrieve the identifier table associated with the 9048 /// preprocessor. 9049 IdentifierTable &ASTReader::getIdentifierTable() { 9050 return PP.getIdentifierTable(); 9051 } 9052 9053 /// Record that the given ID maps to the given switch-case 9054 /// statement. 9055 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9056 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9057 "Already have a SwitchCase with this ID"); 9058 (*CurrSwitchCaseStmts)[ID] = SC; 9059 } 9060 9061 /// Retrieve the switch-case statement with the given ID. 9062 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9063 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9064 return (*CurrSwitchCaseStmts)[ID]; 9065 } 9066 9067 void ASTReader::ClearSwitchCaseIDs() { 9068 CurrSwitchCaseStmts->clear(); 9069 } 9070 9071 void ASTReader::ReadComments() { 9072 ASTContext &Context = getContext(); 9073 std::vector<RawComment *> Comments; 9074 for (SmallVectorImpl<std::pair<BitstreamCursor, 9075 serialization::ModuleFile *>>::iterator 9076 I = CommentsCursors.begin(), 9077 E = CommentsCursors.end(); 9078 I != E; ++I) { 9079 Comments.clear(); 9080 BitstreamCursor &Cursor = I->first; 9081 serialization::ModuleFile &F = *I->second; 9082 SavedStreamPosition SavedPosition(Cursor); 9083 9084 RecordData Record; 9085 while (true) { 9086 Expected<llvm::BitstreamEntry> MaybeEntry = 9087 Cursor.advanceSkippingSubblocks( 9088 BitstreamCursor::AF_DontPopBlockAtEnd); 9089 if (!MaybeEntry) { 9090 Error(MaybeEntry.takeError()); 9091 return; 9092 } 9093 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9094 9095 switch (Entry.Kind) { 9096 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9097 case llvm::BitstreamEntry::Error: 9098 Error("malformed block record in AST file"); 9099 return; 9100 case llvm::BitstreamEntry::EndBlock: 9101 goto NextCursor; 9102 case llvm::BitstreamEntry::Record: 9103 // The interesting case. 9104 break; 9105 } 9106 9107 // Read a record. 9108 Record.clear(); 9109 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9110 if (!MaybeComment) { 9111 Error(MaybeComment.takeError()); 9112 return; 9113 } 9114 switch ((CommentRecordTypes)MaybeComment.get()) { 9115 case COMMENTS_RAW_COMMENT: { 9116 unsigned Idx = 0; 9117 SourceRange SR = ReadSourceRange(F, Record, Idx); 9118 RawComment::CommentKind Kind = 9119 (RawComment::CommentKind) Record[Idx++]; 9120 bool IsTrailingComment = Record[Idx++]; 9121 bool IsAlmostTrailingComment = Record[Idx++]; 9122 Comments.push_back(new (Context) RawComment( 9123 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9124 break; 9125 } 9126 } 9127 } 9128 NextCursor: 9129 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9130 FileToOffsetToComment; 9131 for (RawComment *C : Comments) { 9132 SourceLocation CommentLoc = C->getBeginLoc(); 9133 if (CommentLoc.isValid()) { 9134 std::pair<FileID, unsigned> Loc = 9135 SourceMgr.getDecomposedLoc(CommentLoc); 9136 if (Loc.first.isValid()) 9137 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9138 } 9139 } 9140 } 9141 } 9142 9143 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9144 bool IncludeSystem, bool Complain, 9145 llvm::function_ref<void(const serialization::InputFile &IF, 9146 bool isSystem)> Visitor) { 9147 unsigned NumUserInputs = MF.NumUserInputFiles; 9148 unsigned NumInputs = MF.InputFilesLoaded.size(); 9149 assert(NumUserInputs <= NumInputs); 9150 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9151 for (unsigned I = 0; I < N; ++I) { 9152 bool IsSystem = I >= NumUserInputs; 9153 InputFile IF = getInputFile(MF, I+1, Complain); 9154 Visitor(IF, IsSystem); 9155 } 9156 } 9157 9158 void ASTReader::visitTopLevelModuleMaps( 9159 serialization::ModuleFile &MF, 9160 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9161 unsigned NumInputs = MF.InputFilesLoaded.size(); 9162 for (unsigned I = 0; I < NumInputs; ++I) { 9163 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9164 if (IFI.TopLevelModuleMap) 9165 // FIXME: This unnecessarily re-reads the InputFileInfo. 9166 if (auto FE = getInputFile(MF, I + 1).getFile()) 9167 Visitor(FE); 9168 } 9169 } 9170 9171 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9172 // If we know the owning module, use it. 9173 if (Module *M = D->getImportedOwningModule()) 9174 return M->getFullModuleName(); 9175 9176 // Otherwise, use the name of the top-level module the decl is within. 9177 if (ModuleFile *M = getOwningModuleFile(D)) 9178 return M->ModuleName; 9179 9180 // Not from a module. 9181 return {}; 9182 } 9183 9184 void ASTReader::finishPendingActions() { 9185 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9186 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9187 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9188 !PendingUpdateRecords.empty()) { 9189 // If any identifiers with corresponding top-level declarations have 9190 // been loaded, load those declarations now. 9191 using TopLevelDeclsMap = 9192 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9193 TopLevelDeclsMap TopLevelDecls; 9194 9195 while (!PendingIdentifierInfos.empty()) { 9196 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9197 SmallVector<uint32_t, 4> DeclIDs = 9198 std::move(PendingIdentifierInfos.back().second); 9199 PendingIdentifierInfos.pop_back(); 9200 9201 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9202 } 9203 9204 // Load each function type that we deferred loading because it was a 9205 // deduced type that might refer to a local type declared within itself. 9206 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9207 auto *FD = PendingFunctionTypes[I].first; 9208 FD->setType(GetType(PendingFunctionTypes[I].second)); 9209 9210 // If we gave a function a deduced return type, remember that we need to 9211 // propagate that along the redeclaration chain. 9212 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9213 if (DT && DT->isDeduced()) 9214 PendingDeducedTypeUpdates.insert( 9215 {FD->getCanonicalDecl(), FD->getReturnType()}); 9216 } 9217 PendingFunctionTypes.clear(); 9218 9219 // For each decl chain that we wanted to complete while deserializing, mark 9220 // it as "still needs to be completed". 9221 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9222 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9223 } 9224 PendingIncompleteDeclChains.clear(); 9225 9226 // Load pending declaration chains. 9227 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9228 loadPendingDeclChain(PendingDeclChains[I].first, 9229 PendingDeclChains[I].second); 9230 PendingDeclChains.clear(); 9231 9232 // Make the most recent of the top-level declarations visible. 9233 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9234 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9235 IdentifierInfo *II = TLD->first; 9236 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9237 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9238 } 9239 } 9240 9241 // Load any pending macro definitions. 9242 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9243 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9244 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9245 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9246 // Initialize the macro history from chained-PCHs ahead of module imports. 9247 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9248 ++IDIdx) { 9249 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9250 if (!Info.M->isModule()) 9251 resolvePendingMacro(II, Info); 9252 } 9253 // Handle module imports. 9254 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9255 ++IDIdx) { 9256 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9257 if (Info.M->isModule()) 9258 resolvePendingMacro(II, Info); 9259 } 9260 } 9261 PendingMacroIDs.clear(); 9262 9263 // Wire up the DeclContexts for Decls that we delayed setting until 9264 // recursive loading is completed. 9265 while (!PendingDeclContextInfos.empty()) { 9266 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9267 PendingDeclContextInfos.pop_front(); 9268 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9269 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9270 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9271 } 9272 9273 // Perform any pending declaration updates. 9274 while (!PendingUpdateRecords.empty()) { 9275 auto Update = PendingUpdateRecords.pop_back_val(); 9276 ReadingKindTracker ReadingKind(Read_Decl, *this); 9277 loadDeclUpdateRecords(Update); 9278 } 9279 } 9280 9281 // At this point, all update records for loaded decls are in place, so any 9282 // fake class definitions should have become real. 9283 assert(PendingFakeDefinitionData.empty() && 9284 "faked up a class definition but never saw the real one"); 9285 9286 // If we deserialized any C++ or Objective-C class definitions, any 9287 // Objective-C protocol definitions, or any redeclarable templates, make sure 9288 // that all redeclarations point to the definitions. Note that this can only 9289 // happen now, after the redeclaration chains have been fully wired. 9290 for (Decl *D : PendingDefinitions) { 9291 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9292 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9293 // Make sure that the TagType points at the definition. 9294 const_cast<TagType*>(TagT)->decl = TD; 9295 } 9296 9297 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9298 for (auto *R = getMostRecentExistingDecl(RD); R; 9299 R = R->getPreviousDecl()) { 9300 assert((R == D) == 9301 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9302 "declaration thinks it's the definition but it isn't"); 9303 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9304 } 9305 } 9306 9307 continue; 9308 } 9309 9310 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9311 // Make sure that the ObjCInterfaceType points at the definition. 9312 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9313 ->Decl = ID; 9314 9315 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9316 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9317 9318 continue; 9319 } 9320 9321 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9322 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9323 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9324 9325 continue; 9326 } 9327 9328 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9329 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9330 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9331 } 9332 PendingDefinitions.clear(); 9333 9334 // Load the bodies of any functions or methods we've encountered. We do 9335 // this now (delayed) so that we can be sure that the declaration chains 9336 // have been fully wired up (hasBody relies on this). 9337 // FIXME: We shouldn't require complete redeclaration chains here. 9338 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9339 PBEnd = PendingBodies.end(); 9340 PB != PBEnd; ++PB) { 9341 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9342 // For a function defined inline within a class template, force the 9343 // canonical definition to be the one inside the canonical definition of 9344 // the template. This ensures that we instantiate from a correct view 9345 // of the template. 9346 // 9347 // Sadly we can't do this more generally: we can't be sure that all 9348 // copies of an arbitrary class definition will have the same members 9349 // defined (eg, some member functions may not be instantiated, and some 9350 // special members may or may not have been implicitly defined). 9351 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9352 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9353 continue; 9354 9355 // FIXME: Check for =delete/=default? 9356 // FIXME: Complain about ODR violations here? 9357 const FunctionDecl *Defn = nullptr; 9358 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9359 FD->setLazyBody(PB->second); 9360 } else { 9361 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9362 mergeDefinitionVisibility(NonConstDefn, FD); 9363 9364 if (!FD->isLateTemplateParsed() && 9365 !NonConstDefn->isLateTemplateParsed() && 9366 FD->getODRHash() != NonConstDefn->getODRHash()) { 9367 if (!isa<CXXMethodDecl>(FD)) { 9368 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9369 } else if (FD->getLexicalParent()->isFileContext() && 9370 NonConstDefn->getLexicalParent()->isFileContext()) { 9371 // Only diagnose out-of-line method definitions. If they are 9372 // in class definitions, then an error will be generated when 9373 // processing the class bodies. 9374 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9375 } 9376 } 9377 } 9378 continue; 9379 } 9380 9381 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9382 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9383 MD->setLazyBody(PB->second); 9384 } 9385 PendingBodies.clear(); 9386 9387 // Do some cleanup. 9388 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9389 getContext().deduplicateMergedDefinitonsFor(ND); 9390 PendingMergedDefinitionsToDeduplicate.clear(); 9391 } 9392 9393 void ASTReader::diagnoseOdrViolations() { 9394 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9395 PendingFunctionOdrMergeFailures.empty() && 9396 PendingEnumOdrMergeFailures.empty()) 9397 return; 9398 9399 // Trigger the import of the full definition of each class that had any 9400 // odr-merging problems, so we can produce better diagnostics for them. 9401 // These updates may in turn find and diagnose some ODR failures, so take 9402 // ownership of the set first. 9403 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9404 PendingOdrMergeFailures.clear(); 9405 for (auto &Merge : OdrMergeFailures) { 9406 Merge.first->buildLookup(); 9407 Merge.first->decls_begin(); 9408 Merge.first->bases_begin(); 9409 Merge.first->vbases_begin(); 9410 for (auto &RecordPair : Merge.second) { 9411 auto *RD = RecordPair.first; 9412 RD->decls_begin(); 9413 RD->bases_begin(); 9414 RD->vbases_begin(); 9415 } 9416 } 9417 9418 // Trigger the import of functions. 9419 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9420 PendingFunctionOdrMergeFailures.clear(); 9421 for (auto &Merge : FunctionOdrMergeFailures) { 9422 Merge.first->buildLookup(); 9423 Merge.first->decls_begin(); 9424 Merge.first->getBody(); 9425 for (auto &FD : Merge.second) { 9426 FD->buildLookup(); 9427 FD->decls_begin(); 9428 FD->getBody(); 9429 } 9430 } 9431 9432 // Trigger the import of enums. 9433 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9434 PendingEnumOdrMergeFailures.clear(); 9435 for (auto &Merge : EnumOdrMergeFailures) { 9436 Merge.first->decls_begin(); 9437 for (auto &Enum : Merge.second) { 9438 Enum->decls_begin(); 9439 } 9440 } 9441 9442 // For each declaration from a merged context, check that the canonical 9443 // definition of that context also contains a declaration of the same 9444 // entity. 9445 // 9446 // Caution: this loop does things that might invalidate iterators into 9447 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9448 while (!PendingOdrMergeChecks.empty()) { 9449 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9450 9451 // FIXME: Skip over implicit declarations for now. This matters for things 9452 // like implicitly-declared special member functions. This isn't entirely 9453 // correct; we can end up with multiple unmerged declarations of the same 9454 // implicit entity. 9455 if (D->isImplicit()) 9456 continue; 9457 9458 DeclContext *CanonDef = D->getDeclContext(); 9459 9460 bool Found = false; 9461 const Decl *DCanon = D->getCanonicalDecl(); 9462 9463 for (auto RI : D->redecls()) { 9464 if (RI->getLexicalDeclContext() == CanonDef) { 9465 Found = true; 9466 break; 9467 } 9468 } 9469 if (Found) 9470 continue; 9471 9472 // Quick check failed, time to do the slow thing. Note, we can't just 9473 // look up the name of D in CanonDef here, because the member that is 9474 // in CanonDef might not be found by name lookup (it might have been 9475 // replaced by a more recent declaration in the lookup table), and we 9476 // can't necessarily find it in the redeclaration chain because it might 9477 // be merely mergeable, not redeclarable. 9478 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9479 for (auto *CanonMember : CanonDef->decls()) { 9480 if (CanonMember->getCanonicalDecl() == DCanon) { 9481 // This can happen if the declaration is merely mergeable and not 9482 // actually redeclarable (we looked for redeclarations earlier). 9483 // 9484 // FIXME: We should be able to detect this more efficiently, without 9485 // pulling in all of the members of CanonDef. 9486 Found = true; 9487 break; 9488 } 9489 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9490 if (ND->getDeclName() == D->getDeclName()) 9491 Candidates.push_back(ND); 9492 } 9493 9494 if (!Found) { 9495 // The AST doesn't like TagDecls becoming invalid after they've been 9496 // completed. We only really need to mark FieldDecls as invalid here. 9497 if (!isa<TagDecl>(D)) 9498 D->setInvalidDecl(); 9499 9500 // Ensure we don't accidentally recursively enter deserialization while 9501 // we're producing our diagnostic. 9502 Deserializing RecursionGuard(this); 9503 9504 std::string CanonDefModule = 9505 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9506 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9507 << D << getOwningModuleNameForDiagnostic(D) 9508 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9509 9510 if (Candidates.empty()) 9511 Diag(cast<Decl>(CanonDef)->getLocation(), 9512 diag::note_module_odr_violation_no_possible_decls) << D; 9513 else { 9514 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9515 Diag(Candidates[I]->getLocation(), 9516 diag::note_module_odr_violation_possible_decl) 9517 << Candidates[I]; 9518 } 9519 9520 DiagnosedOdrMergeFailures.insert(CanonDef); 9521 } 9522 } 9523 9524 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9525 EnumOdrMergeFailures.empty()) 9526 return; 9527 9528 // Ensure we don't accidentally recursively enter deserialization while 9529 // we're producing our diagnostics. 9530 Deserializing RecursionGuard(this); 9531 9532 // Common code for hashing helpers. 9533 ODRHash Hash; 9534 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9535 Hash.clear(); 9536 Hash.AddQualType(Ty); 9537 return Hash.CalculateHash(); 9538 }; 9539 9540 auto ComputeODRHash = [&Hash](const Stmt *S) { 9541 assert(S); 9542 Hash.clear(); 9543 Hash.AddStmt(S); 9544 return Hash.CalculateHash(); 9545 }; 9546 9547 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9548 assert(D); 9549 Hash.clear(); 9550 Hash.AddSubDecl(D); 9551 return Hash.CalculateHash(); 9552 }; 9553 9554 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9555 Hash.clear(); 9556 Hash.AddTemplateArgument(TA); 9557 return Hash.CalculateHash(); 9558 }; 9559 9560 auto ComputeTemplateParameterListODRHash = 9561 [&Hash](const TemplateParameterList *TPL) { 9562 assert(TPL); 9563 Hash.clear(); 9564 Hash.AddTemplateParameterList(TPL); 9565 return Hash.CalculateHash(); 9566 }; 9567 9568 // Used with err_module_odr_violation_mismatch_decl and 9569 // note_module_odr_violation_mismatch_decl 9570 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed 9571 enum ODRMismatchDecl { 9572 EndOfClass, 9573 PublicSpecifer, 9574 PrivateSpecifer, 9575 ProtectedSpecifer, 9576 StaticAssert, 9577 Field, 9578 CXXMethod, 9579 TypeAlias, 9580 TypeDef, 9581 Var, 9582 Friend, 9583 FunctionTemplate, 9584 Other 9585 }; 9586 9587 // Used with err_module_odr_violation_mismatch_decl_diff and 9588 // note_module_odr_violation_mismatch_decl_diff 9589 enum ODRMismatchDeclDifference { 9590 StaticAssertCondition, 9591 StaticAssertMessage, 9592 StaticAssertOnlyMessage, 9593 FieldName, 9594 FieldTypeName, 9595 FieldSingleBitField, 9596 FieldDifferentWidthBitField, 9597 FieldSingleMutable, 9598 FieldSingleInitializer, 9599 FieldDifferentInitializers, 9600 MethodName, 9601 MethodDeleted, 9602 MethodDefaulted, 9603 MethodVirtual, 9604 MethodStatic, 9605 MethodVolatile, 9606 MethodConst, 9607 MethodInline, 9608 MethodNumberParameters, 9609 MethodParameterType, 9610 MethodParameterName, 9611 MethodParameterSingleDefaultArgument, 9612 MethodParameterDifferentDefaultArgument, 9613 MethodNoTemplateArguments, 9614 MethodDifferentNumberTemplateArguments, 9615 MethodDifferentTemplateArgument, 9616 MethodSingleBody, 9617 MethodDifferentBody, 9618 TypedefName, 9619 TypedefType, 9620 VarName, 9621 VarType, 9622 VarSingleInitializer, 9623 VarDifferentInitializer, 9624 VarConstexpr, 9625 FriendTypeFunction, 9626 FriendType, 9627 FriendFunction, 9628 FunctionTemplateDifferentNumberParameters, 9629 FunctionTemplateParameterDifferentKind, 9630 FunctionTemplateParameterName, 9631 FunctionTemplateParameterSingleDefaultArgument, 9632 FunctionTemplateParameterDifferentDefaultArgument, 9633 FunctionTemplateParameterDifferentType, 9634 FunctionTemplatePackParameter, 9635 }; 9636 9637 // These lambdas have the common portions of the ODR diagnostics. This 9638 // has the same return as Diag(), so addition parameters can be passed 9639 // in with operator<< 9640 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9641 SourceLocation Loc, SourceRange Range, 9642 ODRMismatchDeclDifference DiffType) { 9643 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9644 << FirstRecord << FirstModule.empty() << FirstModule << Range 9645 << DiffType; 9646 }; 9647 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9648 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9649 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9650 << SecondModule << Range << DiffType; 9651 }; 9652 9653 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9654 &ComputeQualTypeODRHash, &ComputeODRHash]( 9655 NamedDecl *FirstRecord, StringRef FirstModule, 9656 StringRef SecondModule, FieldDecl *FirstField, 9657 FieldDecl *SecondField) { 9658 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9659 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9660 if (FirstII->getName() != SecondII->getName()) { 9661 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9662 FirstField->getSourceRange(), FieldName) 9663 << FirstII; 9664 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9665 SecondField->getSourceRange(), FieldName) 9666 << SecondII; 9667 9668 return true; 9669 } 9670 9671 assert(getContext().hasSameType(FirstField->getType(), 9672 SecondField->getType())); 9673 9674 QualType FirstType = FirstField->getType(); 9675 QualType SecondType = SecondField->getType(); 9676 if (ComputeQualTypeODRHash(FirstType) != 9677 ComputeQualTypeODRHash(SecondType)) { 9678 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9679 FirstField->getSourceRange(), FieldTypeName) 9680 << FirstII << FirstType; 9681 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9682 SecondField->getSourceRange(), FieldTypeName) 9683 << SecondII << SecondType; 9684 9685 return true; 9686 } 9687 9688 const bool IsFirstBitField = FirstField->isBitField(); 9689 const bool IsSecondBitField = SecondField->isBitField(); 9690 if (IsFirstBitField != IsSecondBitField) { 9691 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9692 FirstField->getSourceRange(), FieldSingleBitField) 9693 << FirstII << IsFirstBitField; 9694 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9695 SecondField->getSourceRange(), FieldSingleBitField) 9696 << SecondII << IsSecondBitField; 9697 return true; 9698 } 9699 9700 if (IsFirstBitField && IsSecondBitField) { 9701 unsigned FirstBitWidthHash = 9702 ComputeODRHash(FirstField->getBitWidth()); 9703 unsigned SecondBitWidthHash = 9704 ComputeODRHash(SecondField->getBitWidth()); 9705 if (FirstBitWidthHash != SecondBitWidthHash) { 9706 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9707 FirstField->getSourceRange(), 9708 FieldDifferentWidthBitField) 9709 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9710 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9711 SecondField->getSourceRange(), 9712 FieldDifferentWidthBitField) 9713 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9714 return true; 9715 } 9716 } 9717 9718 if (!PP.getLangOpts().CPlusPlus) 9719 return false; 9720 9721 const bool IsFirstMutable = FirstField->isMutable(); 9722 const bool IsSecondMutable = SecondField->isMutable(); 9723 if (IsFirstMutable != IsSecondMutable) { 9724 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9725 FirstField->getSourceRange(), FieldSingleMutable) 9726 << FirstII << IsFirstMutable; 9727 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9728 SecondField->getSourceRange(), FieldSingleMutable) 9729 << SecondII << IsSecondMutable; 9730 return true; 9731 } 9732 9733 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9734 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9735 if ((!FirstInitializer && SecondInitializer) || 9736 (FirstInitializer && !SecondInitializer)) { 9737 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9738 FirstField->getSourceRange(), FieldSingleInitializer) 9739 << FirstII << (FirstInitializer != nullptr); 9740 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9741 SecondField->getSourceRange(), FieldSingleInitializer) 9742 << SecondII << (SecondInitializer != nullptr); 9743 return true; 9744 } 9745 9746 if (FirstInitializer && SecondInitializer) { 9747 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9748 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9749 if (FirstInitHash != SecondInitHash) { 9750 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9751 FirstField->getSourceRange(), 9752 FieldDifferentInitializers) 9753 << FirstII << FirstInitializer->getSourceRange(); 9754 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9755 SecondField->getSourceRange(), 9756 FieldDifferentInitializers) 9757 << SecondII << SecondInitializer->getSourceRange(); 9758 return true; 9759 } 9760 } 9761 9762 return false; 9763 }; 9764 9765 auto ODRDiagTypeDefOrAlias = 9766 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9767 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9768 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9769 bool IsTypeAlias) { 9770 auto FirstName = FirstTD->getDeclName(); 9771 auto SecondName = SecondTD->getDeclName(); 9772 if (FirstName != SecondName) { 9773 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9774 FirstTD->getSourceRange(), TypedefName) 9775 << IsTypeAlias << FirstName; 9776 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9777 SecondTD->getSourceRange(), TypedefName) 9778 << IsTypeAlias << SecondName; 9779 return true; 9780 } 9781 9782 QualType FirstType = FirstTD->getUnderlyingType(); 9783 QualType SecondType = SecondTD->getUnderlyingType(); 9784 if (ComputeQualTypeODRHash(FirstType) != 9785 ComputeQualTypeODRHash(SecondType)) { 9786 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9787 FirstTD->getSourceRange(), TypedefType) 9788 << IsTypeAlias << FirstName << FirstType; 9789 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9790 SecondTD->getSourceRange(), TypedefType) 9791 << IsTypeAlias << SecondName << SecondType; 9792 return true; 9793 } 9794 9795 return false; 9796 }; 9797 9798 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9799 &ComputeQualTypeODRHash, &ComputeODRHash, 9800 this](NamedDecl *FirstRecord, StringRef FirstModule, 9801 StringRef SecondModule, VarDecl *FirstVD, 9802 VarDecl *SecondVD) { 9803 auto FirstName = FirstVD->getDeclName(); 9804 auto SecondName = SecondVD->getDeclName(); 9805 if (FirstName != SecondName) { 9806 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9807 FirstVD->getSourceRange(), VarName) 9808 << FirstName; 9809 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9810 SecondVD->getSourceRange(), VarName) 9811 << SecondName; 9812 return true; 9813 } 9814 9815 QualType FirstType = FirstVD->getType(); 9816 QualType SecondType = SecondVD->getType(); 9817 if (ComputeQualTypeODRHash(FirstType) != 9818 ComputeQualTypeODRHash(SecondType)) { 9819 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9820 FirstVD->getSourceRange(), VarType) 9821 << FirstName << FirstType; 9822 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9823 SecondVD->getSourceRange(), VarType) 9824 << SecondName << SecondType; 9825 return true; 9826 } 9827 9828 if (!PP.getLangOpts().CPlusPlus) 9829 return false; 9830 9831 const Expr *FirstInit = FirstVD->getInit(); 9832 const Expr *SecondInit = SecondVD->getInit(); 9833 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9834 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9835 FirstVD->getSourceRange(), VarSingleInitializer) 9836 << FirstName << (FirstInit == nullptr) 9837 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9838 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9839 SecondVD->getSourceRange(), VarSingleInitializer) 9840 << SecondName << (SecondInit == nullptr) 9841 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9842 return true; 9843 } 9844 9845 if (FirstInit && SecondInit && 9846 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9847 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9848 FirstVD->getSourceRange(), VarDifferentInitializer) 9849 << FirstName << FirstInit->getSourceRange(); 9850 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9851 SecondVD->getSourceRange(), VarDifferentInitializer) 9852 << SecondName << SecondInit->getSourceRange(); 9853 return true; 9854 } 9855 9856 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9857 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9858 if (FirstIsConstexpr != SecondIsConstexpr) { 9859 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9860 FirstVD->getSourceRange(), VarConstexpr) 9861 << FirstName << FirstIsConstexpr; 9862 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9863 SecondVD->getSourceRange(), VarConstexpr) 9864 << SecondName << SecondIsConstexpr; 9865 return true; 9866 } 9867 return false; 9868 }; 9869 9870 auto DifferenceSelector = [](Decl *D) { 9871 assert(D && "valid Decl required"); 9872 switch (D->getKind()) { 9873 default: 9874 return Other; 9875 case Decl::AccessSpec: 9876 switch (D->getAccess()) { 9877 case AS_public: 9878 return PublicSpecifer; 9879 case AS_private: 9880 return PrivateSpecifer; 9881 case AS_protected: 9882 return ProtectedSpecifer; 9883 case AS_none: 9884 break; 9885 } 9886 llvm_unreachable("Invalid access specifier"); 9887 case Decl::StaticAssert: 9888 return StaticAssert; 9889 case Decl::Field: 9890 return Field; 9891 case Decl::CXXMethod: 9892 case Decl::CXXConstructor: 9893 case Decl::CXXDestructor: 9894 return CXXMethod; 9895 case Decl::TypeAlias: 9896 return TypeAlias; 9897 case Decl::Typedef: 9898 return TypeDef; 9899 case Decl::Var: 9900 return Var; 9901 case Decl::Friend: 9902 return Friend; 9903 case Decl::FunctionTemplate: 9904 return FunctionTemplate; 9905 } 9906 }; 9907 9908 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9909 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9910 RecordDecl *Record, 9911 const DeclContext *DC) { 9912 for (auto *D : Record->decls()) { 9913 if (!ODRHash::isDeclToBeProcessed(D, DC)) 9914 continue; 9915 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9916 } 9917 }; 9918 9919 struct DiffResult { 9920 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9921 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9922 }; 9923 9924 // If there is a diagnoseable difference, FirstDiffType and 9925 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9926 // filled in if not EndOfClass. 9927 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9928 DeclHashes &SecondHashes) { 9929 DiffResult DR; 9930 auto FirstIt = FirstHashes.begin(); 9931 auto SecondIt = SecondHashes.begin(); 9932 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9933 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9934 FirstIt->second == SecondIt->second) { 9935 ++FirstIt; 9936 ++SecondIt; 9937 continue; 9938 } 9939 9940 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9941 DR.SecondDecl = 9942 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9943 9944 DR.FirstDiffType = 9945 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9946 DR.SecondDiffType = 9947 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 9948 return DR; 9949 } 9950 return DR; 9951 }; 9952 9953 // Use this to diagnose that an unexpected Decl was encountered 9954 // or no difference was detected. This causes a generic error 9955 // message to be emitted. 9956 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 9957 StringRef FirstModule, 9958 NamedDecl *SecondRecord, 9959 StringRef SecondModule) { 9960 Diag(FirstRecord->getLocation(), 9961 diag::err_module_odr_violation_different_definitions) 9962 << FirstRecord << FirstModule.empty() << FirstModule; 9963 9964 if (DR.FirstDecl) { 9965 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 9966 << FirstRecord << DR.FirstDecl->getSourceRange(); 9967 } 9968 9969 Diag(SecondRecord->getLocation(), 9970 diag::note_module_odr_violation_different_definitions) 9971 << SecondModule; 9972 9973 if (DR.SecondDecl) { 9974 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 9975 << DR.SecondDecl->getSourceRange(); 9976 } 9977 }; 9978 9979 auto DiagnoseODRMismatch = 9980 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 9981 NamedDecl *SecondRecord, StringRef SecondModule) { 9982 SourceLocation FirstLoc; 9983 SourceRange FirstRange; 9984 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 9985 if (DR.FirstDiffType == EndOfClass && FirstTag) { 9986 FirstLoc = FirstTag->getBraceRange().getEnd(); 9987 } else { 9988 FirstLoc = DR.FirstDecl->getLocation(); 9989 FirstRange = DR.FirstDecl->getSourceRange(); 9990 } 9991 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9992 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9993 << DR.FirstDiffType; 9994 9995 SourceLocation SecondLoc; 9996 SourceRange SecondRange; 9997 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 9998 if (DR.SecondDiffType == EndOfClass && SecondTag) { 9999 SecondLoc = SecondTag->getBraceRange().getEnd(); 10000 } else { 10001 SecondLoc = DR.SecondDecl->getLocation(); 10002 SecondRange = DR.SecondDecl->getSourceRange(); 10003 } 10004 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 10005 << SecondModule << SecondRange << DR.SecondDiffType; 10006 }; 10007 10008 // Issue any pending ODR-failure diagnostics. 10009 for (auto &Merge : OdrMergeFailures) { 10010 // If we've already pointed out a specific problem with this class, don't 10011 // bother issuing a general "something's different" diagnostic. 10012 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 10013 continue; 10014 10015 bool Diagnosed = false; 10016 CXXRecordDecl *FirstRecord = Merge.first; 10017 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 10018 for (auto &RecordPair : Merge.second) { 10019 CXXRecordDecl *SecondRecord = RecordPair.first; 10020 // Multiple different declarations got merged together; tell the user 10021 // where they came from. 10022 if (FirstRecord == SecondRecord) 10023 continue; 10024 10025 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 10026 10027 auto *FirstDD = FirstRecord->DefinitionData; 10028 auto *SecondDD = RecordPair.second; 10029 10030 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 10031 10032 // Diagnostics from DefinitionData are emitted here. 10033 if (FirstDD != SecondDD) { 10034 enum ODRDefinitionDataDifference { 10035 NumBases, 10036 NumVBases, 10037 BaseType, 10038 BaseVirtual, 10039 BaseAccess, 10040 }; 10041 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 10042 this](SourceLocation Loc, SourceRange Range, 10043 ODRDefinitionDataDifference DiffType) { 10044 return Diag(Loc, diag::err_module_odr_violation_definition_data) 10045 << FirstRecord << FirstModule.empty() << FirstModule << Range 10046 << DiffType; 10047 }; 10048 auto ODRDiagBaseNote = [&SecondModule, 10049 this](SourceLocation Loc, SourceRange Range, 10050 ODRDefinitionDataDifference DiffType) { 10051 return Diag(Loc, diag::note_module_odr_violation_definition_data) 10052 << SecondModule << Range << DiffType; 10053 }; 10054 10055 unsigned FirstNumBases = FirstDD->NumBases; 10056 unsigned FirstNumVBases = FirstDD->NumVBases; 10057 unsigned SecondNumBases = SecondDD->NumBases; 10058 unsigned SecondNumVBases = SecondDD->NumVBases; 10059 10060 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 10061 unsigned NumBases = DD->NumBases; 10062 if (NumBases == 0) return SourceRange(); 10063 auto bases = DD->bases(); 10064 return SourceRange(bases[0].getBeginLoc(), 10065 bases[NumBases - 1].getEndLoc()); 10066 }; 10067 10068 if (FirstNumBases != SecondNumBases) { 10069 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10070 NumBases) 10071 << FirstNumBases; 10072 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10073 NumBases) 10074 << SecondNumBases; 10075 Diagnosed = true; 10076 break; 10077 } 10078 10079 if (FirstNumVBases != SecondNumVBases) { 10080 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10081 NumVBases) 10082 << FirstNumVBases; 10083 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10084 NumVBases) 10085 << SecondNumVBases; 10086 Diagnosed = true; 10087 break; 10088 } 10089 10090 auto FirstBases = FirstDD->bases(); 10091 auto SecondBases = SecondDD->bases(); 10092 unsigned i = 0; 10093 for (i = 0; i < FirstNumBases; ++i) { 10094 auto FirstBase = FirstBases[i]; 10095 auto SecondBase = SecondBases[i]; 10096 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10097 ComputeQualTypeODRHash(SecondBase.getType())) { 10098 ODRDiagBaseError(FirstRecord->getLocation(), 10099 FirstBase.getSourceRange(), BaseType) 10100 << (i + 1) << FirstBase.getType(); 10101 ODRDiagBaseNote(SecondRecord->getLocation(), 10102 SecondBase.getSourceRange(), BaseType) 10103 << (i + 1) << SecondBase.getType(); 10104 break; 10105 } 10106 10107 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10108 ODRDiagBaseError(FirstRecord->getLocation(), 10109 FirstBase.getSourceRange(), BaseVirtual) 10110 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10111 ODRDiagBaseNote(SecondRecord->getLocation(), 10112 SecondBase.getSourceRange(), BaseVirtual) 10113 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10114 break; 10115 } 10116 10117 if (FirstBase.getAccessSpecifierAsWritten() != 10118 SecondBase.getAccessSpecifierAsWritten()) { 10119 ODRDiagBaseError(FirstRecord->getLocation(), 10120 FirstBase.getSourceRange(), BaseAccess) 10121 << (i + 1) << FirstBase.getType() 10122 << (int)FirstBase.getAccessSpecifierAsWritten(); 10123 ODRDiagBaseNote(SecondRecord->getLocation(), 10124 SecondBase.getSourceRange(), BaseAccess) 10125 << (i + 1) << SecondBase.getType() 10126 << (int)SecondBase.getAccessSpecifierAsWritten(); 10127 break; 10128 } 10129 } 10130 10131 if (i != FirstNumBases) { 10132 Diagnosed = true; 10133 break; 10134 } 10135 } 10136 10137 const ClassTemplateDecl *FirstTemplate = 10138 FirstRecord->getDescribedClassTemplate(); 10139 const ClassTemplateDecl *SecondTemplate = 10140 SecondRecord->getDescribedClassTemplate(); 10141 10142 assert(!FirstTemplate == !SecondTemplate && 10143 "Both pointers should be null or non-null"); 10144 10145 enum ODRTemplateDifference { 10146 ParamEmptyName, 10147 ParamName, 10148 ParamSingleDefaultArgument, 10149 ParamDifferentDefaultArgument, 10150 }; 10151 10152 if (FirstTemplate && SecondTemplate) { 10153 DeclHashes FirstTemplateHashes; 10154 DeclHashes SecondTemplateHashes; 10155 10156 auto PopulateTemplateParameterHashs = 10157 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10158 const ClassTemplateDecl *TD) { 10159 for (auto *D : TD->getTemplateParameters()->asArray()) { 10160 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10161 } 10162 }; 10163 10164 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10165 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10166 10167 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10168 "Number of template parameters should be equal."); 10169 10170 auto FirstIt = FirstTemplateHashes.begin(); 10171 auto FirstEnd = FirstTemplateHashes.end(); 10172 auto SecondIt = SecondTemplateHashes.begin(); 10173 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10174 if (FirstIt->second == SecondIt->second) 10175 continue; 10176 10177 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( 10178 SourceLocation Loc, SourceRange Range, 10179 ODRTemplateDifference DiffType) { 10180 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 10181 << FirstRecord << FirstModule.empty() << FirstModule << Range 10182 << DiffType; 10183 }; 10184 auto ODRDiagTemplateNote = [&SecondModule, this]( 10185 SourceLocation Loc, SourceRange Range, 10186 ODRTemplateDifference DiffType) { 10187 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 10188 << SecondModule << Range << DiffType; 10189 }; 10190 10191 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10192 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10193 10194 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10195 "Parameter Decl's should be the same kind."); 10196 10197 DeclarationName FirstName = FirstDecl->getDeclName(); 10198 DeclarationName SecondName = SecondDecl->getDeclName(); 10199 10200 if (FirstName != SecondName) { 10201 const bool FirstNameEmpty = 10202 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10203 const bool SecondNameEmpty = 10204 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 10205 assert((!FirstNameEmpty || !SecondNameEmpty) && 10206 "Both template parameters cannot be unnamed."); 10207 ODRDiagTemplateError(FirstDecl->getLocation(), 10208 FirstDecl->getSourceRange(), 10209 FirstNameEmpty ? ParamEmptyName : ParamName) 10210 << FirstName; 10211 ODRDiagTemplateNote(SecondDecl->getLocation(), 10212 SecondDecl->getSourceRange(), 10213 SecondNameEmpty ? ParamEmptyName : ParamName) 10214 << SecondName; 10215 break; 10216 } 10217 10218 switch (FirstDecl->getKind()) { 10219 default: 10220 llvm_unreachable("Invalid template parameter type."); 10221 case Decl::TemplateTypeParm: { 10222 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 10223 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 10224 const bool HasFirstDefaultArgument = 10225 FirstParam->hasDefaultArgument() && 10226 !FirstParam->defaultArgumentWasInherited(); 10227 const bool HasSecondDefaultArgument = 10228 SecondParam->hasDefaultArgument() && 10229 !SecondParam->defaultArgumentWasInherited(); 10230 10231 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10232 ODRDiagTemplateError(FirstDecl->getLocation(), 10233 FirstDecl->getSourceRange(), 10234 ParamSingleDefaultArgument) 10235 << HasFirstDefaultArgument; 10236 ODRDiagTemplateNote(SecondDecl->getLocation(), 10237 SecondDecl->getSourceRange(), 10238 ParamSingleDefaultArgument) 10239 << HasSecondDefaultArgument; 10240 break; 10241 } 10242 10243 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10244 "Expecting default arguments."); 10245 10246 ODRDiagTemplateError(FirstDecl->getLocation(), 10247 FirstDecl->getSourceRange(), 10248 ParamDifferentDefaultArgument); 10249 ODRDiagTemplateNote(SecondDecl->getLocation(), 10250 SecondDecl->getSourceRange(), 10251 ParamDifferentDefaultArgument); 10252 10253 break; 10254 } 10255 case Decl::NonTypeTemplateParm: { 10256 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 10257 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 10258 const bool HasFirstDefaultArgument = 10259 FirstParam->hasDefaultArgument() && 10260 !FirstParam->defaultArgumentWasInherited(); 10261 const bool HasSecondDefaultArgument = 10262 SecondParam->hasDefaultArgument() && 10263 !SecondParam->defaultArgumentWasInherited(); 10264 10265 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10266 ODRDiagTemplateError(FirstDecl->getLocation(), 10267 FirstDecl->getSourceRange(), 10268 ParamSingleDefaultArgument) 10269 << HasFirstDefaultArgument; 10270 ODRDiagTemplateNote(SecondDecl->getLocation(), 10271 SecondDecl->getSourceRange(), 10272 ParamSingleDefaultArgument) 10273 << HasSecondDefaultArgument; 10274 break; 10275 } 10276 10277 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10278 "Expecting default arguments."); 10279 10280 ODRDiagTemplateError(FirstDecl->getLocation(), 10281 FirstDecl->getSourceRange(), 10282 ParamDifferentDefaultArgument); 10283 ODRDiagTemplateNote(SecondDecl->getLocation(), 10284 SecondDecl->getSourceRange(), 10285 ParamDifferentDefaultArgument); 10286 10287 break; 10288 } 10289 case Decl::TemplateTemplateParm: { 10290 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 10291 const auto *SecondParam = 10292 cast<TemplateTemplateParmDecl>(SecondDecl); 10293 const bool HasFirstDefaultArgument = 10294 FirstParam->hasDefaultArgument() && 10295 !FirstParam->defaultArgumentWasInherited(); 10296 const bool HasSecondDefaultArgument = 10297 SecondParam->hasDefaultArgument() && 10298 !SecondParam->defaultArgumentWasInherited(); 10299 10300 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10301 ODRDiagTemplateError(FirstDecl->getLocation(), 10302 FirstDecl->getSourceRange(), 10303 ParamSingleDefaultArgument) 10304 << HasFirstDefaultArgument; 10305 ODRDiagTemplateNote(SecondDecl->getLocation(), 10306 SecondDecl->getSourceRange(), 10307 ParamSingleDefaultArgument) 10308 << HasSecondDefaultArgument; 10309 break; 10310 } 10311 10312 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10313 "Expecting default arguments."); 10314 10315 ODRDiagTemplateError(FirstDecl->getLocation(), 10316 FirstDecl->getSourceRange(), 10317 ParamDifferentDefaultArgument); 10318 ODRDiagTemplateNote(SecondDecl->getLocation(), 10319 SecondDecl->getSourceRange(), 10320 ParamDifferentDefaultArgument); 10321 10322 break; 10323 } 10324 } 10325 10326 break; 10327 } 10328 10329 if (FirstIt != FirstEnd) { 10330 Diagnosed = true; 10331 break; 10332 } 10333 } 10334 10335 DeclHashes FirstHashes; 10336 DeclHashes SecondHashes; 10337 const DeclContext *DC = FirstRecord; 10338 PopulateHashes(FirstHashes, FirstRecord, DC); 10339 PopulateHashes(SecondHashes, SecondRecord, DC); 10340 10341 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10342 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10343 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10344 Decl *FirstDecl = DR.FirstDecl; 10345 Decl *SecondDecl = DR.SecondDecl; 10346 10347 if (FirstDiffType == Other || SecondDiffType == Other) { 10348 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10349 SecondModule); 10350 Diagnosed = true; 10351 break; 10352 } 10353 10354 if (FirstDiffType != SecondDiffType) { 10355 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10356 SecondModule); 10357 Diagnosed = true; 10358 break; 10359 } 10360 10361 assert(FirstDiffType == SecondDiffType); 10362 10363 switch (FirstDiffType) { 10364 case Other: 10365 case EndOfClass: 10366 case PublicSpecifer: 10367 case PrivateSpecifer: 10368 case ProtectedSpecifer: 10369 llvm_unreachable("Invalid diff type"); 10370 10371 case StaticAssert: { 10372 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10373 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10374 10375 Expr *FirstExpr = FirstSA->getAssertExpr(); 10376 Expr *SecondExpr = SecondSA->getAssertExpr(); 10377 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10378 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10379 if (FirstODRHash != SecondODRHash) { 10380 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10381 FirstExpr->getSourceRange(), StaticAssertCondition); 10382 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10383 SecondExpr->getSourceRange(), StaticAssertCondition); 10384 Diagnosed = true; 10385 break; 10386 } 10387 10388 StringLiteral *FirstStr = FirstSA->getMessage(); 10389 StringLiteral *SecondStr = SecondSA->getMessage(); 10390 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10391 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10392 SourceLocation FirstLoc, SecondLoc; 10393 SourceRange FirstRange, SecondRange; 10394 if (FirstStr) { 10395 FirstLoc = FirstStr->getBeginLoc(); 10396 FirstRange = FirstStr->getSourceRange(); 10397 } else { 10398 FirstLoc = FirstSA->getBeginLoc(); 10399 FirstRange = FirstSA->getSourceRange(); 10400 } 10401 if (SecondStr) { 10402 SecondLoc = SecondStr->getBeginLoc(); 10403 SecondRange = SecondStr->getSourceRange(); 10404 } else { 10405 SecondLoc = SecondSA->getBeginLoc(); 10406 SecondRange = SecondSA->getSourceRange(); 10407 } 10408 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10409 StaticAssertOnlyMessage) 10410 << (FirstStr == nullptr); 10411 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10412 StaticAssertOnlyMessage) 10413 << (SecondStr == nullptr); 10414 Diagnosed = true; 10415 break; 10416 } 10417 10418 if (FirstStr && SecondStr && 10419 FirstStr->getString() != SecondStr->getString()) { 10420 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10421 FirstStr->getSourceRange(), StaticAssertMessage); 10422 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10423 SecondStr->getSourceRange(), StaticAssertMessage); 10424 Diagnosed = true; 10425 break; 10426 } 10427 break; 10428 } 10429 case Field: { 10430 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10431 cast<FieldDecl>(FirstDecl), 10432 cast<FieldDecl>(SecondDecl)); 10433 break; 10434 } 10435 case CXXMethod: { 10436 enum { 10437 DiagMethod, 10438 DiagConstructor, 10439 DiagDestructor, 10440 } FirstMethodType, 10441 SecondMethodType; 10442 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10443 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10444 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10445 return DiagMethod; 10446 }; 10447 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10448 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10449 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10450 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10451 auto FirstName = FirstMethod->getDeclName(); 10452 auto SecondName = SecondMethod->getDeclName(); 10453 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10454 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10455 FirstMethod->getSourceRange(), MethodName) 10456 << FirstMethodType << FirstName; 10457 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10458 SecondMethod->getSourceRange(), MethodName) 10459 << SecondMethodType << SecondName; 10460 10461 Diagnosed = true; 10462 break; 10463 } 10464 10465 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10466 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10467 if (FirstDeleted != SecondDeleted) { 10468 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10469 FirstMethod->getSourceRange(), MethodDeleted) 10470 << FirstMethodType << FirstName << FirstDeleted; 10471 10472 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10473 SecondMethod->getSourceRange(), MethodDeleted) 10474 << SecondMethodType << SecondName << SecondDeleted; 10475 Diagnosed = true; 10476 break; 10477 } 10478 10479 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10480 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10481 if (FirstDefaulted != SecondDefaulted) { 10482 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10483 FirstMethod->getSourceRange(), MethodDefaulted) 10484 << FirstMethodType << FirstName << FirstDefaulted; 10485 10486 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10487 SecondMethod->getSourceRange(), MethodDefaulted) 10488 << SecondMethodType << SecondName << SecondDefaulted; 10489 Diagnosed = true; 10490 break; 10491 } 10492 10493 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10494 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10495 const bool FirstPure = FirstMethod->isPure(); 10496 const bool SecondPure = SecondMethod->isPure(); 10497 if ((FirstVirtual || SecondVirtual) && 10498 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10499 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10500 FirstMethod->getSourceRange(), MethodVirtual) 10501 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10502 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10503 SecondMethod->getSourceRange(), MethodVirtual) 10504 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10505 Diagnosed = true; 10506 break; 10507 } 10508 10509 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10510 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10511 // class needs to be checked instead. 10512 const auto FirstStorage = FirstMethod->getStorageClass(); 10513 const auto SecondStorage = SecondMethod->getStorageClass(); 10514 const bool FirstStatic = FirstStorage == SC_Static; 10515 const bool SecondStatic = SecondStorage == SC_Static; 10516 if (FirstStatic != SecondStatic) { 10517 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10518 FirstMethod->getSourceRange(), MethodStatic) 10519 << FirstMethodType << FirstName << FirstStatic; 10520 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10521 SecondMethod->getSourceRange(), MethodStatic) 10522 << SecondMethodType << SecondName << SecondStatic; 10523 Diagnosed = true; 10524 break; 10525 } 10526 10527 const bool FirstVolatile = FirstMethod->isVolatile(); 10528 const bool SecondVolatile = SecondMethod->isVolatile(); 10529 if (FirstVolatile != SecondVolatile) { 10530 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10531 FirstMethod->getSourceRange(), MethodVolatile) 10532 << FirstMethodType << FirstName << FirstVolatile; 10533 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10534 SecondMethod->getSourceRange(), MethodVolatile) 10535 << SecondMethodType << SecondName << SecondVolatile; 10536 Diagnosed = true; 10537 break; 10538 } 10539 10540 const bool FirstConst = FirstMethod->isConst(); 10541 const bool SecondConst = SecondMethod->isConst(); 10542 if (FirstConst != SecondConst) { 10543 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10544 FirstMethod->getSourceRange(), MethodConst) 10545 << FirstMethodType << FirstName << FirstConst; 10546 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10547 SecondMethod->getSourceRange(), MethodConst) 10548 << SecondMethodType << SecondName << SecondConst; 10549 Diagnosed = true; 10550 break; 10551 } 10552 10553 const bool FirstInline = FirstMethod->isInlineSpecified(); 10554 const bool SecondInline = SecondMethod->isInlineSpecified(); 10555 if (FirstInline != SecondInline) { 10556 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10557 FirstMethod->getSourceRange(), MethodInline) 10558 << FirstMethodType << FirstName << FirstInline; 10559 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10560 SecondMethod->getSourceRange(), MethodInline) 10561 << SecondMethodType << SecondName << SecondInline; 10562 Diagnosed = true; 10563 break; 10564 } 10565 10566 const unsigned FirstNumParameters = FirstMethod->param_size(); 10567 const unsigned SecondNumParameters = SecondMethod->param_size(); 10568 if (FirstNumParameters != SecondNumParameters) { 10569 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10570 FirstMethod->getSourceRange(), 10571 MethodNumberParameters) 10572 << FirstMethodType << FirstName << FirstNumParameters; 10573 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10574 SecondMethod->getSourceRange(), 10575 MethodNumberParameters) 10576 << SecondMethodType << SecondName << SecondNumParameters; 10577 Diagnosed = true; 10578 break; 10579 } 10580 10581 // Need this status boolean to know when break out of the switch. 10582 bool ParameterMismatch = false; 10583 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10584 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10585 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10586 10587 QualType FirstParamType = FirstParam->getType(); 10588 QualType SecondParamType = SecondParam->getType(); 10589 if (FirstParamType != SecondParamType && 10590 ComputeQualTypeODRHash(FirstParamType) != 10591 ComputeQualTypeODRHash(SecondParamType)) { 10592 if (const DecayedType *ParamDecayedType = 10593 FirstParamType->getAs<DecayedType>()) { 10594 ODRDiagDeclError( 10595 FirstRecord, FirstModule, FirstMethod->getLocation(), 10596 FirstMethod->getSourceRange(), MethodParameterType) 10597 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10598 << true << ParamDecayedType->getOriginalType(); 10599 } else { 10600 ODRDiagDeclError( 10601 FirstRecord, FirstModule, FirstMethod->getLocation(), 10602 FirstMethod->getSourceRange(), MethodParameterType) 10603 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10604 << false; 10605 } 10606 10607 if (const DecayedType *ParamDecayedType = 10608 SecondParamType->getAs<DecayedType>()) { 10609 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10610 SecondMethod->getSourceRange(), 10611 MethodParameterType) 10612 << SecondMethodType << SecondName << (I + 1) 10613 << SecondParamType << true 10614 << ParamDecayedType->getOriginalType(); 10615 } else { 10616 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10617 SecondMethod->getSourceRange(), 10618 MethodParameterType) 10619 << SecondMethodType << SecondName << (I + 1) 10620 << SecondParamType << false; 10621 } 10622 ParameterMismatch = true; 10623 break; 10624 } 10625 10626 DeclarationName FirstParamName = FirstParam->getDeclName(); 10627 DeclarationName SecondParamName = SecondParam->getDeclName(); 10628 if (FirstParamName != SecondParamName) { 10629 ODRDiagDeclError(FirstRecord, FirstModule, 10630 FirstMethod->getLocation(), 10631 FirstMethod->getSourceRange(), MethodParameterName) 10632 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10633 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10634 SecondMethod->getSourceRange(), MethodParameterName) 10635 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10636 ParameterMismatch = true; 10637 break; 10638 } 10639 10640 const Expr *FirstInit = FirstParam->getInit(); 10641 const Expr *SecondInit = SecondParam->getInit(); 10642 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10643 ODRDiagDeclError(FirstRecord, FirstModule, 10644 FirstMethod->getLocation(), 10645 FirstMethod->getSourceRange(), 10646 MethodParameterSingleDefaultArgument) 10647 << FirstMethodType << FirstName << (I + 1) 10648 << (FirstInit == nullptr) 10649 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10650 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10651 SecondMethod->getSourceRange(), 10652 MethodParameterSingleDefaultArgument) 10653 << SecondMethodType << SecondName << (I + 1) 10654 << (SecondInit == nullptr) 10655 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10656 ParameterMismatch = true; 10657 break; 10658 } 10659 10660 if (FirstInit && SecondInit && 10661 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10662 ODRDiagDeclError(FirstRecord, FirstModule, 10663 FirstMethod->getLocation(), 10664 FirstMethod->getSourceRange(), 10665 MethodParameterDifferentDefaultArgument) 10666 << FirstMethodType << FirstName << (I + 1) 10667 << FirstInit->getSourceRange(); 10668 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10669 SecondMethod->getSourceRange(), 10670 MethodParameterDifferentDefaultArgument) 10671 << SecondMethodType << SecondName << (I + 1) 10672 << SecondInit->getSourceRange(); 10673 ParameterMismatch = true; 10674 break; 10675 10676 } 10677 } 10678 10679 if (ParameterMismatch) { 10680 Diagnosed = true; 10681 break; 10682 } 10683 10684 const auto *FirstTemplateArgs = 10685 FirstMethod->getTemplateSpecializationArgs(); 10686 const auto *SecondTemplateArgs = 10687 SecondMethod->getTemplateSpecializationArgs(); 10688 10689 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10690 (!FirstTemplateArgs && SecondTemplateArgs)) { 10691 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10692 FirstMethod->getSourceRange(), 10693 MethodNoTemplateArguments) 10694 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10695 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10696 SecondMethod->getSourceRange(), 10697 MethodNoTemplateArguments) 10698 << SecondMethodType << SecondName 10699 << (SecondTemplateArgs != nullptr); 10700 10701 Diagnosed = true; 10702 break; 10703 } 10704 10705 if (FirstTemplateArgs && SecondTemplateArgs) { 10706 // Remove pack expansions from argument list. 10707 auto ExpandTemplateArgumentList = 10708 [](const TemplateArgumentList *TAL) { 10709 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10710 for (const TemplateArgument &TA : TAL->asArray()) { 10711 if (TA.getKind() != TemplateArgument::Pack) { 10712 ExpandedList.push_back(&TA); 10713 continue; 10714 } 10715 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10716 ExpandedList.push_back(&PackTA); 10717 } 10718 } 10719 return ExpandedList; 10720 }; 10721 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10722 ExpandTemplateArgumentList(FirstTemplateArgs); 10723 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10724 ExpandTemplateArgumentList(SecondTemplateArgs); 10725 10726 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10727 ODRDiagDeclError(FirstRecord, FirstModule, 10728 FirstMethod->getLocation(), 10729 FirstMethod->getSourceRange(), 10730 MethodDifferentNumberTemplateArguments) 10731 << FirstMethodType << FirstName 10732 << (unsigned)FirstExpandedList.size(); 10733 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10734 SecondMethod->getSourceRange(), 10735 MethodDifferentNumberTemplateArguments) 10736 << SecondMethodType << SecondName 10737 << (unsigned)SecondExpandedList.size(); 10738 10739 Diagnosed = true; 10740 break; 10741 } 10742 10743 bool TemplateArgumentMismatch = false; 10744 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10745 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10746 &SecondTA = *SecondExpandedList[i]; 10747 if (ComputeTemplateArgumentODRHash(FirstTA) == 10748 ComputeTemplateArgumentODRHash(SecondTA)) { 10749 continue; 10750 } 10751 10752 ODRDiagDeclError( 10753 FirstRecord, FirstModule, FirstMethod->getLocation(), 10754 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10755 << FirstMethodType << FirstName << FirstTA << i + 1; 10756 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10757 SecondMethod->getSourceRange(), 10758 MethodDifferentTemplateArgument) 10759 << SecondMethodType << SecondName << SecondTA << i + 1; 10760 10761 TemplateArgumentMismatch = true; 10762 break; 10763 } 10764 10765 if (TemplateArgumentMismatch) { 10766 Diagnosed = true; 10767 break; 10768 } 10769 } 10770 10771 // Compute the hash of the method as if it has no body. 10772 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10773 Hash.clear(); 10774 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10775 return Hash.CalculateHash(); 10776 }; 10777 10778 // Compare the hash generated to the hash stored. A difference means 10779 // that a body was present in the original source. Due to merging, 10780 // the stardard way of detecting a body will not work. 10781 const bool HasFirstBody = 10782 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10783 const bool HasSecondBody = 10784 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10785 10786 if (HasFirstBody != HasSecondBody) { 10787 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10788 FirstMethod->getSourceRange(), MethodSingleBody) 10789 << FirstMethodType << FirstName << HasFirstBody; 10790 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10791 SecondMethod->getSourceRange(), MethodSingleBody) 10792 << SecondMethodType << SecondName << HasSecondBody; 10793 Diagnosed = true; 10794 break; 10795 } 10796 10797 if (HasFirstBody && HasSecondBody) { 10798 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10799 FirstMethod->getSourceRange(), MethodDifferentBody) 10800 << FirstMethodType << FirstName; 10801 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10802 SecondMethod->getSourceRange(), MethodDifferentBody) 10803 << SecondMethodType << SecondName; 10804 Diagnosed = true; 10805 break; 10806 } 10807 10808 break; 10809 } 10810 case TypeAlias: 10811 case TypeDef: { 10812 Diagnosed = ODRDiagTypeDefOrAlias( 10813 FirstRecord, FirstModule, SecondModule, 10814 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10815 FirstDiffType == TypeAlias); 10816 break; 10817 } 10818 case Var: { 10819 Diagnosed = 10820 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10821 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10822 break; 10823 } 10824 case Friend: { 10825 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10826 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10827 10828 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10829 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10830 10831 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10832 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10833 10834 if (FirstND && SecondND) { 10835 ODRDiagDeclError(FirstRecord, FirstModule, 10836 FirstFriend->getFriendLoc(), 10837 FirstFriend->getSourceRange(), FriendFunction) 10838 << FirstND; 10839 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10840 SecondFriend->getSourceRange(), FriendFunction) 10841 << SecondND; 10842 10843 Diagnosed = true; 10844 break; 10845 } 10846 10847 if (FirstTSI && SecondTSI) { 10848 QualType FirstFriendType = FirstTSI->getType(); 10849 QualType SecondFriendType = SecondTSI->getType(); 10850 assert(ComputeQualTypeODRHash(FirstFriendType) != 10851 ComputeQualTypeODRHash(SecondFriendType)); 10852 ODRDiagDeclError(FirstRecord, FirstModule, 10853 FirstFriend->getFriendLoc(), 10854 FirstFriend->getSourceRange(), FriendType) 10855 << FirstFriendType; 10856 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10857 SecondFriend->getSourceRange(), FriendType) 10858 << SecondFriendType; 10859 Diagnosed = true; 10860 break; 10861 } 10862 10863 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10864 FirstFriend->getSourceRange(), FriendTypeFunction) 10865 << (FirstTSI == nullptr); 10866 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10867 SecondFriend->getSourceRange(), FriendTypeFunction) 10868 << (SecondTSI == nullptr); 10869 10870 Diagnosed = true; 10871 break; 10872 } 10873 case FunctionTemplate: { 10874 FunctionTemplateDecl *FirstTemplate = 10875 cast<FunctionTemplateDecl>(FirstDecl); 10876 FunctionTemplateDecl *SecondTemplate = 10877 cast<FunctionTemplateDecl>(SecondDecl); 10878 10879 TemplateParameterList *FirstTPL = 10880 FirstTemplate->getTemplateParameters(); 10881 TemplateParameterList *SecondTPL = 10882 SecondTemplate->getTemplateParameters(); 10883 10884 if (FirstTPL->size() != SecondTPL->size()) { 10885 ODRDiagDeclError(FirstRecord, FirstModule, 10886 FirstTemplate->getLocation(), 10887 FirstTemplate->getSourceRange(), 10888 FunctionTemplateDifferentNumberParameters) 10889 << FirstTemplate << FirstTPL->size(); 10890 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10891 SecondTemplate->getSourceRange(), 10892 FunctionTemplateDifferentNumberParameters) 10893 << SecondTemplate << SecondTPL->size(); 10894 10895 Diagnosed = true; 10896 break; 10897 } 10898 10899 bool ParameterMismatch = false; 10900 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10901 NamedDecl *FirstParam = FirstTPL->getParam(i); 10902 NamedDecl *SecondParam = SecondTPL->getParam(i); 10903 10904 if (FirstParam->getKind() != SecondParam->getKind()) { 10905 enum { 10906 TemplateTypeParameter, 10907 NonTypeTemplateParameter, 10908 TemplateTemplateParameter, 10909 }; 10910 auto GetParamType = [](NamedDecl *D) { 10911 switch (D->getKind()) { 10912 default: 10913 llvm_unreachable("Unexpected template parameter type"); 10914 case Decl::TemplateTypeParm: 10915 return TemplateTypeParameter; 10916 case Decl::NonTypeTemplateParm: 10917 return NonTypeTemplateParameter; 10918 case Decl::TemplateTemplateParm: 10919 return TemplateTemplateParameter; 10920 } 10921 }; 10922 10923 ODRDiagDeclError(FirstRecord, FirstModule, 10924 FirstTemplate->getLocation(), 10925 FirstTemplate->getSourceRange(), 10926 FunctionTemplateParameterDifferentKind) 10927 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10928 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10929 SecondTemplate->getSourceRange(), 10930 FunctionTemplateParameterDifferentKind) 10931 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10932 10933 ParameterMismatch = true; 10934 break; 10935 } 10936 10937 if (FirstParam->getName() != SecondParam->getName()) { 10938 ODRDiagDeclError( 10939 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10940 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10941 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10942 << FirstParam; 10943 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10944 SecondTemplate->getSourceRange(), 10945 FunctionTemplateParameterName) 10946 << SecondTemplate << (i + 1) 10947 << (bool)SecondParam->getIdentifier() << SecondParam; 10948 ParameterMismatch = true; 10949 break; 10950 } 10951 10952 if (isa<TemplateTypeParmDecl>(FirstParam) && 10953 isa<TemplateTypeParmDecl>(SecondParam)) { 10954 TemplateTypeParmDecl *FirstTTPD = 10955 cast<TemplateTypeParmDecl>(FirstParam); 10956 TemplateTypeParmDecl *SecondTTPD = 10957 cast<TemplateTypeParmDecl>(SecondParam); 10958 bool HasFirstDefaultArgument = 10959 FirstTTPD->hasDefaultArgument() && 10960 !FirstTTPD->defaultArgumentWasInherited(); 10961 bool HasSecondDefaultArgument = 10962 SecondTTPD->hasDefaultArgument() && 10963 !SecondTTPD->defaultArgumentWasInherited(); 10964 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10965 ODRDiagDeclError(FirstRecord, FirstModule, 10966 FirstTemplate->getLocation(), 10967 FirstTemplate->getSourceRange(), 10968 FunctionTemplateParameterSingleDefaultArgument) 10969 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10970 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10971 SecondTemplate->getSourceRange(), 10972 FunctionTemplateParameterSingleDefaultArgument) 10973 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10974 ParameterMismatch = true; 10975 break; 10976 } 10977 10978 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10979 QualType FirstType = FirstTTPD->getDefaultArgument(); 10980 QualType SecondType = SecondTTPD->getDefaultArgument(); 10981 if (ComputeQualTypeODRHash(FirstType) != 10982 ComputeQualTypeODRHash(SecondType)) { 10983 ODRDiagDeclError( 10984 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10985 FirstTemplate->getSourceRange(), 10986 FunctionTemplateParameterDifferentDefaultArgument) 10987 << FirstTemplate << (i + 1) << FirstType; 10988 ODRDiagDeclNote( 10989 SecondModule, SecondTemplate->getLocation(), 10990 SecondTemplate->getSourceRange(), 10991 FunctionTemplateParameterDifferentDefaultArgument) 10992 << SecondTemplate << (i + 1) << SecondType; 10993 ParameterMismatch = true; 10994 break; 10995 } 10996 } 10997 10998 if (FirstTTPD->isParameterPack() != 10999 SecondTTPD->isParameterPack()) { 11000 ODRDiagDeclError(FirstRecord, FirstModule, 11001 FirstTemplate->getLocation(), 11002 FirstTemplate->getSourceRange(), 11003 FunctionTemplatePackParameter) 11004 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11005 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11006 SecondTemplate->getSourceRange(), 11007 FunctionTemplatePackParameter) 11008 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11009 ParameterMismatch = true; 11010 break; 11011 } 11012 } 11013 11014 if (isa<TemplateTemplateParmDecl>(FirstParam) && 11015 isa<TemplateTemplateParmDecl>(SecondParam)) { 11016 TemplateTemplateParmDecl *FirstTTPD = 11017 cast<TemplateTemplateParmDecl>(FirstParam); 11018 TemplateTemplateParmDecl *SecondTTPD = 11019 cast<TemplateTemplateParmDecl>(SecondParam); 11020 11021 TemplateParameterList *FirstTPL = 11022 FirstTTPD->getTemplateParameters(); 11023 TemplateParameterList *SecondTPL = 11024 SecondTTPD->getTemplateParameters(); 11025 11026 if (ComputeTemplateParameterListODRHash(FirstTPL) != 11027 ComputeTemplateParameterListODRHash(SecondTPL)) { 11028 ODRDiagDeclError(FirstRecord, FirstModule, 11029 FirstTemplate->getLocation(), 11030 FirstTemplate->getSourceRange(), 11031 FunctionTemplateParameterDifferentType) 11032 << FirstTemplate << (i + 1); 11033 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11034 SecondTemplate->getSourceRange(), 11035 FunctionTemplateParameterDifferentType) 11036 << SecondTemplate << (i + 1); 11037 ParameterMismatch = true; 11038 break; 11039 } 11040 11041 bool HasFirstDefaultArgument = 11042 FirstTTPD->hasDefaultArgument() && 11043 !FirstTTPD->defaultArgumentWasInherited(); 11044 bool HasSecondDefaultArgument = 11045 SecondTTPD->hasDefaultArgument() && 11046 !SecondTTPD->defaultArgumentWasInherited(); 11047 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11048 ODRDiagDeclError(FirstRecord, FirstModule, 11049 FirstTemplate->getLocation(), 11050 FirstTemplate->getSourceRange(), 11051 FunctionTemplateParameterSingleDefaultArgument) 11052 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11053 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11054 SecondTemplate->getSourceRange(), 11055 FunctionTemplateParameterSingleDefaultArgument) 11056 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11057 ParameterMismatch = true; 11058 break; 11059 } 11060 11061 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11062 TemplateArgument FirstTA = 11063 FirstTTPD->getDefaultArgument().getArgument(); 11064 TemplateArgument SecondTA = 11065 SecondTTPD->getDefaultArgument().getArgument(); 11066 if (ComputeTemplateArgumentODRHash(FirstTA) != 11067 ComputeTemplateArgumentODRHash(SecondTA)) { 11068 ODRDiagDeclError( 11069 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11070 FirstTemplate->getSourceRange(), 11071 FunctionTemplateParameterDifferentDefaultArgument) 11072 << FirstTemplate << (i + 1) << FirstTA; 11073 ODRDiagDeclNote( 11074 SecondModule, SecondTemplate->getLocation(), 11075 SecondTemplate->getSourceRange(), 11076 FunctionTemplateParameterDifferentDefaultArgument) 11077 << SecondTemplate << (i + 1) << SecondTA; 11078 ParameterMismatch = true; 11079 break; 11080 } 11081 } 11082 11083 if (FirstTTPD->isParameterPack() != 11084 SecondTTPD->isParameterPack()) { 11085 ODRDiagDeclError(FirstRecord, FirstModule, 11086 FirstTemplate->getLocation(), 11087 FirstTemplate->getSourceRange(), 11088 FunctionTemplatePackParameter) 11089 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11090 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11091 SecondTemplate->getSourceRange(), 11092 FunctionTemplatePackParameter) 11093 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11094 ParameterMismatch = true; 11095 break; 11096 } 11097 } 11098 11099 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11100 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11101 NonTypeTemplateParmDecl *FirstNTTPD = 11102 cast<NonTypeTemplateParmDecl>(FirstParam); 11103 NonTypeTemplateParmDecl *SecondNTTPD = 11104 cast<NonTypeTemplateParmDecl>(SecondParam); 11105 11106 QualType FirstType = FirstNTTPD->getType(); 11107 QualType SecondType = SecondNTTPD->getType(); 11108 if (ComputeQualTypeODRHash(FirstType) != 11109 ComputeQualTypeODRHash(SecondType)) { 11110 ODRDiagDeclError(FirstRecord, FirstModule, 11111 FirstTemplate->getLocation(), 11112 FirstTemplate->getSourceRange(), 11113 FunctionTemplateParameterDifferentType) 11114 << FirstTemplate << (i + 1); 11115 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11116 SecondTemplate->getSourceRange(), 11117 FunctionTemplateParameterDifferentType) 11118 << SecondTemplate << (i + 1); 11119 ParameterMismatch = true; 11120 break; 11121 } 11122 11123 bool HasFirstDefaultArgument = 11124 FirstNTTPD->hasDefaultArgument() && 11125 !FirstNTTPD->defaultArgumentWasInherited(); 11126 bool HasSecondDefaultArgument = 11127 SecondNTTPD->hasDefaultArgument() && 11128 !SecondNTTPD->defaultArgumentWasInherited(); 11129 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11130 ODRDiagDeclError(FirstRecord, FirstModule, 11131 FirstTemplate->getLocation(), 11132 FirstTemplate->getSourceRange(), 11133 FunctionTemplateParameterSingleDefaultArgument) 11134 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11135 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11136 SecondTemplate->getSourceRange(), 11137 FunctionTemplateParameterSingleDefaultArgument) 11138 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11139 ParameterMismatch = true; 11140 break; 11141 } 11142 11143 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11144 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11145 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11146 if (ComputeODRHash(FirstDefaultArgument) != 11147 ComputeODRHash(SecondDefaultArgument)) { 11148 ODRDiagDeclError( 11149 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11150 FirstTemplate->getSourceRange(), 11151 FunctionTemplateParameterDifferentDefaultArgument) 11152 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11153 ODRDiagDeclNote( 11154 SecondModule, SecondTemplate->getLocation(), 11155 SecondTemplate->getSourceRange(), 11156 FunctionTemplateParameterDifferentDefaultArgument) 11157 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11158 ParameterMismatch = true; 11159 break; 11160 } 11161 } 11162 11163 if (FirstNTTPD->isParameterPack() != 11164 SecondNTTPD->isParameterPack()) { 11165 ODRDiagDeclError(FirstRecord, FirstModule, 11166 FirstTemplate->getLocation(), 11167 FirstTemplate->getSourceRange(), 11168 FunctionTemplatePackParameter) 11169 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11170 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11171 SecondTemplate->getSourceRange(), 11172 FunctionTemplatePackParameter) 11173 << SecondTemplate << (i + 1) 11174 << SecondNTTPD->isParameterPack(); 11175 ParameterMismatch = true; 11176 break; 11177 } 11178 } 11179 } 11180 11181 if (ParameterMismatch) { 11182 Diagnosed = true; 11183 break; 11184 } 11185 11186 break; 11187 } 11188 } 11189 11190 if (Diagnosed) 11191 continue; 11192 11193 Diag(FirstDecl->getLocation(), 11194 diag::err_module_odr_violation_mismatch_decl_unknown) 11195 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11196 << FirstDecl->getSourceRange(); 11197 Diag(SecondDecl->getLocation(), 11198 diag::note_module_odr_violation_mismatch_decl_unknown) 11199 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11200 Diagnosed = true; 11201 } 11202 11203 if (!Diagnosed) { 11204 // All definitions are updates to the same declaration. This happens if a 11205 // module instantiates the declaration of a class template specialization 11206 // and two or more other modules instantiate its definition. 11207 // 11208 // FIXME: Indicate which modules had instantiations of this definition. 11209 // FIXME: How can this even happen? 11210 Diag(Merge.first->getLocation(), 11211 diag::err_module_odr_violation_different_instantiations) 11212 << Merge.first; 11213 } 11214 } 11215 11216 // Issue ODR failures diagnostics for functions. 11217 for (auto &Merge : FunctionOdrMergeFailures) { 11218 enum ODRFunctionDifference { 11219 ReturnType, 11220 ParameterName, 11221 ParameterType, 11222 ParameterSingleDefaultArgument, 11223 ParameterDifferentDefaultArgument, 11224 FunctionBody, 11225 }; 11226 11227 FunctionDecl *FirstFunction = Merge.first; 11228 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11229 11230 bool Diagnosed = false; 11231 for (auto &SecondFunction : Merge.second) { 11232 11233 if (FirstFunction == SecondFunction) 11234 continue; 11235 11236 std::string SecondModule = 11237 getOwningModuleNameForDiagnostic(SecondFunction); 11238 11239 auto ODRDiagError = [FirstFunction, &FirstModule, 11240 this](SourceLocation Loc, SourceRange Range, 11241 ODRFunctionDifference DiffType) { 11242 return Diag(Loc, diag::err_module_odr_violation_function) 11243 << FirstFunction << FirstModule.empty() << FirstModule << Range 11244 << DiffType; 11245 }; 11246 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11247 SourceRange Range, 11248 ODRFunctionDifference DiffType) { 11249 return Diag(Loc, diag::note_module_odr_violation_function) 11250 << SecondModule << Range << DiffType; 11251 }; 11252 11253 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11254 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11255 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11256 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11257 << FirstFunction->getReturnType(); 11258 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11259 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11260 << SecondFunction->getReturnType(); 11261 Diagnosed = true; 11262 break; 11263 } 11264 11265 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11266 "Merged functions with different number of parameters"); 11267 11268 auto ParamSize = FirstFunction->param_size(); 11269 bool ParameterMismatch = false; 11270 for (unsigned I = 0; I < ParamSize; ++I) { 11271 auto *FirstParam = FirstFunction->getParamDecl(I); 11272 auto *SecondParam = SecondFunction->getParamDecl(I); 11273 11274 assert(getContext().hasSameType(FirstParam->getType(), 11275 SecondParam->getType()) && 11276 "Merged function has different parameter types."); 11277 11278 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11279 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11280 ParameterName) 11281 << I + 1 << FirstParam->getDeclName(); 11282 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11283 ParameterName) 11284 << I + 1 << SecondParam->getDeclName(); 11285 ParameterMismatch = true; 11286 break; 11287 }; 11288 11289 QualType FirstParamType = FirstParam->getType(); 11290 QualType SecondParamType = SecondParam->getType(); 11291 if (FirstParamType != SecondParamType && 11292 ComputeQualTypeODRHash(FirstParamType) != 11293 ComputeQualTypeODRHash(SecondParamType)) { 11294 if (const DecayedType *ParamDecayedType = 11295 FirstParamType->getAs<DecayedType>()) { 11296 ODRDiagError(FirstParam->getLocation(), 11297 FirstParam->getSourceRange(), ParameterType) 11298 << (I + 1) << FirstParamType << true 11299 << ParamDecayedType->getOriginalType(); 11300 } else { 11301 ODRDiagError(FirstParam->getLocation(), 11302 FirstParam->getSourceRange(), ParameterType) 11303 << (I + 1) << FirstParamType << false; 11304 } 11305 11306 if (const DecayedType *ParamDecayedType = 11307 SecondParamType->getAs<DecayedType>()) { 11308 ODRDiagNote(SecondParam->getLocation(), 11309 SecondParam->getSourceRange(), ParameterType) 11310 << (I + 1) << SecondParamType << true 11311 << ParamDecayedType->getOriginalType(); 11312 } else { 11313 ODRDiagNote(SecondParam->getLocation(), 11314 SecondParam->getSourceRange(), ParameterType) 11315 << (I + 1) << SecondParamType << false; 11316 } 11317 ParameterMismatch = true; 11318 break; 11319 } 11320 11321 const Expr *FirstInit = FirstParam->getInit(); 11322 const Expr *SecondInit = SecondParam->getInit(); 11323 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11324 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11325 ParameterSingleDefaultArgument) 11326 << (I + 1) << (FirstInit == nullptr) 11327 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11328 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11329 ParameterSingleDefaultArgument) 11330 << (I + 1) << (SecondInit == nullptr) 11331 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11332 ParameterMismatch = true; 11333 break; 11334 } 11335 11336 if (FirstInit && SecondInit && 11337 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11338 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11339 ParameterDifferentDefaultArgument) 11340 << (I + 1) << FirstInit->getSourceRange(); 11341 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11342 ParameterDifferentDefaultArgument) 11343 << (I + 1) << SecondInit->getSourceRange(); 11344 ParameterMismatch = true; 11345 break; 11346 } 11347 11348 assert(ComputeSubDeclODRHash(FirstParam) == 11349 ComputeSubDeclODRHash(SecondParam) && 11350 "Undiagnosed parameter difference."); 11351 } 11352 11353 if (ParameterMismatch) { 11354 Diagnosed = true; 11355 break; 11356 } 11357 11358 // If no error has been generated before now, assume the problem is in 11359 // the body and generate a message. 11360 ODRDiagError(FirstFunction->getLocation(), 11361 FirstFunction->getSourceRange(), FunctionBody); 11362 ODRDiagNote(SecondFunction->getLocation(), 11363 SecondFunction->getSourceRange(), FunctionBody); 11364 Diagnosed = true; 11365 break; 11366 } 11367 (void)Diagnosed; 11368 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11369 } 11370 11371 // Issue ODR failures diagnostics for enums. 11372 for (auto &Merge : EnumOdrMergeFailures) { 11373 enum ODREnumDifference { 11374 SingleScopedEnum, 11375 EnumTagKeywordMismatch, 11376 SingleSpecifiedType, 11377 DifferentSpecifiedTypes, 11378 DifferentNumberEnumConstants, 11379 EnumConstantName, 11380 EnumConstantSingleInitilizer, 11381 EnumConstantDifferentInitilizer, 11382 }; 11383 11384 // If we've already pointed out a specific problem with this enum, don't 11385 // bother issuing a general "something's different" diagnostic. 11386 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11387 continue; 11388 11389 EnumDecl *FirstEnum = Merge.first; 11390 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11391 11392 using DeclHashes = 11393 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11394 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11395 DeclHashes &Hashes, EnumDecl *Enum) { 11396 for (auto *D : Enum->decls()) { 11397 // Due to decl merging, the first EnumDecl is the parent of 11398 // Decls in both records. 11399 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum)) 11400 continue; 11401 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11402 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11403 ComputeSubDeclODRHash(D)); 11404 } 11405 }; 11406 DeclHashes FirstHashes; 11407 PopulateHashes(FirstHashes, FirstEnum); 11408 bool Diagnosed = false; 11409 for (auto &SecondEnum : Merge.second) { 11410 11411 if (FirstEnum == SecondEnum) 11412 continue; 11413 11414 std::string SecondModule = 11415 getOwningModuleNameForDiagnostic(SecondEnum); 11416 11417 auto ODRDiagError = [FirstEnum, &FirstModule, 11418 this](SourceLocation Loc, SourceRange Range, 11419 ODREnumDifference DiffType) { 11420 return Diag(Loc, diag::err_module_odr_violation_enum) 11421 << FirstEnum << FirstModule.empty() << FirstModule << Range 11422 << DiffType; 11423 }; 11424 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11425 SourceRange Range, 11426 ODREnumDifference DiffType) { 11427 return Diag(Loc, diag::note_module_odr_violation_enum) 11428 << SecondModule << Range << DiffType; 11429 }; 11430 11431 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11432 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11433 SingleScopedEnum) 11434 << FirstEnum->isScoped(); 11435 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11436 SingleScopedEnum) 11437 << SecondEnum->isScoped(); 11438 Diagnosed = true; 11439 continue; 11440 } 11441 11442 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11443 if (FirstEnum->isScopedUsingClassTag() != 11444 SecondEnum->isScopedUsingClassTag()) { 11445 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11446 EnumTagKeywordMismatch) 11447 << FirstEnum->isScopedUsingClassTag(); 11448 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11449 EnumTagKeywordMismatch) 11450 << SecondEnum->isScopedUsingClassTag(); 11451 Diagnosed = true; 11452 continue; 11453 } 11454 } 11455 11456 QualType FirstUnderlyingType = 11457 FirstEnum->getIntegerTypeSourceInfo() 11458 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11459 : QualType(); 11460 QualType SecondUnderlyingType = 11461 SecondEnum->getIntegerTypeSourceInfo() 11462 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11463 : QualType(); 11464 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11465 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11466 SingleSpecifiedType) 11467 << !FirstUnderlyingType.isNull(); 11468 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11469 SingleSpecifiedType) 11470 << !SecondUnderlyingType.isNull(); 11471 Diagnosed = true; 11472 continue; 11473 } 11474 11475 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11476 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11477 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11478 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11479 DifferentSpecifiedTypes) 11480 << FirstUnderlyingType; 11481 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11482 DifferentSpecifiedTypes) 11483 << SecondUnderlyingType; 11484 Diagnosed = true; 11485 continue; 11486 } 11487 } 11488 11489 DeclHashes SecondHashes; 11490 PopulateHashes(SecondHashes, SecondEnum); 11491 11492 if (FirstHashes.size() != SecondHashes.size()) { 11493 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11494 DifferentNumberEnumConstants) 11495 << (int)FirstHashes.size(); 11496 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11497 DifferentNumberEnumConstants) 11498 << (int)SecondHashes.size(); 11499 Diagnosed = true; 11500 continue; 11501 } 11502 11503 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11504 if (FirstHashes[I].second == SecondHashes[I].second) 11505 continue; 11506 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11507 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11508 11509 if (FirstEnumConstant->getDeclName() != 11510 SecondEnumConstant->getDeclName()) { 11511 11512 ODRDiagError(FirstEnumConstant->getLocation(), 11513 FirstEnumConstant->getSourceRange(), EnumConstantName) 11514 << I + 1 << FirstEnumConstant; 11515 ODRDiagNote(SecondEnumConstant->getLocation(), 11516 SecondEnumConstant->getSourceRange(), EnumConstantName) 11517 << I + 1 << SecondEnumConstant; 11518 Diagnosed = true; 11519 break; 11520 } 11521 11522 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11523 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11524 if (!FirstInit && !SecondInit) 11525 continue; 11526 11527 if (!FirstInit || !SecondInit) { 11528 ODRDiagError(FirstEnumConstant->getLocation(), 11529 FirstEnumConstant->getSourceRange(), 11530 EnumConstantSingleInitilizer) 11531 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11532 ODRDiagNote(SecondEnumConstant->getLocation(), 11533 SecondEnumConstant->getSourceRange(), 11534 EnumConstantSingleInitilizer) 11535 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11536 Diagnosed = true; 11537 break; 11538 } 11539 11540 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11541 ODRDiagError(FirstEnumConstant->getLocation(), 11542 FirstEnumConstant->getSourceRange(), 11543 EnumConstantDifferentInitilizer) 11544 << I + 1 << FirstEnumConstant; 11545 ODRDiagNote(SecondEnumConstant->getLocation(), 11546 SecondEnumConstant->getSourceRange(), 11547 EnumConstantDifferentInitilizer) 11548 << I + 1 << SecondEnumConstant; 11549 Diagnosed = true; 11550 break; 11551 } 11552 } 11553 } 11554 11555 (void)Diagnosed; 11556 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11557 } 11558 } 11559 11560 void ASTReader::StartedDeserializing() { 11561 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11562 ReadTimer->startTimer(); 11563 } 11564 11565 void ASTReader::FinishedDeserializing() { 11566 assert(NumCurrentElementsDeserializing && 11567 "FinishedDeserializing not paired with StartedDeserializing"); 11568 if (NumCurrentElementsDeserializing == 1) { 11569 // We decrease NumCurrentElementsDeserializing only after pending actions 11570 // are finished, to avoid recursively re-calling finishPendingActions(). 11571 finishPendingActions(); 11572 } 11573 --NumCurrentElementsDeserializing; 11574 11575 if (NumCurrentElementsDeserializing == 0) { 11576 // Propagate exception specification and deduced type updates along 11577 // redeclaration chains. 11578 // 11579 // We do this now rather than in finishPendingActions because we want to 11580 // be able to walk the complete redeclaration chains of the updated decls. 11581 while (!PendingExceptionSpecUpdates.empty() || 11582 !PendingDeducedTypeUpdates.empty()) { 11583 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11584 PendingExceptionSpecUpdates.clear(); 11585 for (auto Update : ESUpdates) { 11586 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11587 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11588 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11589 if (auto *Listener = getContext().getASTMutationListener()) 11590 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11591 for (auto *Redecl : Update.second->redecls()) 11592 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11593 } 11594 11595 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11596 PendingDeducedTypeUpdates.clear(); 11597 for (auto Update : DTUpdates) { 11598 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11599 // FIXME: If the return type is already deduced, check that it matches. 11600 getContext().adjustDeducedFunctionResultType(Update.first, 11601 Update.second); 11602 } 11603 } 11604 11605 if (ReadTimer) 11606 ReadTimer->stopTimer(); 11607 11608 diagnoseOdrViolations(); 11609 11610 // We are not in recursive loading, so it's safe to pass the "interesting" 11611 // decls to the consumer. 11612 if (Consumer) 11613 PassInterestingDeclsToConsumer(); 11614 } 11615 } 11616 11617 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11618 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11619 // Remove any fake results before adding any real ones. 11620 auto It = PendingFakeLookupResults.find(II); 11621 if (It != PendingFakeLookupResults.end()) { 11622 for (auto *ND : It->second) 11623 SemaObj->IdResolver.RemoveDecl(ND); 11624 // FIXME: this works around module+PCH performance issue. 11625 // Rather than erase the result from the map, which is O(n), just clear 11626 // the vector of NamedDecls. 11627 It->second.clear(); 11628 } 11629 } 11630 11631 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11632 SemaObj->TUScope->AddDecl(D); 11633 } else if (SemaObj->TUScope) { 11634 // Adding the decl to IdResolver may have failed because it was already in 11635 // (even though it was not added in scope). If it is already in, make sure 11636 // it gets in the scope as well. 11637 if (std::find(SemaObj->IdResolver.begin(Name), 11638 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11639 SemaObj->TUScope->AddDecl(D); 11640 } 11641 } 11642 11643 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11644 ASTContext *Context, 11645 const PCHContainerReader &PCHContainerRdr, 11646 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11647 StringRef isysroot, 11648 DisableValidationForModuleKind DisableValidationKind, 11649 bool AllowASTWithCompilerErrors, 11650 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11651 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11652 std::unique_ptr<llvm::Timer> ReadTimer) 11653 : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH) 11654 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11655 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11656 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11657 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11658 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11659 PCHContainerRdr, PP.getHeaderSearchInfo()), 11660 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11661 DisableValidationKind(DisableValidationKind), 11662 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11663 AllowConfigurationMismatch(AllowConfigurationMismatch), 11664 ValidateSystemInputs(ValidateSystemInputs), 11665 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11666 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11667 SourceMgr.setExternalSLocEntrySource(this); 11668 11669 for (const auto &Ext : Extensions) { 11670 auto BlockName = Ext->getExtensionMetadata().BlockName; 11671 auto Known = ModuleFileExtensions.find(BlockName); 11672 if (Known != ModuleFileExtensions.end()) { 11673 Diags.Report(diag::warn_duplicate_module_file_extension) 11674 << BlockName; 11675 continue; 11676 } 11677 11678 ModuleFileExtensions.insert({BlockName, Ext}); 11679 } 11680 } 11681 11682 ASTReader::~ASTReader() { 11683 if (OwnsDeserializationListener) 11684 delete DeserializationListener; 11685 } 11686 11687 IdentifierResolver &ASTReader::getIdResolver() { 11688 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11689 } 11690 11691 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11692 unsigned AbbrevID) { 11693 Idx = 0; 11694 Record.clear(); 11695 return Cursor.readRecord(AbbrevID, Record); 11696 } 11697 //===----------------------------------------------------------------------===// 11698 //// OMPClauseReader implementation 11699 ////===----------------------------------------------------------------------===// 11700 11701 // This has to be in namespace clang because it's friended by all 11702 // of the OMP clauses. 11703 namespace clang { 11704 11705 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11706 ASTRecordReader &Record; 11707 ASTContext &Context; 11708 11709 public: 11710 OMPClauseReader(ASTRecordReader &Record) 11711 : Record(Record), Context(Record.getContext()) {} 11712 #define GEN_CLANG_CLAUSE_CLASS 11713 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11714 #include "llvm/Frontend/OpenMP/OMP.inc" 11715 OMPClause *readClause(); 11716 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11717 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11718 }; 11719 11720 } // end namespace clang 11721 11722 OMPClause *ASTRecordReader::readOMPClause() { 11723 return OMPClauseReader(*this).readClause(); 11724 } 11725 11726 OMPClause *OMPClauseReader::readClause() { 11727 OMPClause *C = nullptr; 11728 switch (llvm::omp::Clause(Record.readInt())) { 11729 case llvm::omp::OMPC_if: 11730 C = new (Context) OMPIfClause(); 11731 break; 11732 case llvm::omp::OMPC_final: 11733 C = new (Context) OMPFinalClause(); 11734 break; 11735 case llvm::omp::OMPC_num_threads: 11736 C = new (Context) OMPNumThreadsClause(); 11737 break; 11738 case llvm::omp::OMPC_safelen: 11739 C = new (Context) OMPSafelenClause(); 11740 break; 11741 case llvm::omp::OMPC_simdlen: 11742 C = new (Context) OMPSimdlenClause(); 11743 break; 11744 case llvm::omp::OMPC_sizes: { 11745 unsigned NumSizes = Record.readInt(); 11746 C = OMPSizesClause::CreateEmpty(Context, NumSizes); 11747 break; 11748 } 11749 case llvm::omp::OMPC_allocator: 11750 C = new (Context) OMPAllocatorClause(); 11751 break; 11752 case llvm::omp::OMPC_collapse: 11753 C = new (Context) OMPCollapseClause(); 11754 break; 11755 case llvm::omp::OMPC_default: 11756 C = new (Context) OMPDefaultClause(); 11757 break; 11758 case llvm::omp::OMPC_proc_bind: 11759 C = new (Context) OMPProcBindClause(); 11760 break; 11761 case llvm::omp::OMPC_schedule: 11762 C = new (Context) OMPScheduleClause(); 11763 break; 11764 case llvm::omp::OMPC_ordered: 11765 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11766 break; 11767 case llvm::omp::OMPC_nowait: 11768 C = new (Context) OMPNowaitClause(); 11769 break; 11770 case llvm::omp::OMPC_untied: 11771 C = new (Context) OMPUntiedClause(); 11772 break; 11773 case llvm::omp::OMPC_mergeable: 11774 C = new (Context) OMPMergeableClause(); 11775 break; 11776 case llvm::omp::OMPC_read: 11777 C = new (Context) OMPReadClause(); 11778 break; 11779 case llvm::omp::OMPC_write: 11780 C = new (Context) OMPWriteClause(); 11781 break; 11782 case llvm::omp::OMPC_update: 11783 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11784 break; 11785 case llvm::omp::OMPC_capture: 11786 C = new (Context) OMPCaptureClause(); 11787 break; 11788 case llvm::omp::OMPC_seq_cst: 11789 C = new (Context) OMPSeqCstClause(); 11790 break; 11791 case llvm::omp::OMPC_acq_rel: 11792 C = new (Context) OMPAcqRelClause(); 11793 break; 11794 case llvm::omp::OMPC_acquire: 11795 C = new (Context) OMPAcquireClause(); 11796 break; 11797 case llvm::omp::OMPC_release: 11798 C = new (Context) OMPReleaseClause(); 11799 break; 11800 case llvm::omp::OMPC_relaxed: 11801 C = new (Context) OMPRelaxedClause(); 11802 break; 11803 case llvm::omp::OMPC_threads: 11804 C = new (Context) OMPThreadsClause(); 11805 break; 11806 case llvm::omp::OMPC_simd: 11807 C = new (Context) OMPSIMDClause(); 11808 break; 11809 case llvm::omp::OMPC_nogroup: 11810 C = new (Context) OMPNogroupClause(); 11811 break; 11812 case llvm::omp::OMPC_unified_address: 11813 C = new (Context) OMPUnifiedAddressClause(); 11814 break; 11815 case llvm::omp::OMPC_unified_shared_memory: 11816 C = new (Context) OMPUnifiedSharedMemoryClause(); 11817 break; 11818 case llvm::omp::OMPC_reverse_offload: 11819 C = new (Context) OMPReverseOffloadClause(); 11820 break; 11821 case llvm::omp::OMPC_dynamic_allocators: 11822 C = new (Context) OMPDynamicAllocatorsClause(); 11823 break; 11824 case llvm::omp::OMPC_atomic_default_mem_order: 11825 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11826 break; 11827 case llvm::omp::OMPC_private: 11828 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11829 break; 11830 case llvm::omp::OMPC_firstprivate: 11831 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11832 break; 11833 case llvm::omp::OMPC_lastprivate: 11834 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11835 break; 11836 case llvm::omp::OMPC_shared: 11837 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11838 break; 11839 case llvm::omp::OMPC_reduction: { 11840 unsigned N = Record.readInt(); 11841 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11842 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11843 break; 11844 } 11845 case llvm::omp::OMPC_task_reduction: 11846 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11847 break; 11848 case llvm::omp::OMPC_in_reduction: 11849 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11850 break; 11851 case llvm::omp::OMPC_linear: 11852 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11853 break; 11854 case llvm::omp::OMPC_aligned: 11855 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11856 break; 11857 case llvm::omp::OMPC_copyin: 11858 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11859 break; 11860 case llvm::omp::OMPC_copyprivate: 11861 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11862 break; 11863 case llvm::omp::OMPC_flush: 11864 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11865 break; 11866 case llvm::omp::OMPC_depobj: 11867 C = OMPDepobjClause::CreateEmpty(Context); 11868 break; 11869 case llvm::omp::OMPC_depend: { 11870 unsigned NumVars = Record.readInt(); 11871 unsigned NumLoops = Record.readInt(); 11872 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11873 break; 11874 } 11875 case llvm::omp::OMPC_device: 11876 C = new (Context) OMPDeviceClause(); 11877 break; 11878 case llvm::omp::OMPC_map: { 11879 OMPMappableExprListSizeTy Sizes; 11880 Sizes.NumVars = Record.readInt(); 11881 Sizes.NumUniqueDeclarations = Record.readInt(); 11882 Sizes.NumComponentLists = Record.readInt(); 11883 Sizes.NumComponents = Record.readInt(); 11884 C = OMPMapClause::CreateEmpty(Context, Sizes); 11885 break; 11886 } 11887 case llvm::omp::OMPC_num_teams: 11888 C = new (Context) OMPNumTeamsClause(); 11889 break; 11890 case llvm::omp::OMPC_thread_limit: 11891 C = new (Context) OMPThreadLimitClause(); 11892 break; 11893 case llvm::omp::OMPC_priority: 11894 C = new (Context) OMPPriorityClause(); 11895 break; 11896 case llvm::omp::OMPC_grainsize: 11897 C = new (Context) OMPGrainsizeClause(); 11898 break; 11899 case llvm::omp::OMPC_num_tasks: 11900 C = new (Context) OMPNumTasksClause(); 11901 break; 11902 case llvm::omp::OMPC_hint: 11903 C = new (Context) OMPHintClause(); 11904 break; 11905 case llvm::omp::OMPC_dist_schedule: 11906 C = new (Context) OMPDistScheduleClause(); 11907 break; 11908 case llvm::omp::OMPC_defaultmap: 11909 C = new (Context) OMPDefaultmapClause(); 11910 break; 11911 case llvm::omp::OMPC_to: { 11912 OMPMappableExprListSizeTy Sizes; 11913 Sizes.NumVars = Record.readInt(); 11914 Sizes.NumUniqueDeclarations = Record.readInt(); 11915 Sizes.NumComponentLists = Record.readInt(); 11916 Sizes.NumComponents = Record.readInt(); 11917 C = OMPToClause::CreateEmpty(Context, Sizes); 11918 break; 11919 } 11920 case llvm::omp::OMPC_from: { 11921 OMPMappableExprListSizeTy Sizes; 11922 Sizes.NumVars = Record.readInt(); 11923 Sizes.NumUniqueDeclarations = Record.readInt(); 11924 Sizes.NumComponentLists = Record.readInt(); 11925 Sizes.NumComponents = Record.readInt(); 11926 C = OMPFromClause::CreateEmpty(Context, Sizes); 11927 break; 11928 } 11929 case llvm::omp::OMPC_use_device_ptr: { 11930 OMPMappableExprListSizeTy Sizes; 11931 Sizes.NumVars = Record.readInt(); 11932 Sizes.NumUniqueDeclarations = Record.readInt(); 11933 Sizes.NumComponentLists = Record.readInt(); 11934 Sizes.NumComponents = Record.readInt(); 11935 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11936 break; 11937 } 11938 case llvm::omp::OMPC_use_device_addr: { 11939 OMPMappableExprListSizeTy Sizes; 11940 Sizes.NumVars = Record.readInt(); 11941 Sizes.NumUniqueDeclarations = Record.readInt(); 11942 Sizes.NumComponentLists = Record.readInt(); 11943 Sizes.NumComponents = Record.readInt(); 11944 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11945 break; 11946 } 11947 case llvm::omp::OMPC_is_device_ptr: { 11948 OMPMappableExprListSizeTy Sizes; 11949 Sizes.NumVars = Record.readInt(); 11950 Sizes.NumUniqueDeclarations = Record.readInt(); 11951 Sizes.NumComponentLists = Record.readInt(); 11952 Sizes.NumComponents = Record.readInt(); 11953 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11954 break; 11955 } 11956 case llvm::omp::OMPC_allocate: 11957 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11958 break; 11959 case llvm::omp::OMPC_nontemporal: 11960 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11961 break; 11962 case llvm::omp::OMPC_inclusive: 11963 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11964 break; 11965 case llvm::omp::OMPC_exclusive: 11966 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11967 break; 11968 case llvm::omp::OMPC_order: 11969 C = new (Context) OMPOrderClause(); 11970 break; 11971 case llvm::omp::OMPC_destroy: 11972 C = new (Context) OMPDestroyClause(); 11973 break; 11974 case llvm::omp::OMPC_detach: 11975 C = new (Context) OMPDetachClause(); 11976 break; 11977 case llvm::omp::OMPC_uses_allocators: 11978 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11979 break; 11980 case llvm::omp::OMPC_affinity: 11981 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 11982 break; 11983 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 11984 case llvm::omp::Enum: \ 11985 break; 11986 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11987 default: 11988 break; 11989 } 11990 assert(C && "Unknown OMPClause type"); 11991 11992 Visit(C); 11993 C->setLocStart(Record.readSourceLocation()); 11994 C->setLocEnd(Record.readSourceLocation()); 11995 11996 return C; 11997 } 11998 11999 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 12000 C->setPreInitStmt(Record.readSubStmt(), 12001 static_cast<OpenMPDirectiveKind>(Record.readInt())); 12002 } 12003 12004 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 12005 VisitOMPClauseWithPreInit(C); 12006 C->setPostUpdateExpr(Record.readSubExpr()); 12007 } 12008 12009 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 12010 VisitOMPClauseWithPreInit(C); 12011 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 12012 C->setNameModifierLoc(Record.readSourceLocation()); 12013 C->setColonLoc(Record.readSourceLocation()); 12014 C->setCondition(Record.readSubExpr()); 12015 C->setLParenLoc(Record.readSourceLocation()); 12016 } 12017 12018 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12019 VisitOMPClauseWithPreInit(C); 12020 C->setCondition(Record.readSubExpr()); 12021 C->setLParenLoc(Record.readSourceLocation()); 12022 } 12023 12024 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12025 VisitOMPClauseWithPreInit(C); 12026 C->setNumThreads(Record.readSubExpr()); 12027 C->setLParenLoc(Record.readSourceLocation()); 12028 } 12029 12030 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12031 C->setSafelen(Record.readSubExpr()); 12032 C->setLParenLoc(Record.readSourceLocation()); 12033 } 12034 12035 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12036 C->setSimdlen(Record.readSubExpr()); 12037 C->setLParenLoc(Record.readSourceLocation()); 12038 } 12039 12040 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) { 12041 for (Expr *&E : C->getSizesRefs()) 12042 E = Record.readSubExpr(); 12043 C->setLParenLoc(Record.readSourceLocation()); 12044 } 12045 12046 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12047 C->setAllocator(Record.readExpr()); 12048 C->setLParenLoc(Record.readSourceLocation()); 12049 } 12050 12051 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12052 C->setNumForLoops(Record.readSubExpr()); 12053 C->setLParenLoc(Record.readSourceLocation()); 12054 } 12055 12056 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12057 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12058 C->setLParenLoc(Record.readSourceLocation()); 12059 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12060 } 12061 12062 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12063 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12064 C->setLParenLoc(Record.readSourceLocation()); 12065 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12066 } 12067 12068 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12069 VisitOMPClauseWithPreInit(C); 12070 C->setScheduleKind( 12071 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12072 C->setFirstScheduleModifier( 12073 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12074 C->setSecondScheduleModifier( 12075 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12076 C->setChunkSize(Record.readSubExpr()); 12077 C->setLParenLoc(Record.readSourceLocation()); 12078 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12079 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12080 C->setScheduleKindLoc(Record.readSourceLocation()); 12081 C->setCommaLoc(Record.readSourceLocation()); 12082 } 12083 12084 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12085 C->setNumForLoops(Record.readSubExpr()); 12086 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12087 C->setLoopNumIterations(I, Record.readSubExpr()); 12088 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12089 C->setLoopCounter(I, Record.readSubExpr()); 12090 C->setLParenLoc(Record.readSourceLocation()); 12091 } 12092 12093 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12094 C->setEventHandler(Record.readSubExpr()); 12095 C->setLParenLoc(Record.readSourceLocation()); 12096 } 12097 12098 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12099 12100 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12101 12102 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12103 12104 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12105 12106 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12107 12108 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12109 if (C->isExtended()) { 12110 C->setLParenLoc(Record.readSourceLocation()); 12111 C->setArgumentLoc(Record.readSourceLocation()); 12112 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12113 } 12114 } 12115 12116 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12117 12118 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12119 12120 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12121 12122 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12123 12124 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12125 12126 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12127 12128 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12129 12130 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12131 12132 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12133 12134 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *) {} 12135 12136 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12137 12138 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12139 OMPUnifiedSharedMemoryClause *) {} 12140 12141 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12142 12143 void 12144 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12145 } 12146 12147 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12148 OMPAtomicDefaultMemOrderClause *C) { 12149 C->setAtomicDefaultMemOrderKind( 12150 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12151 C->setLParenLoc(Record.readSourceLocation()); 12152 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12153 } 12154 12155 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12156 C->setLParenLoc(Record.readSourceLocation()); 12157 unsigned NumVars = C->varlist_size(); 12158 SmallVector<Expr *, 16> Vars; 12159 Vars.reserve(NumVars); 12160 for (unsigned i = 0; i != NumVars; ++i) 12161 Vars.push_back(Record.readSubExpr()); 12162 C->setVarRefs(Vars); 12163 Vars.clear(); 12164 for (unsigned i = 0; i != NumVars; ++i) 12165 Vars.push_back(Record.readSubExpr()); 12166 C->setPrivateCopies(Vars); 12167 } 12168 12169 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12170 VisitOMPClauseWithPreInit(C); 12171 C->setLParenLoc(Record.readSourceLocation()); 12172 unsigned NumVars = C->varlist_size(); 12173 SmallVector<Expr *, 16> Vars; 12174 Vars.reserve(NumVars); 12175 for (unsigned i = 0; i != NumVars; ++i) 12176 Vars.push_back(Record.readSubExpr()); 12177 C->setVarRefs(Vars); 12178 Vars.clear(); 12179 for (unsigned i = 0; i != NumVars; ++i) 12180 Vars.push_back(Record.readSubExpr()); 12181 C->setPrivateCopies(Vars); 12182 Vars.clear(); 12183 for (unsigned i = 0; i != NumVars; ++i) 12184 Vars.push_back(Record.readSubExpr()); 12185 C->setInits(Vars); 12186 } 12187 12188 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12189 VisitOMPClauseWithPostUpdate(C); 12190 C->setLParenLoc(Record.readSourceLocation()); 12191 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12192 C->setKindLoc(Record.readSourceLocation()); 12193 C->setColonLoc(Record.readSourceLocation()); 12194 unsigned NumVars = C->varlist_size(); 12195 SmallVector<Expr *, 16> Vars; 12196 Vars.reserve(NumVars); 12197 for (unsigned i = 0; i != NumVars; ++i) 12198 Vars.push_back(Record.readSubExpr()); 12199 C->setVarRefs(Vars); 12200 Vars.clear(); 12201 for (unsigned i = 0; i != NumVars; ++i) 12202 Vars.push_back(Record.readSubExpr()); 12203 C->setPrivateCopies(Vars); 12204 Vars.clear(); 12205 for (unsigned i = 0; i != NumVars; ++i) 12206 Vars.push_back(Record.readSubExpr()); 12207 C->setSourceExprs(Vars); 12208 Vars.clear(); 12209 for (unsigned i = 0; i != NumVars; ++i) 12210 Vars.push_back(Record.readSubExpr()); 12211 C->setDestinationExprs(Vars); 12212 Vars.clear(); 12213 for (unsigned i = 0; i != NumVars; ++i) 12214 Vars.push_back(Record.readSubExpr()); 12215 C->setAssignmentOps(Vars); 12216 } 12217 12218 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12219 C->setLParenLoc(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 } 12227 12228 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12229 VisitOMPClauseWithPostUpdate(C); 12230 C->setLParenLoc(Record.readSourceLocation()); 12231 C->setModifierLoc(Record.readSourceLocation()); 12232 C->setColonLoc(Record.readSourceLocation()); 12233 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12234 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12235 C->setQualifierLoc(NNSL); 12236 C->setNameInfo(DNI); 12237 12238 unsigned NumVars = C->varlist_size(); 12239 SmallVector<Expr *, 16> Vars; 12240 Vars.reserve(NumVars); 12241 for (unsigned i = 0; i != NumVars; ++i) 12242 Vars.push_back(Record.readSubExpr()); 12243 C->setVarRefs(Vars); 12244 Vars.clear(); 12245 for (unsigned i = 0; i != NumVars; ++i) 12246 Vars.push_back(Record.readSubExpr()); 12247 C->setPrivates(Vars); 12248 Vars.clear(); 12249 for (unsigned i = 0; i != NumVars; ++i) 12250 Vars.push_back(Record.readSubExpr()); 12251 C->setLHSExprs(Vars); 12252 Vars.clear(); 12253 for (unsigned i = 0; i != NumVars; ++i) 12254 Vars.push_back(Record.readSubExpr()); 12255 C->setRHSExprs(Vars); 12256 Vars.clear(); 12257 for (unsigned i = 0; i != NumVars; ++i) 12258 Vars.push_back(Record.readSubExpr()); 12259 C->setReductionOps(Vars); 12260 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12261 Vars.clear(); 12262 for (unsigned i = 0; i != NumVars; ++i) 12263 Vars.push_back(Record.readSubExpr()); 12264 C->setInscanCopyOps(Vars); 12265 Vars.clear(); 12266 for (unsigned i = 0; i != NumVars; ++i) 12267 Vars.push_back(Record.readSubExpr()); 12268 C->setInscanCopyArrayTemps(Vars); 12269 Vars.clear(); 12270 for (unsigned i = 0; i != NumVars; ++i) 12271 Vars.push_back(Record.readSubExpr()); 12272 C->setInscanCopyArrayElems(Vars); 12273 } 12274 } 12275 12276 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12277 VisitOMPClauseWithPostUpdate(C); 12278 C->setLParenLoc(Record.readSourceLocation()); 12279 C->setColonLoc(Record.readSourceLocation()); 12280 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12281 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12282 C->setQualifierLoc(NNSL); 12283 C->setNameInfo(DNI); 12284 12285 unsigned NumVars = C->varlist_size(); 12286 SmallVector<Expr *, 16> Vars; 12287 Vars.reserve(NumVars); 12288 for (unsigned I = 0; I != NumVars; ++I) 12289 Vars.push_back(Record.readSubExpr()); 12290 C->setVarRefs(Vars); 12291 Vars.clear(); 12292 for (unsigned I = 0; I != NumVars; ++I) 12293 Vars.push_back(Record.readSubExpr()); 12294 C->setPrivates(Vars); 12295 Vars.clear(); 12296 for (unsigned I = 0; I != NumVars; ++I) 12297 Vars.push_back(Record.readSubExpr()); 12298 C->setLHSExprs(Vars); 12299 Vars.clear(); 12300 for (unsigned I = 0; I != NumVars; ++I) 12301 Vars.push_back(Record.readSubExpr()); 12302 C->setRHSExprs(Vars); 12303 Vars.clear(); 12304 for (unsigned I = 0; I != NumVars; ++I) 12305 Vars.push_back(Record.readSubExpr()); 12306 C->setReductionOps(Vars); 12307 } 12308 12309 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12310 VisitOMPClauseWithPostUpdate(C); 12311 C->setLParenLoc(Record.readSourceLocation()); 12312 C->setColonLoc(Record.readSourceLocation()); 12313 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12314 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12315 C->setQualifierLoc(NNSL); 12316 C->setNameInfo(DNI); 12317 12318 unsigned NumVars = C->varlist_size(); 12319 SmallVector<Expr *, 16> Vars; 12320 Vars.reserve(NumVars); 12321 for (unsigned I = 0; I != NumVars; ++I) 12322 Vars.push_back(Record.readSubExpr()); 12323 C->setVarRefs(Vars); 12324 Vars.clear(); 12325 for (unsigned I = 0; I != NumVars; ++I) 12326 Vars.push_back(Record.readSubExpr()); 12327 C->setPrivates(Vars); 12328 Vars.clear(); 12329 for (unsigned I = 0; I != NumVars; ++I) 12330 Vars.push_back(Record.readSubExpr()); 12331 C->setLHSExprs(Vars); 12332 Vars.clear(); 12333 for (unsigned I = 0; I != NumVars; ++I) 12334 Vars.push_back(Record.readSubExpr()); 12335 C->setRHSExprs(Vars); 12336 Vars.clear(); 12337 for (unsigned I = 0; I != NumVars; ++I) 12338 Vars.push_back(Record.readSubExpr()); 12339 C->setReductionOps(Vars); 12340 Vars.clear(); 12341 for (unsigned I = 0; I != NumVars; ++I) 12342 Vars.push_back(Record.readSubExpr()); 12343 C->setTaskgroupDescriptors(Vars); 12344 } 12345 12346 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12347 VisitOMPClauseWithPostUpdate(C); 12348 C->setLParenLoc(Record.readSourceLocation()); 12349 C->setColonLoc(Record.readSourceLocation()); 12350 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12351 C->setModifierLoc(Record.readSourceLocation()); 12352 unsigned NumVars = C->varlist_size(); 12353 SmallVector<Expr *, 16> Vars; 12354 Vars.reserve(NumVars); 12355 for (unsigned i = 0; i != NumVars; ++i) 12356 Vars.push_back(Record.readSubExpr()); 12357 C->setVarRefs(Vars); 12358 Vars.clear(); 12359 for (unsigned i = 0; i != NumVars; ++i) 12360 Vars.push_back(Record.readSubExpr()); 12361 C->setPrivates(Vars); 12362 Vars.clear(); 12363 for (unsigned i = 0; i != NumVars; ++i) 12364 Vars.push_back(Record.readSubExpr()); 12365 C->setInits(Vars); 12366 Vars.clear(); 12367 for (unsigned i = 0; i != NumVars; ++i) 12368 Vars.push_back(Record.readSubExpr()); 12369 C->setUpdates(Vars); 12370 Vars.clear(); 12371 for (unsigned i = 0; i != NumVars; ++i) 12372 Vars.push_back(Record.readSubExpr()); 12373 C->setFinals(Vars); 12374 C->setStep(Record.readSubExpr()); 12375 C->setCalcStep(Record.readSubExpr()); 12376 Vars.clear(); 12377 for (unsigned I = 0; I != NumVars + 1; ++I) 12378 Vars.push_back(Record.readSubExpr()); 12379 C->setUsedExprs(Vars); 12380 } 12381 12382 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12383 C->setLParenLoc(Record.readSourceLocation()); 12384 C->setColonLoc(Record.readSourceLocation()); 12385 unsigned NumVars = C->varlist_size(); 12386 SmallVector<Expr *, 16> Vars; 12387 Vars.reserve(NumVars); 12388 for (unsigned i = 0; i != NumVars; ++i) 12389 Vars.push_back(Record.readSubExpr()); 12390 C->setVarRefs(Vars); 12391 C->setAlignment(Record.readSubExpr()); 12392 } 12393 12394 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12395 C->setLParenLoc(Record.readSourceLocation()); 12396 unsigned NumVars = C->varlist_size(); 12397 SmallVector<Expr *, 16> Exprs; 12398 Exprs.reserve(NumVars); 12399 for (unsigned i = 0; i != NumVars; ++i) 12400 Exprs.push_back(Record.readSubExpr()); 12401 C->setVarRefs(Exprs); 12402 Exprs.clear(); 12403 for (unsigned i = 0; i != NumVars; ++i) 12404 Exprs.push_back(Record.readSubExpr()); 12405 C->setSourceExprs(Exprs); 12406 Exprs.clear(); 12407 for (unsigned i = 0; i != NumVars; ++i) 12408 Exprs.push_back(Record.readSubExpr()); 12409 C->setDestinationExprs(Exprs); 12410 Exprs.clear(); 12411 for (unsigned i = 0; i != NumVars; ++i) 12412 Exprs.push_back(Record.readSubExpr()); 12413 C->setAssignmentOps(Exprs); 12414 } 12415 12416 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12417 C->setLParenLoc(Record.readSourceLocation()); 12418 unsigned NumVars = C->varlist_size(); 12419 SmallVector<Expr *, 16> Exprs; 12420 Exprs.reserve(NumVars); 12421 for (unsigned i = 0; i != NumVars; ++i) 12422 Exprs.push_back(Record.readSubExpr()); 12423 C->setVarRefs(Exprs); 12424 Exprs.clear(); 12425 for (unsigned i = 0; i != NumVars; ++i) 12426 Exprs.push_back(Record.readSubExpr()); 12427 C->setSourceExprs(Exprs); 12428 Exprs.clear(); 12429 for (unsigned i = 0; i != NumVars; ++i) 12430 Exprs.push_back(Record.readSubExpr()); 12431 C->setDestinationExprs(Exprs); 12432 Exprs.clear(); 12433 for (unsigned i = 0; i != NumVars; ++i) 12434 Exprs.push_back(Record.readSubExpr()); 12435 C->setAssignmentOps(Exprs); 12436 } 12437 12438 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12439 C->setLParenLoc(Record.readSourceLocation()); 12440 unsigned NumVars = C->varlist_size(); 12441 SmallVector<Expr *, 16> Vars; 12442 Vars.reserve(NumVars); 12443 for (unsigned i = 0; i != NumVars; ++i) 12444 Vars.push_back(Record.readSubExpr()); 12445 C->setVarRefs(Vars); 12446 } 12447 12448 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12449 C->setDepobj(Record.readSubExpr()); 12450 C->setLParenLoc(Record.readSourceLocation()); 12451 } 12452 12453 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12454 C->setLParenLoc(Record.readSourceLocation()); 12455 C->setModifier(Record.readSubExpr()); 12456 C->setDependencyKind( 12457 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12458 C->setDependencyLoc(Record.readSourceLocation()); 12459 C->setColonLoc(Record.readSourceLocation()); 12460 unsigned NumVars = C->varlist_size(); 12461 SmallVector<Expr *, 16> Vars; 12462 Vars.reserve(NumVars); 12463 for (unsigned I = 0; I != NumVars; ++I) 12464 Vars.push_back(Record.readSubExpr()); 12465 C->setVarRefs(Vars); 12466 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12467 C->setLoopData(I, Record.readSubExpr()); 12468 } 12469 12470 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12471 VisitOMPClauseWithPreInit(C); 12472 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12473 C->setDevice(Record.readSubExpr()); 12474 C->setModifierLoc(Record.readSourceLocation()); 12475 C->setLParenLoc(Record.readSourceLocation()); 12476 } 12477 12478 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12479 C->setLParenLoc(Record.readSourceLocation()); 12480 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12481 C->setMapTypeModifier( 12482 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12483 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12484 } 12485 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12486 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12487 C->setMapType( 12488 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12489 C->setMapLoc(Record.readSourceLocation()); 12490 C->setColonLoc(Record.readSourceLocation()); 12491 auto NumVars = C->varlist_size(); 12492 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12493 auto TotalLists = C->getTotalComponentListNum(); 12494 auto TotalComponents = C->getTotalComponentsNum(); 12495 12496 SmallVector<Expr *, 16> Vars; 12497 Vars.reserve(NumVars); 12498 for (unsigned i = 0; i != NumVars; ++i) 12499 Vars.push_back(Record.readExpr()); 12500 C->setVarRefs(Vars); 12501 12502 SmallVector<Expr *, 16> UDMappers; 12503 UDMappers.reserve(NumVars); 12504 for (unsigned I = 0; I < NumVars; ++I) 12505 UDMappers.push_back(Record.readExpr()); 12506 C->setUDMapperRefs(UDMappers); 12507 12508 SmallVector<ValueDecl *, 16> Decls; 12509 Decls.reserve(UniqueDecls); 12510 for (unsigned i = 0; i < UniqueDecls; ++i) 12511 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12512 C->setUniqueDecls(Decls); 12513 12514 SmallVector<unsigned, 16> ListsPerDecl; 12515 ListsPerDecl.reserve(UniqueDecls); 12516 for (unsigned i = 0; i < UniqueDecls; ++i) 12517 ListsPerDecl.push_back(Record.readInt()); 12518 C->setDeclNumLists(ListsPerDecl); 12519 12520 SmallVector<unsigned, 32> ListSizes; 12521 ListSizes.reserve(TotalLists); 12522 for (unsigned i = 0; i < TotalLists; ++i) 12523 ListSizes.push_back(Record.readInt()); 12524 C->setComponentListSizes(ListSizes); 12525 12526 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12527 Components.reserve(TotalComponents); 12528 for (unsigned i = 0; i < TotalComponents; ++i) { 12529 Expr *AssociatedExprPr = Record.readExpr(); 12530 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12531 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12532 /*IsNonContiguous=*/false); 12533 } 12534 C->setComponents(Components, ListSizes); 12535 } 12536 12537 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12538 C->setLParenLoc(Record.readSourceLocation()); 12539 C->setColonLoc(Record.readSourceLocation()); 12540 C->setAllocator(Record.readSubExpr()); 12541 unsigned NumVars = C->varlist_size(); 12542 SmallVector<Expr *, 16> Vars; 12543 Vars.reserve(NumVars); 12544 for (unsigned i = 0; i != NumVars; ++i) 12545 Vars.push_back(Record.readSubExpr()); 12546 C->setVarRefs(Vars); 12547 } 12548 12549 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12550 VisitOMPClauseWithPreInit(C); 12551 C->setNumTeams(Record.readSubExpr()); 12552 C->setLParenLoc(Record.readSourceLocation()); 12553 } 12554 12555 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12556 VisitOMPClauseWithPreInit(C); 12557 C->setThreadLimit(Record.readSubExpr()); 12558 C->setLParenLoc(Record.readSourceLocation()); 12559 } 12560 12561 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12562 VisitOMPClauseWithPreInit(C); 12563 C->setPriority(Record.readSubExpr()); 12564 C->setLParenLoc(Record.readSourceLocation()); 12565 } 12566 12567 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12568 VisitOMPClauseWithPreInit(C); 12569 C->setGrainsize(Record.readSubExpr()); 12570 C->setLParenLoc(Record.readSourceLocation()); 12571 } 12572 12573 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12574 VisitOMPClauseWithPreInit(C); 12575 C->setNumTasks(Record.readSubExpr()); 12576 C->setLParenLoc(Record.readSourceLocation()); 12577 } 12578 12579 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12580 C->setHint(Record.readSubExpr()); 12581 C->setLParenLoc(Record.readSourceLocation()); 12582 } 12583 12584 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12585 VisitOMPClauseWithPreInit(C); 12586 C->setDistScheduleKind( 12587 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12588 C->setChunkSize(Record.readSubExpr()); 12589 C->setLParenLoc(Record.readSourceLocation()); 12590 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12591 C->setCommaLoc(Record.readSourceLocation()); 12592 } 12593 12594 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12595 C->setDefaultmapKind( 12596 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12597 C->setDefaultmapModifier( 12598 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12599 C->setLParenLoc(Record.readSourceLocation()); 12600 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12601 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12602 } 12603 12604 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12605 C->setLParenLoc(Record.readSourceLocation()); 12606 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12607 C->setMotionModifier( 12608 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12609 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12610 } 12611 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12612 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12613 C->setColonLoc(Record.readSourceLocation()); 12614 auto NumVars = C->varlist_size(); 12615 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12616 auto TotalLists = C->getTotalComponentListNum(); 12617 auto TotalComponents = C->getTotalComponentsNum(); 12618 12619 SmallVector<Expr *, 16> Vars; 12620 Vars.reserve(NumVars); 12621 for (unsigned i = 0; i != NumVars; ++i) 12622 Vars.push_back(Record.readSubExpr()); 12623 C->setVarRefs(Vars); 12624 12625 SmallVector<Expr *, 16> UDMappers; 12626 UDMappers.reserve(NumVars); 12627 for (unsigned I = 0; I < NumVars; ++I) 12628 UDMappers.push_back(Record.readSubExpr()); 12629 C->setUDMapperRefs(UDMappers); 12630 12631 SmallVector<ValueDecl *, 16> Decls; 12632 Decls.reserve(UniqueDecls); 12633 for (unsigned i = 0; i < UniqueDecls; ++i) 12634 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12635 C->setUniqueDecls(Decls); 12636 12637 SmallVector<unsigned, 16> ListsPerDecl; 12638 ListsPerDecl.reserve(UniqueDecls); 12639 for (unsigned i = 0; i < UniqueDecls; ++i) 12640 ListsPerDecl.push_back(Record.readInt()); 12641 C->setDeclNumLists(ListsPerDecl); 12642 12643 SmallVector<unsigned, 32> ListSizes; 12644 ListSizes.reserve(TotalLists); 12645 for (unsigned i = 0; i < TotalLists; ++i) 12646 ListSizes.push_back(Record.readInt()); 12647 C->setComponentListSizes(ListSizes); 12648 12649 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12650 Components.reserve(TotalComponents); 12651 for (unsigned i = 0; i < TotalComponents; ++i) { 12652 Expr *AssociatedExprPr = Record.readSubExpr(); 12653 bool IsNonContiguous = Record.readBool(); 12654 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12655 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12656 } 12657 C->setComponents(Components, ListSizes); 12658 } 12659 12660 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12661 C->setLParenLoc(Record.readSourceLocation()); 12662 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12663 C->setMotionModifier( 12664 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12665 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12666 } 12667 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12668 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12669 C->setColonLoc(Record.readSourceLocation()); 12670 auto NumVars = C->varlist_size(); 12671 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12672 auto TotalLists = C->getTotalComponentListNum(); 12673 auto TotalComponents = C->getTotalComponentsNum(); 12674 12675 SmallVector<Expr *, 16> Vars; 12676 Vars.reserve(NumVars); 12677 for (unsigned i = 0; i != NumVars; ++i) 12678 Vars.push_back(Record.readSubExpr()); 12679 C->setVarRefs(Vars); 12680 12681 SmallVector<Expr *, 16> UDMappers; 12682 UDMappers.reserve(NumVars); 12683 for (unsigned I = 0; I < NumVars; ++I) 12684 UDMappers.push_back(Record.readSubExpr()); 12685 C->setUDMapperRefs(UDMappers); 12686 12687 SmallVector<ValueDecl *, 16> Decls; 12688 Decls.reserve(UniqueDecls); 12689 for (unsigned i = 0; i < UniqueDecls; ++i) 12690 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12691 C->setUniqueDecls(Decls); 12692 12693 SmallVector<unsigned, 16> ListsPerDecl; 12694 ListsPerDecl.reserve(UniqueDecls); 12695 for (unsigned i = 0; i < UniqueDecls; ++i) 12696 ListsPerDecl.push_back(Record.readInt()); 12697 C->setDeclNumLists(ListsPerDecl); 12698 12699 SmallVector<unsigned, 32> ListSizes; 12700 ListSizes.reserve(TotalLists); 12701 for (unsigned i = 0; i < TotalLists; ++i) 12702 ListSizes.push_back(Record.readInt()); 12703 C->setComponentListSizes(ListSizes); 12704 12705 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12706 Components.reserve(TotalComponents); 12707 for (unsigned i = 0; i < TotalComponents; ++i) { 12708 Expr *AssociatedExprPr = Record.readSubExpr(); 12709 bool IsNonContiguous = Record.readBool(); 12710 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12711 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12712 } 12713 C->setComponents(Components, ListSizes); 12714 } 12715 12716 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12717 C->setLParenLoc(Record.readSourceLocation()); 12718 auto NumVars = C->varlist_size(); 12719 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12720 auto TotalLists = C->getTotalComponentListNum(); 12721 auto TotalComponents = C->getTotalComponentsNum(); 12722 12723 SmallVector<Expr *, 16> Vars; 12724 Vars.reserve(NumVars); 12725 for (unsigned i = 0; i != NumVars; ++i) 12726 Vars.push_back(Record.readSubExpr()); 12727 C->setVarRefs(Vars); 12728 Vars.clear(); 12729 for (unsigned i = 0; i != NumVars; ++i) 12730 Vars.push_back(Record.readSubExpr()); 12731 C->setPrivateCopies(Vars); 12732 Vars.clear(); 12733 for (unsigned i = 0; i != NumVars; ++i) 12734 Vars.push_back(Record.readSubExpr()); 12735 C->setInits(Vars); 12736 12737 SmallVector<ValueDecl *, 16> Decls; 12738 Decls.reserve(UniqueDecls); 12739 for (unsigned i = 0; i < UniqueDecls; ++i) 12740 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12741 C->setUniqueDecls(Decls); 12742 12743 SmallVector<unsigned, 16> ListsPerDecl; 12744 ListsPerDecl.reserve(UniqueDecls); 12745 for (unsigned i = 0; i < UniqueDecls; ++i) 12746 ListsPerDecl.push_back(Record.readInt()); 12747 C->setDeclNumLists(ListsPerDecl); 12748 12749 SmallVector<unsigned, 32> ListSizes; 12750 ListSizes.reserve(TotalLists); 12751 for (unsigned i = 0; i < TotalLists; ++i) 12752 ListSizes.push_back(Record.readInt()); 12753 C->setComponentListSizes(ListSizes); 12754 12755 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12756 Components.reserve(TotalComponents); 12757 for (unsigned i = 0; i < TotalComponents; ++i) { 12758 auto *AssociatedExprPr = Record.readSubExpr(); 12759 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12760 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12761 /*IsNonContiguous=*/false); 12762 } 12763 C->setComponents(Components, ListSizes); 12764 } 12765 12766 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12767 C->setLParenLoc(Record.readSourceLocation()); 12768 auto NumVars = C->varlist_size(); 12769 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12770 auto TotalLists = C->getTotalComponentListNum(); 12771 auto TotalComponents = C->getTotalComponentsNum(); 12772 12773 SmallVector<Expr *, 16> Vars; 12774 Vars.reserve(NumVars); 12775 for (unsigned i = 0; i != NumVars; ++i) 12776 Vars.push_back(Record.readSubExpr()); 12777 C->setVarRefs(Vars); 12778 12779 SmallVector<ValueDecl *, 16> Decls; 12780 Decls.reserve(UniqueDecls); 12781 for (unsigned i = 0; i < UniqueDecls; ++i) 12782 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12783 C->setUniqueDecls(Decls); 12784 12785 SmallVector<unsigned, 16> ListsPerDecl; 12786 ListsPerDecl.reserve(UniqueDecls); 12787 for (unsigned i = 0; i < UniqueDecls; ++i) 12788 ListsPerDecl.push_back(Record.readInt()); 12789 C->setDeclNumLists(ListsPerDecl); 12790 12791 SmallVector<unsigned, 32> ListSizes; 12792 ListSizes.reserve(TotalLists); 12793 for (unsigned i = 0; i < TotalLists; ++i) 12794 ListSizes.push_back(Record.readInt()); 12795 C->setComponentListSizes(ListSizes); 12796 12797 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12798 Components.reserve(TotalComponents); 12799 for (unsigned i = 0; i < TotalComponents; ++i) { 12800 Expr *AssociatedExpr = Record.readSubExpr(); 12801 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12802 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12803 /*IsNonContiguous*/ false); 12804 } 12805 C->setComponents(Components, ListSizes); 12806 } 12807 12808 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12809 C->setLParenLoc(Record.readSourceLocation()); 12810 auto NumVars = C->varlist_size(); 12811 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12812 auto TotalLists = C->getTotalComponentListNum(); 12813 auto TotalComponents = C->getTotalComponentsNum(); 12814 12815 SmallVector<Expr *, 16> Vars; 12816 Vars.reserve(NumVars); 12817 for (unsigned i = 0; i != NumVars; ++i) 12818 Vars.push_back(Record.readSubExpr()); 12819 C->setVarRefs(Vars); 12820 Vars.clear(); 12821 12822 SmallVector<ValueDecl *, 16> Decls; 12823 Decls.reserve(UniqueDecls); 12824 for (unsigned i = 0; i < UniqueDecls; ++i) 12825 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12826 C->setUniqueDecls(Decls); 12827 12828 SmallVector<unsigned, 16> ListsPerDecl; 12829 ListsPerDecl.reserve(UniqueDecls); 12830 for (unsigned i = 0; i < UniqueDecls; ++i) 12831 ListsPerDecl.push_back(Record.readInt()); 12832 C->setDeclNumLists(ListsPerDecl); 12833 12834 SmallVector<unsigned, 32> ListSizes; 12835 ListSizes.reserve(TotalLists); 12836 for (unsigned i = 0; i < TotalLists; ++i) 12837 ListSizes.push_back(Record.readInt()); 12838 C->setComponentListSizes(ListSizes); 12839 12840 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12841 Components.reserve(TotalComponents); 12842 for (unsigned i = 0; i < TotalComponents; ++i) { 12843 Expr *AssociatedExpr = Record.readSubExpr(); 12844 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12845 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12846 /*IsNonContiguous=*/false); 12847 } 12848 C->setComponents(Components, ListSizes); 12849 } 12850 12851 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12852 C->setLParenLoc(Record.readSourceLocation()); 12853 unsigned NumVars = C->varlist_size(); 12854 SmallVector<Expr *, 16> Vars; 12855 Vars.reserve(NumVars); 12856 for (unsigned i = 0; i != NumVars; ++i) 12857 Vars.push_back(Record.readSubExpr()); 12858 C->setVarRefs(Vars); 12859 Vars.clear(); 12860 Vars.reserve(NumVars); 12861 for (unsigned i = 0; i != NumVars; ++i) 12862 Vars.push_back(Record.readSubExpr()); 12863 C->setPrivateRefs(Vars); 12864 } 12865 12866 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12867 C->setLParenLoc(Record.readSourceLocation()); 12868 unsigned NumVars = C->varlist_size(); 12869 SmallVector<Expr *, 16> Vars; 12870 Vars.reserve(NumVars); 12871 for (unsigned i = 0; i != NumVars; ++i) 12872 Vars.push_back(Record.readSubExpr()); 12873 C->setVarRefs(Vars); 12874 } 12875 12876 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12877 C->setLParenLoc(Record.readSourceLocation()); 12878 unsigned NumVars = C->varlist_size(); 12879 SmallVector<Expr *, 16> Vars; 12880 Vars.reserve(NumVars); 12881 for (unsigned i = 0; i != NumVars; ++i) 12882 Vars.push_back(Record.readSubExpr()); 12883 C->setVarRefs(Vars); 12884 } 12885 12886 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12887 C->setLParenLoc(Record.readSourceLocation()); 12888 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12889 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12890 Data.reserve(NumOfAllocators); 12891 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12892 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12893 D.Allocator = Record.readSubExpr(); 12894 D.AllocatorTraits = Record.readSubExpr(); 12895 D.LParenLoc = Record.readSourceLocation(); 12896 D.RParenLoc = Record.readSourceLocation(); 12897 } 12898 C->setAllocatorsData(Data); 12899 } 12900 12901 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12902 C->setLParenLoc(Record.readSourceLocation()); 12903 C->setModifier(Record.readSubExpr()); 12904 C->setColonLoc(Record.readSourceLocation()); 12905 unsigned NumOfLocators = C->varlist_size(); 12906 SmallVector<Expr *, 4> Locators; 12907 Locators.reserve(NumOfLocators); 12908 for (unsigned I = 0; I != NumOfLocators; ++I) 12909 Locators.push_back(Record.readSubExpr()); 12910 C->setVarRefs(Locators); 12911 } 12912 12913 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12914 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12915 C->setLParenLoc(Record.readSourceLocation()); 12916 C->setKindKwLoc(Record.readSourceLocation()); 12917 } 12918 12919 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12920 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12921 TI.Sets.resize(readUInt32()); 12922 for (auto &Set : TI.Sets) { 12923 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12924 Set.Selectors.resize(readUInt32()); 12925 for (auto &Selector : Set.Selectors) { 12926 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12927 Selector.ScoreOrCondition = nullptr; 12928 if (readBool()) 12929 Selector.ScoreOrCondition = readExprRef(); 12930 Selector.Properties.resize(readUInt32()); 12931 for (auto &Property : Selector.Properties) 12932 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 12933 } 12934 } 12935 return &TI; 12936 } 12937 12938 void ASTRecordReader::readOMPChildren(OMPChildren *Data) { 12939 if (!Data) 12940 return; 12941 if (Reader->ReadingKind == ASTReader::Read_Stmt) { 12942 // Skip NumClauses, NumChildren and HasAssociatedStmt fields. 12943 skipInts(3); 12944 } 12945 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses()); 12946 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I) 12947 Clauses[I] = readOMPClause(); 12948 Data->setClauses(Clauses); 12949 if (Data->hasAssociatedStmt()) 12950 Data->setAssociatedStmt(readStmt()); 12951 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I) 12952 Data->getChildren()[I] = readStmt(); 12953 } 12954