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