1 //===- ASTReader.cpp - AST File Reader ------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the ASTReader class, which reads AST files. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "ASTCommon.h" 14 #include "ASTReaderInternals.h" 15 #include "clang/AST/ASTConsumer.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/ASTMutationListener.h" 18 #include "clang/AST/ASTUnresolvedSet.h" 19 #include "clang/AST/AbstractTypeReader.h" 20 #include "clang/AST/Decl.h" 21 #include "clang/AST/DeclBase.h" 22 #include "clang/AST/DeclCXX.h" 23 #include "clang/AST/DeclFriend.h" 24 #include "clang/AST/DeclGroup.h" 25 #include "clang/AST/DeclObjC.h" 26 #include "clang/AST/DeclTemplate.h" 27 #include "clang/AST/DeclarationName.h" 28 #include "clang/AST/Expr.h" 29 #include "clang/AST/ExprCXX.h" 30 #include "clang/AST/ExternalASTSource.h" 31 #include "clang/AST/NestedNameSpecifier.h" 32 #include "clang/AST/ODRHash.h" 33 #include "clang/AST/OpenMPClause.h" 34 #include "clang/AST/RawCommentList.h" 35 #include "clang/AST/TemplateBase.h" 36 #include "clang/AST/TemplateName.h" 37 #include "clang/AST/Type.h" 38 #include "clang/AST/TypeLoc.h" 39 #include "clang/AST/TypeLocVisitor.h" 40 #include "clang/AST/UnresolvedSet.h" 41 #include "clang/Basic/CommentOptions.h" 42 #include "clang/Basic/Diagnostic.h" 43 #include "clang/Basic/DiagnosticError.h" 44 #include "clang/Basic/DiagnosticOptions.h" 45 #include "clang/Basic/ExceptionSpecificationType.h" 46 #include "clang/Basic/FileManager.h" 47 #include "clang/Basic/FileSystemOptions.h" 48 #include "clang/Basic/IdentifierTable.h" 49 #include "clang/Basic/LLVM.h" 50 #include "clang/Basic/LangOptions.h" 51 #include "clang/Basic/Module.h" 52 #include "clang/Basic/ObjCRuntime.h" 53 #include "clang/Basic/OpenMPKinds.h" 54 #include "clang/Basic/OperatorKinds.h" 55 #include "clang/Basic/PragmaKinds.h" 56 #include "clang/Basic/Sanitizers.h" 57 #include "clang/Basic/SourceLocation.h" 58 #include "clang/Basic/SourceManager.h" 59 #include "clang/Basic/SourceManagerInternals.h" 60 #include "clang/Basic/Specifiers.h" 61 #include "clang/Basic/TargetInfo.h" 62 #include "clang/Basic/TargetOptions.h" 63 #include "clang/Basic/TokenKinds.h" 64 #include "clang/Basic/Version.h" 65 #include "clang/Lex/HeaderSearch.h" 66 #include "clang/Lex/HeaderSearchOptions.h" 67 #include "clang/Lex/MacroInfo.h" 68 #include "clang/Lex/ModuleMap.h" 69 #include "clang/Lex/PreprocessingRecord.h" 70 #include "clang/Lex/Preprocessor.h" 71 #include "clang/Lex/PreprocessorOptions.h" 72 #include "clang/Lex/Token.h" 73 #include "clang/Sema/ObjCMethodList.h" 74 #include "clang/Sema/Scope.h" 75 #include "clang/Sema/Sema.h" 76 #include "clang/Sema/Weak.h" 77 #include "clang/Serialization/ASTBitCodes.h" 78 #include "clang/Serialization/ASTDeserializationListener.h" 79 #include "clang/Serialization/ASTRecordReader.h" 80 #include "clang/Serialization/ContinuousRangeMap.h" 81 #include "clang/Serialization/GlobalModuleIndex.h" 82 #include "clang/Serialization/InMemoryModuleCache.h" 83 #include "clang/Serialization/ModuleFile.h" 84 #include "clang/Serialization/ModuleFileExtension.h" 85 #include "clang/Serialization/ModuleManager.h" 86 #include "clang/Serialization/PCHContainerOperations.h" 87 #include "clang/Serialization/SerializationDiagnostic.h" 88 #include "llvm/ADT/APFloat.h" 89 #include "llvm/ADT/APInt.h" 90 #include "llvm/ADT/APSInt.h" 91 #include "llvm/ADT/ArrayRef.h" 92 #include "llvm/ADT/DenseMap.h" 93 #include "llvm/ADT/FloatingPointMode.h" 94 #include "llvm/ADT/FoldingSet.h" 95 #include "llvm/ADT/Hashing.h" 96 #include "llvm/ADT/IntrusiveRefCntPtr.h" 97 #include "llvm/ADT/None.h" 98 #include "llvm/ADT/Optional.h" 99 #include "llvm/ADT/STLExtras.h" 100 #include "llvm/ADT/ScopeExit.h" 101 #include "llvm/ADT/SmallPtrSet.h" 102 #include "llvm/ADT/SmallString.h" 103 #include "llvm/ADT/SmallVector.h" 104 #include "llvm/ADT/StringExtras.h" 105 #include "llvm/ADT/StringMap.h" 106 #include "llvm/ADT/StringRef.h" 107 #include "llvm/ADT/Triple.h" 108 #include "llvm/ADT/iterator_range.h" 109 #include "llvm/Bitstream/BitstreamReader.h" 110 #include "llvm/Support/Casting.h" 111 #include "llvm/Support/Compiler.h" 112 #include "llvm/Support/Compression.h" 113 #include "llvm/Support/DJB.h" 114 #include "llvm/Support/Endian.h" 115 #include "llvm/Support/Error.h" 116 #include "llvm/Support/ErrorHandling.h" 117 #include "llvm/Support/FileSystem.h" 118 #include "llvm/Support/LEB128.h" 119 #include "llvm/Support/MemoryBuffer.h" 120 #include "llvm/Support/Path.h" 121 #include "llvm/Support/SaveAndRestore.h" 122 #include "llvm/Support/Timer.h" 123 #include "llvm/Support/VersionTuple.h" 124 #include "llvm/Support/raw_ostream.h" 125 #include <algorithm> 126 #include <cassert> 127 #include <cstddef> 128 #include <cstdint> 129 #include <cstdio> 130 #include <ctime> 131 #include <iterator> 132 #include <limits> 133 #include <map> 134 #include <memory> 135 #include <string> 136 #include <system_error> 137 #include <tuple> 138 #include <utility> 139 #include <vector> 140 141 using namespace clang; 142 using namespace clang::serialization; 143 using namespace clang::serialization::reader; 144 using llvm::BitstreamCursor; 145 using llvm::RoundingMode; 146 147 //===----------------------------------------------------------------------===// 148 // ChainedASTReaderListener implementation 149 //===----------------------------------------------------------------------===// 150 151 bool 152 ChainedASTReaderListener::ReadFullVersionInformation(StringRef FullVersion) { 153 return First->ReadFullVersionInformation(FullVersion) || 154 Second->ReadFullVersionInformation(FullVersion); 155 } 156 157 void ChainedASTReaderListener::ReadModuleName(StringRef ModuleName) { 158 First->ReadModuleName(ModuleName); 159 Second->ReadModuleName(ModuleName); 160 } 161 162 void ChainedASTReaderListener::ReadModuleMapFile(StringRef ModuleMapPath) { 163 First->ReadModuleMapFile(ModuleMapPath); 164 Second->ReadModuleMapFile(ModuleMapPath); 165 } 166 167 bool 168 ChainedASTReaderListener::ReadLanguageOptions(const LangOptions &LangOpts, 169 bool Complain, 170 bool AllowCompatibleDifferences) { 171 return First->ReadLanguageOptions(LangOpts, Complain, 172 AllowCompatibleDifferences) || 173 Second->ReadLanguageOptions(LangOpts, Complain, 174 AllowCompatibleDifferences); 175 } 176 177 bool ChainedASTReaderListener::ReadTargetOptions( 178 const TargetOptions &TargetOpts, bool Complain, 179 bool AllowCompatibleDifferences) { 180 return First->ReadTargetOptions(TargetOpts, Complain, 181 AllowCompatibleDifferences) || 182 Second->ReadTargetOptions(TargetOpts, Complain, 183 AllowCompatibleDifferences); 184 } 185 186 bool ChainedASTReaderListener::ReadDiagnosticOptions( 187 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 188 return First->ReadDiagnosticOptions(DiagOpts, Complain) || 189 Second->ReadDiagnosticOptions(DiagOpts, Complain); 190 } 191 192 bool 193 ChainedASTReaderListener::ReadFileSystemOptions(const FileSystemOptions &FSOpts, 194 bool Complain) { 195 return First->ReadFileSystemOptions(FSOpts, Complain) || 196 Second->ReadFileSystemOptions(FSOpts, Complain); 197 } 198 199 bool ChainedASTReaderListener::ReadHeaderSearchOptions( 200 const HeaderSearchOptions &HSOpts, StringRef SpecificModuleCachePath, 201 bool Complain) { 202 return First->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 203 Complain) || 204 Second->ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 205 Complain); 206 } 207 208 bool ChainedASTReaderListener::ReadPreprocessorOptions( 209 const PreprocessorOptions &PPOpts, bool Complain, 210 std::string &SuggestedPredefines) { 211 return First->ReadPreprocessorOptions(PPOpts, Complain, 212 SuggestedPredefines) || 213 Second->ReadPreprocessorOptions(PPOpts, Complain, SuggestedPredefines); 214 } 215 216 void ChainedASTReaderListener::ReadCounter(const serialization::ModuleFile &M, 217 unsigned Value) { 218 First->ReadCounter(M, Value); 219 Second->ReadCounter(M, Value); 220 } 221 222 bool ChainedASTReaderListener::needsInputFileVisitation() { 223 return First->needsInputFileVisitation() || 224 Second->needsInputFileVisitation(); 225 } 226 227 bool ChainedASTReaderListener::needsSystemInputFileVisitation() { 228 return First->needsSystemInputFileVisitation() || 229 Second->needsSystemInputFileVisitation(); 230 } 231 232 void ChainedASTReaderListener::visitModuleFile(StringRef Filename, 233 ModuleKind Kind) { 234 First->visitModuleFile(Filename, Kind); 235 Second->visitModuleFile(Filename, Kind); 236 } 237 238 bool ChainedASTReaderListener::visitInputFile(StringRef Filename, 239 bool isSystem, 240 bool isOverridden, 241 bool isExplicitModule) { 242 bool Continue = false; 243 if (First->needsInputFileVisitation() && 244 (!isSystem || First->needsSystemInputFileVisitation())) 245 Continue |= First->visitInputFile(Filename, isSystem, isOverridden, 246 isExplicitModule); 247 if (Second->needsInputFileVisitation() && 248 (!isSystem || Second->needsSystemInputFileVisitation())) 249 Continue |= Second->visitInputFile(Filename, isSystem, isOverridden, 250 isExplicitModule); 251 return Continue; 252 } 253 254 void ChainedASTReaderListener::readModuleFileExtension( 255 const ModuleFileExtensionMetadata &Metadata) { 256 First->readModuleFileExtension(Metadata); 257 Second->readModuleFileExtension(Metadata); 258 } 259 260 //===----------------------------------------------------------------------===// 261 // PCH validator implementation 262 //===----------------------------------------------------------------------===// 263 264 ASTReaderListener::~ASTReaderListener() = default; 265 266 /// Compare the given set of language options against an existing set of 267 /// language options. 268 /// 269 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 270 /// \param AllowCompatibleDifferences If true, differences between compatible 271 /// language options will be permitted. 272 /// 273 /// \returns true if the languagae options mis-match, false otherwise. 274 static bool checkLanguageOptions(const LangOptions &LangOpts, 275 const LangOptions &ExistingLangOpts, 276 DiagnosticsEngine *Diags, 277 bool AllowCompatibleDifferences = true) { 278 #define LANGOPT(Name, Bits, Default, Description) \ 279 if (ExistingLangOpts.Name != LangOpts.Name) { \ 280 if (Diags) \ 281 Diags->Report(diag::err_pch_langopt_mismatch) \ 282 << Description << LangOpts.Name << ExistingLangOpts.Name; \ 283 return true; \ 284 } 285 286 #define VALUE_LANGOPT(Name, Bits, Default, Description) \ 287 if (ExistingLangOpts.Name != LangOpts.Name) { \ 288 if (Diags) \ 289 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 290 << Description; \ 291 return true; \ 292 } 293 294 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 295 if (ExistingLangOpts.get##Name() != LangOpts.get##Name()) { \ 296 if (Diags) \ 297 Diags->Report(diag::err_pch_langopt_value_mismatch) \ 298 << Description; \ 299 return true; \ 300 } 301 302 #define COMPATIBLE_LANGOPT(Name, Bits, Default, Description) \ 303 if (!AllowCompatibleDifferences) \ 304 LANGOPT(Name, Bits, Default, Description) 305 306 #define COMPATIBLE_ENUM_LANGOPT(Name, Bits, Default, Description) \ 307 if (!AllowCompatibleDifferences) \ 308 ENUM_LANGOPT(Name, Bits, Default, Description) 309 310 #define COMPATIBLE_VALUE_LANGOPT(Name, Bits, Default, Description) \ 311 if (!AllowCompatibleDifferences) \ 312 VALUE_LANGOPT(Name, Bits, Default, Description) 313 314 #define BENIGN_LANGOPT(Name, Bits, Default, Description) 315 #define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) 316 #define BENIGN_VALUE_LANGOPT(Name, Type, Bits, Default, Description) 317 #include "clang/Basic/LangOptions.def" 318 319 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures) { 320 if (Diags) 321 Diags->Report(diag::err_pch_langopt_value_mismatch) << "module features"; 322 return true; 323 } 324 325 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime) { 326 if (Diags) 327 Diags->Report(diag::err_pch_langopt_value_mismatch) 328 << "target Objective-C runtime"; 329 return true; 330 } 331 332 if (ExistingLangOpts.CommentOpts.BlockCommandNames != 333 LangOpts.CommentOpts.BlockCommandNames) { 334 if (Diags) 335 Diags->Report(diag::err_pch_langopt_value_mismatch) 336 << "block command names"; 337 return true; 338 } 339 340 // Sanitizer feature mismatches are treated as compatible differences. If 341 // compatible differences aren't allowed, we still only want to check for 342 // mismatches of non-modular sanitizers (the only ones which can affect AST 343 // generation). 344 if (!AllowCompatibleDifferences) { 345 SanitizerMask ModularSanitizers = getPPTransparentSanitizers(); 346 SanitizerSet ExistingSanitizers = ExistingLangOpts.Sanitize; 347 SanitizerSet ImportedSanitizers = LangOpts.Sanitize; 348 ExistingSanitizers.clear(ModularSanitizers); 349 ImportedSanitizers.clear(ModularSanitizers); 350 if (ExistingSanitizers.Mask != ImportedSanitizers.Mask) { 351 const std::string Flag = "-fsanitize="; 352 if (Diags) { 353 #define SANITIZER(NAME, ID) \ 354 { \ 355 bool InExistingModule = ExistingSanitizers.has(SanitizerKind::ID); \ 356 bool InImportedModule = ImportedSanitizers.has(SanitizerKind::ID); \ 357 if (InExistingModule != InImportedModule) \ 358 Diags->Report(diag::err_pch_targetopt_feature_mismatch) \ 359 << InExistingModule << (Flag + NAME); \ 360 } 361 #include "clang/Basic/Sanitizers.def" 362 } 363 return true; 364 } 365 } 366 367 return false; 368 } 369 370 /// Compare the given set of target options against an existing set of 371 /// target options. 372 /// 373 /// \param Diags If non-NULL, diagnostics will be emitted via this engine. 374 /// 375 /// \returns true if the target options mis-match, false otherwise. 376 static bool checkTargetOptions(const TargetOptions &TargetOpts, 377 const TargetOptions &ExistingTargetOpts, 378 DiagnosticsEngine *Diags, 379 bool AllowCompatibleDifferences = true) { 380 #define CHECK_TARGET_OPT(Field, Name) \ 381 if (TargetOpts.Field != ExistingTargetOpts.Field) { \ 382 if (Diags) \ 383 Diags->Report(diag::err_pch_targetopt_mismatch) \ 384 << Name << TargetOpts.Field << ExistingTargetOpts.Field; \ 385 return true; \ 386 } 387 388 // The triple and ABI must match exactly. 389 CHECK_TARGET_OPT(Triple, "target"); 390 CHECK_TARGET_OPT(ABI, "target ABI"); 391 392 // We can tolerate different CPUs in many cases, notably when one CPU 393 // supports a strict superset of another. When allowing compatible 394 // differences skip this check. 395 if (!AllowCompatibleDifferences) { 396 CHECK_TARGET_OPT(CPU, "target CPU"); 397 CHECK_TARGET_OPT(TuneCPU, "tune CPU"); 398 } 399 400 #undef CHECK_TARGET_OPT 401 402 // Compare feature sets. 403 SmallVector<StringRef, 4> ExistingFeatures( 404 ExistingTargetOpts.FeaturesAsWritten.begin(), 405 ExistingTargetOpts.FeaturesAsWritten.end()); 406 SmallVector<StringRef, 4> ReadFeatures(TargetOpts.FeaturesAsWritten.begin(), 407 TargetOpts.FeaturesAsWritten.end()); 408 llvm::sort(ExistingFeatures); 409 llvm::sort(ReadFeatures); 410 411 // We compute the set difference in both directions explicitly so that we can 412 // diagnose the differences differently. 413 SmallVector<StringRef, 4> UnmatchedExistingFeatures, UnmatchedReadFeatures; 414 std::set_difference( 415 ExistingFeatures.begin(), ExistingFeatures.end(), ReadFeatures.begin(), 416 ReadFeatures.end(), std::back_inserter(UnmatchedExistingFeatures)); 417 std::set_difference(ReadFeatures.begin(), ReadFeatures.end(), 418 ExistingFeatures.begin(), ExistingFeatures.end(), 419 std::back_inserter(UnmatchedReadFeatures)); 420 421 // If we are allowing compatible differences and the read feature set is 422 // a strict subset of the existing feature set, there is nothing to diagnose. 423 if (AllowCompatibleDifferences && UnmatchedReadFeatures.empty()) 424 return false; 425 426 if (Diags) { 427 for (StringRef Feature : UnmatchedReadFeatures) 428 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 429 << /* is-existing-feature */ false << Feature; 430 for (StringRef Feature : UnmatchedExistingFeatures) 431 Diags->Report(diag::err_pch_targetopt_feature_mismatch) 432 << /* is-existing-feature */ true << Feature; 433 } 434 435 return !UnmatchedReadFeatures.empty() || !UnmatchedExistingFeatures.empty(); 436 } 437 438 bool 439 PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts, 440 bool Complain, 441 bool AllowCompatibleDifferences) { 442 const LangOptions &ExistingLangOpts = PP.getLangOpts(); 443 return checkLanguageOptions(LangOpts, ExistingLangOpts, 444 Complain ? &Reader.Diags : nullptr, 445 AllowCompatibleDifferences); 446 } 447 448 bool PCHValidator::ReadTargetOptions(const TargetOptions &TargetOpts, 449 bool Complain, 450 bool AllowCompatibleDifferences) { 451 const TargetOptions &ExistingTargetOpts = PP.getTargetInfo().getTargetOpts(); 452 return checkTargetOptions(TargetOpts, ExistingTargetOpts, 453 Complain ? &Reader.Diags : nullptr, 454 AllowCompatibleDifferences); 455 } 456 457 namespace { 458 459 using MacroDefinitionsMap = 460 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>; 461 using DeclsMap = llvm::DenseMap<DeclarationName, SmallVector<NamedDecl *, 8>>; 462 463 } // namespace 464 465 static bool checkDiagnosticGroupMappings(DiagnosticsEngine &StoredDiags, 466 DiagnosticsEngine &Diags, 467 bool Complain) { 468 using Level = DiagnosticsEngine::Level; 469 470 // Check current mappings for new -Werror mappings, and the stored mappings 471 // for cases that were explicitly mapped to *not* be errors that are now 472 // errors because of options like -Werror. 473 DiagnosticsEngine *MappingSources[] = { &Diags, &StoredDiags }; 474 475 for (DiagnosticsEngine *MappingSource : MappingSources) { 476 for (auto DiagIDMappingPair : MappingSource->getDiagnosticMappings()) { 477 diag::kind DiagID = DiagIDMappingPair.first; 478 Level CurLevel = Diags.getDiagnosticLevel(DiagID, SourceLocation()); 479 if (CurLevel < DiagnosticsEngine::Error) 480 continue; // not significant 481 Level StoredLevel = 482 StoredDiags.getDiagnosticLevel(DiagID, SourceLocation()); 483 if (StoredLevel < DiagnosticsEngine::Error) { 484 if (Complain) 485 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror=" + 486 Diags.getDiagnosticIDs()->getWarningOptionForDiag(DiagID).str(); 487 return true; 488 } 489 } 490 } 491 492 return false; 493 } 494 495 static bool isExtHandlingFromDiagsError(DiagnosticsEngine &Diags) { 496 diag::Severity Ext = Diags.getExtensionHandlingBehavior(); 497 if (Ext == diag::Severity::Warning && Diags.getWarningsAsErrors()) 498 return true; 499 return Ext >= diag::Severity::Error; 500 } 501 502 static bool checkDiagnosticMappings(DiagnosticsEngine &StoredDiags, 503 DiagnosticsEngine &Diags, 504 bool IsSystem, bool Complain) { 505 // Top-level options 506 if (IsSystem) { 507 if (Diags.getSuppressSystemWarnings()) 508 return false; 509 // If -Wsystem-headers was not enabled before, be conservative 510 if (StoredDiags.getSuppressSystemWarnings()) { 511 if (Complain) 512 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Wsystem-headers"; 513 return true; 514 } 515 } 516 517 if (Diags.getWarningsAsErrors() && !StoredDiags.getWarningsAsErrors()) { 518 if (Complain) 519 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Werror"; 520 return true; 521 } 522 523 if (Diags.getWarningsAsErrors() && Diags.getEnableAllWarnings() && 524 !StoredDiags.getEnableAllWarnings()) { 525 if (Complain) 526 Diags.Report(diag::err_pch_diagopt_mismatch) << "-Weverything -Werror"; 527 return true; 528 } 529 530 if (isExtHandlingFromDiagsError(Diags) && 531 !isExtHandlingFromDiagsError(StoredDiags)) { 532 if (Complain) 533 Diags.Report(diag::err_pch_diagopt_mismatch) << "-pedantic-errors"; 534 return true; 535 } 536 537 return checkDiagnosticGroupMappings(StoredDiags, Diags, Complain); 538 } 539 540 /// Return the top import module if it is implicit, nullptr otherwise. 541 static Module *getTopImportImplicitModule(ModuleManager &ModuleMgr, 542 Preprocessor &PP) { 543 // If the original import came from a file explicitly generated by the user, 544 // don't check the diagnostic mappings. 545 // FIXME: currently this is approximated by checking whether this is not a 546 // module import of an implicitly-loaded module file. 547 // Note: ModuleMgr.rbegin() may not be the current module, but it must be in 548 // the transitive closure of its imports, since unrelated modules cannot be 549 // imported until after this module finishes validation. 550 ModuleFile *TopImport = &*ModuleMgr.rbegin(); 551 while (!TopImport->ImportedBy.empty()) 552 TopImport = TopImport->ImportedBy[0]; 553 if (TopImport->Kind != MK_ImplicitModule) 554 return nullptr; 555 556 StringRef ModuleName = TopImport->ModuleName; 557 assert(!ModuleName.empty() && "diagnostic options read before module name"); 558 559 Module *M = 560 PP.getHeaderSearchInfo().lookupModule(ModuleName, TopImport->ImportLoc); 561 assert(M && "missing module"); 562 return M; 563 } 564 565 bool PCHValidator::ReadDiagnosticOptions( 566 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts, bool Complain) { 567 DiagnosticsEngine &ExistingDiags = PP.getDiagnostics(); 568 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(ExistingDiags.getDiagnosticIDs()); 569 IntrusiveRefCntPtr<DiagnosticsEngine> Diags( 570 new DiagnosticsEngine(DiagIDs, DiagOpts.get())); 571 // This should never fail, because we would have processed these options 572 // before writing them to an ASTFile. 573 ProcessWarningOptions(*Diags, *DiagOpts, /*Report*/false); 574 575 ModuleManager &ModuleMgr = Reader.getModuleManager(); 576 assert(ModuleMgr.size() >= 1 && "what ASTFile is this then"); 577 578 Module *TopM = getTopImportImplicitModule(ModuleMgr, PP); 579 if (!TopM) 580 return false; 581 582 // FIXME: if the diagnostics are incompatible, save a DiagnosticOptions that 583 // contains the union of their flags. 584 return checkDiagnosticMappings(*Diags, ExistingDiags, TopM->IsSystem, 585 Complain); 586 } 587 588 /// Collect the macro definitions provided by the given preprocessor 589 /// options. 590 static void 591 collectMacroDefinitions(const PreprocessorOptions &PPOpts, 592 MacroDefinitionsMap &Macros, 593 SmallVectorImpl<StringRef> *MacroNames = nullptr) { 594 for (unsigned I = 0, N = PPOpts.Macros.size(); I != N; ++I) { 595 StringRef Macro = PPOpts.Macros[I].first; 596 bool IsUndef = PPOpts.Macros[I].second; 597 598 std::pair<StringRef, StringRef> MacroPair = Macro.split('='); 599 StringRef MacroName = MacroPair.first; 600 StringRef MacroBody = MacroPair.second; 601 602 // For an #undef'd macro, we only care about the name. 603 if (IsUndef) { 604 if (MacroNames && !Macros.count(MacroName)) 605 MacroNames->push_back(MacroName); 606 607 Macros[MacroName] = std::make_pair("", true); 608 continue; 609 } 610 611 // For a #define'd macro, figure out the actual definition. 612 if (MacroName.size() == Macro.size()) 613 MacroBody = "1"; 614 else { 615 // Note: GCC drops anything following an end-of-line character. 616 StringRef::size_type End = MacroBody.find_first_of("\n\r"); 617 MacroBody = MacroBody.substr(0, End); 618 } 619 620 if (MacroNames && !Macros.count(MacroName)) 621 MacroNames->push_back(MacroName); 622 Macros[MacroName] = std::make_pair(MacroBody, false); 623 } 624 } 625 626 /// Check the preprocessor options deserialized from the control block 627 /// against the preprocessor options in an existing preprocessor. 628 /// 629 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 630 /// \param Validate If true, validate preprocessor options. If false, allow 631 /// macros defined by \p ExistingPPOpts to override those defined by 632 /// \p PPOpts in SuggestedPredefines. 633 static bool checkPreprocessorOptions(const PreprocessorOptions &PPOpts, 634 const PreprocessorOptions &ExistingPPOpts, 635 DiagnosticsEngine *Diags, 636 FileManager &FileMgr, 637 std::string &SuggestedPredefines, 638 const LangOptions &LangOpts, 639 bool Validate = true) { 640 // Check macro definitions. 641 MacroDefinitionsMap ASTFileMacros; 642 collectMacroDefinitions(PPOpts, ASTFileMacros); 643 MacroDefinitionsMap ExistingMacros; 644 SmallVector<StringRef, 4> ExistingMacroNames; 645 collectMacroDefinitions(ExistingPPOpts, ExistingMacros, &ExistingMacroNames); 646 647 for (unsigned I = 0, N = ExistingMacroNames.size(); I != N; ++I) { 648 // Dig out the macro definition in the existing preprocessor options. 649 StringRef MacroName = ExistingMacroNames[I]; 650 std::pair<StringRef, bool> Existing = ExistingMacros[MacroName]; 651 652 // Check whether we know anything about this macro name or not. 653 llvm::StringMap<std::pair<StringRef, bool /*IsUndef*/>>::iterator Known = 654 ASTFileMacros.find(MacroName); 655 if (!Validate || Known == ASTFileMacros.end()) { 656 // FIXME: Check whether this identifier was referenced anywhere in the 657 // AST file. If so, we should reject the AST file. Unfortunately, this 658 // information isn't in the control block. What shall we do about it? 659 660 if (Existing.second) { 661 SuggestedPredefines += "#undef "; 662 SuggestedPredefines += MacroName.str(); 663 SuggestedPredefines += '\n'; 664 } else { 665 SuggestedPredefines += "#define "; 666 SuggestedPredefines += MacroName.str(); 667 SuggestedPredefines += ' '; 668 SuggestedPredefines += Existing.first.str(); 669 SuggestedPredefines += '\n'; 670 } 671 continue; 672 } 673 674 // If the macro was defined in one but undef'd in the other, we have a 675 // conflict. 676 if (Existing.second != Known->second.second) { 677 if (Diags) { 678 Diags->Report(diag::err_pch_macro_def_undef) 679 << MacroName << Known->second.second; 680 } 681 return true; 682 } 683 684 // If the macro was #undef'd in both, or if the macro bodies are identical, 685 // it's fine. 686 if (Existing.second || Existing.first == Known->second.first) 687 continue; 688 689 // The macro bodies differ; complain. 690 if (Diags) { 691 Diags->Report(diag::err_pch_macro_def_conflict) 692 << MacroName << Known->second.first << Existing.first; 693 } 694 return true; 695 } 696 697 // Check whether we're using predefines. 698 if (PPOpts.UsePredefines != ExistingPPOpts.UsePredefines && Validate) { 699 if (Diags) { 700 Diags->Report(diag::err_pch_undef) << ExistingPPOpts.UsePredefines; 701 } 702 return true; 703 } 704 705 // Detailed record is important since it is used for the module cache hash. 706 if (LangOpts.Modules && 707 PPOpts.DetailedRecord != ExistingPPOpts.DetailedRecord && Validate) { 708 if (Diags) { 709 Diags->Report(diag::err_pch_pp_detailed_record) << PPOpts.DetailedRecord; 710 } 711 return true; 712 } 713 714 // Compute the #include and #include_macros lines we need. 715 for (unsigned I = 0, N = ExistingPPOpts.Includes.size(); I != N; ++I) { 716 StringRef File = ExistingPPOpts.Includes[I]; 717 718 if (!ExistingPPOpts.ImplicitPCHInclude.empty() && 719 !ExistingPPOpts.PCHThroughHeader.empty()) { 720 // In case the through header is an include, we must add all the includes 721 // to the predefines so the start point can be determined. 722 SuggestedPredefines += "#include \""; 723 SuggestedPredefines += File; 724 SuggestedPredefines += "\"\n"; 725 continue; 726 } 727 728 if (File == ExistingPPOpts.ImplicitPCHInclude) 729 continue; 730 731 if (llvm::is_contained(PPOpts.Includes, File)) 732 continue; 733 734 SuggestedPredefines += "#include \""; 735 SuggestedPredefines += File; 736 SuggestedPredefines += "\"\n"; 737 } 738 739 for (unsigned I = 0, N = ExistingPPOpts.MacroIncludes.size(); I != N; ++I) { 740 StringRef File = ExistingPPOpts.MacroIncludes[I]; 741 if (llvm::is_contained(PPOpts.MacroIncludes, File)) 742 continue; 743 744 SuggestedPredefines += "#__include_macros \""; 745 SuggestedPredefines += File; 746 SuggestedPredefines += "\"\n##\n"; 747 } 748 749 return false; 750 } 751 752 bool PCHValidator::ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 753 bool Complain, 754 std::string &SuggestedPredefines) { 755 const PreprocessorOptions &ExistingPPOpts = PP.getPreprocessorOpts(); 756 757 return checkPreprocessorOptions(PPOpts, ExistingPPOpts, 758 Complain? &Reader.Diags : nullptr, 759 PP.getFileManager(), 760 SuggestedPredefines, 761 PP.getLangOpts()); 762 } 763 764 bool SimpleASTReaderListener::ReadPreprocessorOptions( 765 const PreprocessorOptions &PPOpts, 766 bool Complain, 767 std::string &SuggestedPredefines) { 768 return checkPreprocessorOptions(PPOpts, 769 PP.getPreprocessorOpts(), 770 nullptr, 771 PP.getFileManager(), 772 SuggestedPredefines, 773 PP.getLangOpts(), 774 false); 775 } 776 777 /// Check the header search options deserialized from the control block 778 /// against the header search options in an existing preprocessor. 779 /// 780 /// \param Diags If non-null, produce diagnostics for any mismatches incurred. 781 static bool checkHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 782 StringRef SpecificModuleCachePath, 783 StringRef ExistingModuleCachePath, 784 DiagnosticsEngine *Diags, 785 const LangOptions &LangOpts, 786 const PreprocessorOptions &PPOpts) { 787 if (LangOpts.Modules) { 788 if (SpecificModuleCachePath != ExistingModuleCachePath && 789 !PPOpts.AllowPCHWithDifferentModulesCachePath) { 790 if (Diags) 791 Diags->Report(diag::err_pch_modulecache_mismatch) 792 << SpecificModuleCachePath << ExistingModuleCachePath; 793 return true; 794 } 795 } 796 797 return false; 798 } 799 800 bool PCHValidator::ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 801 StringRef SpecificModuleCachePath, 802 bool Complain) { 803 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 804 PP.getHeaderSearchInfo().getModuleCachePath(), 805 Complain ? &Reader.Diags : nullptr, 806 PP.getLangOpts(), PP.getPreprocessorOpts()); 807 } 808 809 void PCHValidator::ReadCounter(const ModuleFile &M, unsigned Value) { 810 PP.setCounterValue(Value); 811 } 812 813 //===----------------------------------------------------------------------===// 814 // AST reader implementation 815 //===----------------------------------------------------------------------===// 816 817 static uint64_t readULEB(const unsigned char *&P) { 818 unsigned Length = 0; 819 const char *Error = nullptr; 820 821 uint64_t Val = llvm::decodeULEB128(P, &Length, nullptr, &Error); 822 if (Error) 823 llvm::report_fatal_error(Error); 824 P += Length; 825 return Val; 826 } 827 828 /// Read ULEB-encoded key length and data length. 829 static std::pair<unsigned, unsigned> 830 readULEBKeyDataLength(const unsigned char *&P) { 831 unsigned KeyLen = readULEB(P); 832 if ((unsigned)KeyLen != KeyLen) 833 llvm::report_fatal_error("key too large"); 834 835 unsigned DataLen = readULEB(P); 836 if ((unsigned)DataLen != DataLen) 837 llvm::report_fatal_error("data too large"); 838 839 return std::make_pair(KeyLen, DataLen); 840 } 841 842 void ASTReader::setDeserializationListener(ASTDeserializationListener *Listener, 843 bool TakeOwnership) { 844 DeserializationListener = Listener; 845 OwnsDeserializationListener = TakeOwnership; 846 } 847 848 unsigned ASTSelectorLookupTrait::ComputeHash(Selector Sel) { 849 return serialization::ComputeHash(Sel); 850 } 851 852 std::pair<unsigned, unsigned> 853 ASTSelectorLookupTrait::ReadKeyDataLength(const unsigned char*& d) { 854 return readULEBKeyDataLength(d); 855 } 856 857 ASTSelectorLookupTrait::internal_key_type 858 ASTSelectorLookupTrait::ReadKey(const unsigned char* d, unsigned) { 859 using namespace llvm::support; 860 861 SelectorTable &SelTable = Reader.getContext().Selectors; 862 unsigned N = endian::readNext<uint16_t, little, unaligned>(d); 863 IdentifierInfo *FirstII = Reader.getLocalIdentifier( 864 F, endian::readNext<uint32_t, little, unaligned>(d)); 865 if (N == 0) 866 return SelTable.getNullarySelector(FirstII); 867 else if (N == 1) 868 return SelTable.getUnarySelector(FirstII); 869 870 SmallVector<IdentifierInfo *, 16> Args; 871 Args.push_back(FirstII); 872 for (unsigned I = 1; I != N; ++I) 873 Args.push_back(Reader.getLocalIdentifier( 874 F, endian::readNext<uint32_t, little, unaligned>(d))); 875 876 return SelTable.getSelector(N, Args.data()); 877 } 878 879 ASTSelectorLookupTrait::data_type 880 ASTSelectorLookupTrait::ReadData(Selector, const unsigned char* d, 881 unsigned DataLen) { 882 using namespace llvm::support; 883 884 data_type Result; 885 886 Result.ID = Reader.getGlobalSelectorID( 887 F, endian::readNext<uint32_t, little, unaligned>(d)); 888 unsigned FullInstanceBits = endian::readNext<uint16_t, little, unaligned>(d); 889 unsigned FullFactoryBits = endian::readNext<uint16_t, little, unaligned>(d); 890 Result.InstanceBits = FullInstanceBits & 0x3; 891 Result.InstanceHasMoreThanOneDecl = (FullInstanceBits >> 2) & 0x1; 892 Result.FactoryBits = FullFactoryBits & 0x3; 893 Result.FactoryHasMoreThanOneDecl = (FullFactoryBits >> 2) & 0x1; 894 unsigned NumInstanceMethods = FullInstanceBits >> 3; 895 unsigned NumFactoryMethods = FullFactoryBits >> 3; 896 897 // Load instance methods 898 for (unsigned I = 0; I != NumInstanceMethods; ++I) { 899 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 900 F, endian::readNext<uint32_t, little, unaligned>(d))) 901 Result.Instance.push_back(Method); 902 } 903 904 // Load factory methods 905 for (unsigned I = 0; I != NumFactoryMethods; ++I) { 906 if (ObjCMethodDecl *Method = Reader.GetLocalDeclAs<ObjCMethodDecl>( 907 F, endian::readNext<uint32_t, little, unaligned>(d))) 908 Result.Factory.push_back(Method); 909 } 910 911 return Result; 912 } 913 914 unsigned ASTIdentifierLookupTraitBase::ComputeHash(const internal_key_type& a) { 915 return llvm::djbHash(a); 916 } 917 918 std::pair<unsigned, unsigned> 919 ASTIdentifierLookupTraitBase::ReadKeyDataLength(const unsigned char*& d) { 920 return readULEBKeyDataLength(d); 921 } 922 923 ASTIdentifierLookupTraitBase::internal_key_type 924 ASTIdentifierLookupTraitBase::ReadKey(const unsigned char* d, unsigned n) { 925 assert(n >= 2 && d[n-1] == '\0'); 926 return StringRef((const char*) d, n-1); 927 } 928 929 /// Whether the given identifier is "interesting". 930 static bool isInterestingIdentifier(ASTReader &Reader, IdentifierInfo &II, 931 bool IsModule) { 932 return II.hadMacroDefinition() || II.isPoisoned() || 933 (!IsModule && II.getObjCOrBuiltinID()) || 934 II.hasRevertedTokenIDToIdentifier() || 935 (!(IsModule && Reader.getPreprocessor().getLangOpts().CPlusPlus) && 936 II.getFETokenInfo()); 937 } 938 939 static bool readBit(unsigned &Bits) { 940 bool Value = Bits & 0x1; 941 Bits >>= 1; 942 return Value; 943 } 944 945 IdentID ASTIdentifierLookupTrait::ReadIdentifierID(const unsigned char *d) { 946 using namespace llvm::support; 947 948 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 949 return Reader.getGlobalIdentifierID(F, RawID >> 1); 950 } 951 952 static void markIdentifierFromAST(ASTReader &Reader, IdentifierInfo &II) { 953 if (!II.isFromAST()) { 954 II.setIsFromAST(); 955 bool IsModule = Reader.getPreprocessor().getCurrentModule() != nullptr; 956 if (isInterestingIdentifier(Reader, II, IsModule)) 957 II.setChangedSinceDeserialization(); 958 } 959 } 960 961 IdentifierInfo *ASTIdentifierLookupTrait::ReadData(const internal_key_type& k, 962 const unsigned char* d, 963 unsigned DataLen) { 964 using namespace llvm::support; 965 966 unsigned RawID = endian::readNext<uint32_t, little, unaligned>(d); 967 bool IsInteresting = RawID & 0x01; 968 969 // Wipe out the "is interesting" bit. 970 RawID = RawID >> 1; 971 972 // Build the IdentifierInfo and link the identifier ID with it. 973 IdentifierInfo *II = KnownII; 974 if (!II) { 975 II = &Reader.getIdentifierTable().getOwn(k); 976 KnownII = II; 977 } 978 markIdentifierFromAST(Reader, *II); 979 Reader.markIdentifierUpToDate(II); 980 981 IdentID ID = Reader.getGlobalIdentifierID(F, RawID); 982 if (!IsInteresting) { 983 // For uninteresting identifiers, there's nothing else to do. Just notify 984 // the reader that we've finished loading this identifier. 985 Reader.SetIdentifierInfo(ID, II); 986 return II; 987 } 988 989 unsigned ObjCOrBuiltinID = endian::readNext<uint16_t, little, unaligned>(d); 990 unsigned Bits = endian::readNext<uint16_t, little, unaligned>(d); 991 bool CPlusPlusOperatorKeyword = readBit(Bits); 992 bool HasRevertedTokenIDToIdentifier = readBit(Bits); 993 bool Poisoned = readBit(Bits); 994 bool ExtensionToken = readBit(Bits); 995 bool HadMacroDefinition = readBit(Bits); 996 997 assert(Bits == 0 && "Extra bits in the identifier?"); 998 DataLen -= 8; 999 1000 // Set or check the various bits in the IdentifierInfo structure. 1001 // Token IDs are read-only. 1002 if (HasRevertedTokenIDToIdentifier && II->getTokenID() != tok::identifier) 1003 II->revertTokenIDToIdentifier(); 1004 if (!F.isModule()) 1005 II->setObjCOrBuiltinID(ObjCOrBuiltinID); 1006 assert(II->isExtensionToken() == ExtensionToken && 1007 "Incorrect extension token flag"); 1008 (void)ExtensionToken; 1009 if (Poisoned) 1010 II->setIsPoisoned(true); 1011 assert(II->isCPlusPlusOperatorKeyword() == CPlusPlusOperatorKeyword && 1012 "Incorrect C++ operator keyword flag"); 1013 (void)CPlusPlusOperatorKeyword; 1014 1015 // If this identifier is a macro, deserialize the macro 1016 // definition. 1017 if (HadMacroDefinition) { 1018 uint32_t MacroDirectivesOffset = 1019 endian::readNext<uint32_t, little, unaligned>(d); 1020 DataLen -= 4; 1021 1022 Reader.addPendingMacro(II, &F, MacroDirectivesOffset); 1023 } 1024 1025 Reader.SetIdentifierInfo(ID, II); 1026 1027 // Read all of the declarations visible at global scope with this 1028 // name. 1029 if (DataLen > 0) { 1030 SmallVector<uint32_t, 4> DeclIDs; 1031 for (; DataLen > 0; DataLen -= 4) 1032 DeclIDs.push_back(Reader.getGlobalDeclID( 1033 F, endian::readNext<uint32_t, little, unaligned>(d))); 1034 Reader.SetGloballyVisibleDecls(II, DeclIDs); 1035 } 1036 1037 return II; 1038 } 1039 1040 DeclarationNameKey::DeclarationNameKey(DeclarationName Name) 1041 : Kind(Name.getNameKind()) { 1042 switch (Kind) { 1043 case DeclarationName::Identifier: 1044 Data = (uint64_t)Name.getAsIdentifierInfo(); 1045 break; 1046 case DeclarationName::ObjCZeroArgSelector: 1047 case DeclarationName::ObjCOneArgSelector: 1048 case DeclarationName::ObjCMultiArgSelector: 1049 Data = (uint64_t)Name.getObjCSelector().getAsOpaquePtr(); 1050 break; 1051 case DeclarationName::CXXOperatorName: 1052 Data = Name.getCXXOverloadedOperator(); 1053 break; 1054 case DeclarationName::CXXLiteralOperatorName: 1055 Data = (uint64_t)Name.getCXXLiteralIdentifier(); 1056 break; 1057 case DeclarationName::CXXDeductionGuideName: 1058 Data = (uint64_t)Name.getCXXDeductionGuideTemplate() 1059 ->getDeclName().getAsIdentifierInfo(); 1060 break; 1061 case DeclarationName::CXXConstructorName: 1062 case DeclarationName::CXXDestructorName: 1063 case DeclarationName::CXXConversionFunctionName: 1064 case DeclarationName::CXXUsingDirective: 1065 Data = 0; 1066 break; 1067 } 1068 } 1069 1070 unsigned DeclarationNameKey::getHash() const { 1071 llvm::FoldingSetNodeID ID; 1072 ID.AddInteger(Kind); 1073 1074 switch (Kind) { 1075 case DeclarationName::Identifier: 1076 case DeclarationName::CXXLiteralOperatorName: 1077 case DeclarationName::CXXDeductionGuideName: 1078 ID.AddString(((IdentifierInfo*)Data)->getName()); 1079 break; 1080 case DeclarationName::ObjCZeroArgSelector: 1081 case DeclarationName::ObjCOneArgSelector: 1082 case DeclarationName::ObjCMultiArgSelector: 1083 ID.AddInteger(serialization::ComputeHash(Selector(Data))); 1084 break; 1085 case DeclarationName::CXXOperatorName: 1086 ID.AddInteger((OverloadedOperatorKind)Data); 1087 break; 1088 case DeclarationName::CXXConstructorName: 1089 case DeclarationName::CXXDestructorName: 1090 case DeclarationName::CXXConversionFunctionName: 1091 case DeclarationName::CXXUsingDirective: 1092 break; 1093 } 1094 1095 return ID.ComputeHash(); 1096 } 1097 1098 ModuleFile * 1099 ASTDeclContextNameLookupTrait::ReadFileRef(const unsigned char *&d) { 1100 using namespace llvm::support; 1101 1102 uint32_t ModuleFileID = endian::readNext<uint32_t, little, unaligned>(d); 1103 return Reader.getLocalModuleFile(F, ModuleFileID); 1104 } 1105 1106 std::pair<unsigned, unsigned> 1107 ASTDeclContextNameLookupTrait::ReadKeyDataLength(const unsigned char *&d) { 1108 return readULEBKeyDataLength(d); 1109 } 1110 1111 ASTDeclContextNameLookupTrait::internal_key_type 1112 ASTDeclContextNameLookupTrait::ReadKey(const unsigned char *d, unsigned) { 1113 using namespace llvm::support; 1114 1115 auto Kind = (DeclarationName::NameKind)*d++; 1116 uint64_t Data; 1117 switch (Kind) { 1118 case DeclarationName::Identifier: 1119 case DeclarationName::CXXLiteralOperatorName: 1120 case DeclarationName::CXXDeductionGuideName: 1121 Data = (uint64_t)Reader.getLocalIdentifier( 1122 F, endian::readNext<uint32_t, little, unaligned>(d)); 1123 break; 1124 case DeclarationName::ObjCZeroArgSelector: 1125 case DeclarationName::ObjCOneArgSelector: 1126 case DeclarationName::ObjCMultiArgSelector: 1127 Data = 1128 (uint64_t)Reader.getLocalSelector( 1129 F, endian::readNext<uint32_t, little, unaligned>( 1130 d)).getAsOpaquePtr(); 1131 break; 1132 case DeclarationName::CXXOperatorName: 1133 Data = *d++; // OverloadedOperatorKind 1134 break; 1135 case DeclarationName::CXXConstructorName: 1136 case DeclarationName::CXXDestructorName: 1137 case DeclarationName::CXXConversionFunctionName: 1138 case DeclarationName::CXXUsingDirective: 1139 Data = 0; 1140 break; 1141 } 1142 1143 return DeclarationNameKey(Kind, Data); 1144 } 1145 1146 void ASTDeclContextNameLookupTrait::ReadDataInto(internal_key_type, 1147 const unsigned char *d, 1148 unsigned DataLen, 1149 data_type_builder &Val) { 1150 using namespace llvm::support; 1151 1152 for (unsigned NumDecls = DataLen / 4; NumDecls; --NumDecls) { 1153 uint32_t LocalID = endian::readNext<uint32_t, little, unaligned>(d); 1154 Val.insert(Reader.getGlobalDeclID(F, LocalID)); 1155 } 1156 } 1157 1158 bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, 1159 BitstreamCursor &Cursor, 1160 uint64_t Offset, 1161 DeclContext *DC) { 1162 assert(Offset != 0); 1163 1164 SavedStreamPosition SavedPosition(Cursor); 1165 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1166 Error(std::move(Err)); 1167 return true; 1168 } 1169 1170 RecordData Record; 1171 StringRef Blob; 1172 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1173 if (!MaybeCode) { 1174 Error(MaybeCode.takeError()); 1175 return true; 1176 } 1177 unsigned Code = MaybeCode.get(); 1178 1179 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1180 if (!MaybeRecCode) { 1181 Error(MaybeRecCode.takeError()); 1182 return true; 1183 } 1184 unsigned RecCode = MaybeRecCode.get(); 1185 if (RecCode != DECL_CONTEXT_LEXICAL) { 1186 Error("Expected lexical block"); 1187 return true; 1188 } 1189 1190 assert(!isa<TranslationUnitDecl>(DC) && 1191 "expected a TU_UPDATE_LEXICAL record for TU"); 1192 // If we are handling a C++ class template instantiation, we can see multiple 1193 // lexical updates for the same record. It's important that we select only one 1194 // of them, so that field numbering works properly. Just pick the first one we 1195 // see. 1196 auto &Lex = LexicalDecls[DC]; 1197 if (!Lex.first) { 1198 Lex = std::make_pair( 1199 &M, llvm::makeArrayRef( 1200 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 1201 Blob.data()), 1202 Blob.size() / 4)); 1203 } 1204 DC->setHasExternalLexicalStorage(true); 1205 return false; 1206 } 1207 1208 bool ASTReader::ReadVisibleDeclContextStorage(ModuleFile &M, 1209 BitstreamCursor &Cursor, 1210 uint64_t Offset, 1211 DeclID ID) { 1212 assert(Offset != 0); 1213 1214 SavedStreamPosition SavedPosition(Cursor); 1215 if (llvm::Error Err = Cursor.JumpToBit(Offset)) { 1216 Error(std::move(Err)); 1217 return true; 1218 } 1219 1220 RecordData Record; 1221 StringRef Blob; 1222 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1223 if (!MaybeCode) { 1224 Error(MaybeCode.takeError()); 1225 return true; 1226 } 1227 unsigned Code = MaybeCode.get(); 1228 1229 Expected<unsigned> MaybeRecCode = Cursor.readRecord(Code, Record, &Blob); 1230 if (!MaybeRecCode) { 1231 Error(MaybeRecCode.takeError()); 1232 return true; 1233 } 1234 unsigned RecCode = MaybeRecCode.get(); 1235 if (RecCode != DECL_CONTEXT_VISIBLE) { 1236 Error("Expected visible lookup table block"); 1237 return true; 1238 } 1239 1240 // We can't safely determine the primary context yet, so delay attaching the 1241 // lookup table until we're done with recursive deserialization. 1242 auto *Data = (const unsigned char*)Blob.data(); 1243 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&M, Data}); 1244 return false; 1245 } 1246 1247 void ASTReader::Error(StringRef Msg) const { 1248 Error(diag::err_fe_pch_malformed, Msg); 1249 if (PP.getLangOpts().Modules && !Diags.isDiagnosticInFlight() && 1250 !PP.getHeaderSearchInfo().getModuleCachePath().empty()) { 1251 Diag(diag::note_module_cache_path) 1252 << PP.getHeaderSearchInfo().getModuleCachePath(); 1253 } 1254 } 1255 1256 void ASTReader::Error(unsigned DiagID, StringRef Arg1, StringRef Arg2, 1257 StringRef Arg3) const { 1258 if (Diags.isDiagnosticInFlight()) 1259 Diags.SetDelayedDiagnostic(DiagID, Arg1, Arg2, Arg3); 1260 else 1261 Diag(DiagID) << Arg1 << Arg2 << Arg3; 1262 } 1263 1264 void ASTReader::Error(llvm::Error &&Err) const { 1265 llvm::Error RemainingErr = 1266 handleErrors(std::move(Err), [this](const DiagnosticError &E) { 1267 auto Diag = E.getDiagnostic().second; 1268 1269 // Ideally we'd just emit it, but have to handle a possible in-flight 1270 // diagnostic. Note that the location is currently ignored as well. 1271 auto NumArgs = Diag.getStorage()->NumDiagArgs; 1272 assert(NumArgs <= 3 && "Can only have up to 3 arguments"); 1273 StringRef Arg1, Arg2, Arg3; 1274 switch (NumArgs) { 1275 case 3: 1276 Arg3 = Diag.getStringArg(2); 1277 LLVM_FALLTHROUGH; 1278 case 2: 1279 Arg2 = Diag.getStringArg(1); 1280 LLVM_FALLTHROUGH; 1281 case 1: 1282 Arg1 = Diag.getStringArg(0); 1283 } 1284 Error(Diag.getDiagID(), Arg1, Arg2, Arg3); 1285 }); 1286 if (RemainingErr) 1287 Error(toString(std::move(RemainingErr))); 1288 } 1289 1290 //===----------------------------------------------------------------------===// 1291 // Source Manager Deserialization 1292 //===----------------------------------------------------------------------===// 1293 1294 /// Read the line table in the source manager block. 1295 void ASTReader::ParseLineTable(ModuleFile &F, const RecordData &Record) { 1296 unsigned Idx = 0; 1297 LineTableInfo &LineTable = SourceMgr.getLineTable(); 1298 1299 // Parse the file names 1300 std::map<int, int> FileIDs; 1301 FileIDs[-1] = -1; // For unspecified filenames. 1302 for (unsigned I = 0; Record[Idx]; ++I) { 1303 // Extract the file name 1304 auto Filename = ReadPath(F, Record, Idx); 1305 FileIDs[I] = LineTable.getLineTableFilenameID(Filename); 1306 } 1307 ++Idx; 1308 1309 // Parse the line entries 1310 std::vector<LineEntry> Entries; 1311 while (Idx < Record.size()) { 1312 int FID = Record[Idx++]; 1313 assert(FID >= 0 && "Serialized line entries for non-local file."); 1314 // Remap FileID from 1-based old view. 1315 FID += F.SLocEntryBaseID - 1; 1316 1317 // Extract the line entries 1318 unsigned NumEntries = Record[Idx++]; 1319 assert(NumEntries && "no line entries for file ID"); 1320 Entries.clear(); 1321 Entries.reserve(NumEntries); 1322 for (unsigned I = 0; I != NumEntries; ++I) { 1323 unsigned FileOffset = Record[Idx++]; 1324 unsigned LineNo = Record[Idx++]; 1325 int FilenameID = FileIDs[Record[Idx++]]; 1326 SrcMgr::CharacteristicKind FileKind 1327 = (SrcMgr::CharacteristicKind)Record[Idx++]; 1328 unsigned IncludeOffset = Record[Idx++]; 1329 Entries.push_back(LineEntry::get(FileOffset, LineNo, FilenameID, 1330 FileKind, IncludeOffset)); 1331 } 1332 LineTable.AddEntry(FileID::get(FID), Entries); 1333 } 1334 } 1335 1336 /// Read a source manager block 1337 llvm::Error ASTReader::ReadSourceManagerBlock(ModuleFile &F) { 1338 using namespace SrcMgr; 1339 1340 BitstreamCursor &SLocEntryCursor = F.SLocEntryCursor; 1341 1342 // Set the source-location entry cursor to the current position in 1343 // the stream. This cursor will be used to read the contents of the 1344 // source manager block initially, and then lazily read 1345 // source-location entries as needed. 1346 SLocEntryCursor = F.Stream; 1347 1348 // The stream itself is going to skip over the source manager block. 1349 if (llvm::Error Err = F.Stream.SkipBlock()) 1350 return Err; 1351 1352 // Enter the source manager block. 1353 if (llvm::Error Err = SLocEntryCursor.EnterSubBlock(SOURCE_MANAGER_BLOCK_ID)) 1354 return Err; 1355 F.SourceManagerBlockStartOffset = SLocEntryCursor.GetCurrentBitNo(); 1356 1357 RecordData Record; 1358 while (true) { 1359 Expected<llvm::BitstreamEntry> MaybeE = 1360 SLocEntryCursor.advanceSkippingSubblocks(); 1361 if (!MaybeE) 1362 return MaybeE.takeError(); 1363 llvm::BitstreamEntry E = MaybeE.get(); 1364 1365 switch (E.Kind) { 1366 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1367 case llvm::BitstreamEntry::Error: 1368 return llvm::createStringError(std::errc::illegal_byte_sequence, 1369 "malformed block record in AST file"); 1370 case llvm::BitstreamEntry::EndBlock: 1371 return llvm::Error::success(); 1372 case llvm::BitstreamEntry::Record: 1373 // The interesting case. 1374 break; 1375 } 1376 1377 // Read a record. 1378 Record.clear(); 1379 StringRef Blob; 1380 Expected<unsigned> MaybeRecord = 1381 SLocEntryCursor.readRecord(E.ID, Record, &Blob); 1382 if (!MaybeRecord) 1383 return MaybeRecord.takeError(); 1384 switch (MaybeRecord.get()) { 1385 default: // Default behavior: ignore. 1386 break; 1387 1388 case SM_SLOC_FILE_ENTRY: 1389 case SM_SLOC_BUFFER_ENTRY: 1390 case SM_SLOC_EXPANSION_ENTRY: 1391 // Once we hit one of the source location entries, we're done. 1392 return llvm::Error::success(); 1393 } 1394 } 1395 } 1396 1397 /// If a header file is not found at the path that we expect it to be 1398 /// and the PCH file was moved from its original location, try to resolve the 1399 /// file by assuming that header+PCH were moved together and the header is in 1400 /// the same place relative to the PCH. 1401 static std::string 1402 resolveFileRelativeToOriginalDir(const std::string &Filename, 1403 const std::string &OriginalDir, 1404 const std::string &CurrDir) { 1405 assert(OriginalDir != CurrDir && 1406 "No point trying to resolve the file if the PCH dir didn't change"); 1407 1408 using namespace llvm::sys; 1409 1410 SmallString<128> filePath(Filename); 1411 fs::make_absolute(filePath); 1412 assert(path::is_absolute(OriginalDir)); 1413 SmallString<128> currPCHPath(CurrDir); 1414 1415 path::const_iterator fileDirI = path::begin(path::parent_path(filePath)), 1416 fileDirE = path::end(path::parent_path(filePath)); 1417 path::const_iterator origDirI = path::begin(OriginalDir), 1418 origDirE = path::end(OriginalDir); 1419 // Skip the common path components from filePath and OriginalDir. 1420 while (fileDirI != fileDirE && origDirI != origDirE && 1421 *fileDirI == *origDirI) { 1422 ++fileDirI; 1423 ++origDirI; 1424 } 1425 for (; origDirI != origDirE; ++origDirI) 1426 path::append(currPCHPath, ".."); 1427 path::append(currPCHPath, fileDirI, fileDirE); 1428 path::append(currPCHPath, path::filename(Filename)); 1429 return std::string(currPCHPath.str()); 1430 } 1431 1432 bool ASTReader::ReadSLocEntry(int ID) { 1433 if (ID == 0) 1434 return false; 1435 1436 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1437 Error("source location entry ID out-of-range for AST file"); 1438 return true; 1439 } 1440 1441 // Local helper to read the (possibly-compressed) buffer data following the 1442 // entry record. 1443 auto ReadBuffer = [this]( 1444 BitstreamCursor &SLocEntryCursor, 1445 StringRef Name) -> std::unique_ptr<llvm::MemoryBuffer> { 1446 RecordData Record; 1447 StringRef Blob; 1448 Expected<unsigned> MaybeCode = SLocEntryCursor.ReadCode(); 1449 if (!MaybeCode) { 1450 Error(MaybeCode.takeError()); 1451 return nullptr; 1452 } 1453 unsigned Code = MaybeCode.get(); 1454 1455 Expected<unsigned> MaybeRecCode = 1456 SLocEntryCursor.readRecord(Code, Record, &Blob); 1457 if (!MaybeRecCode) { 1458 Error(MaybeRecCode.takeError()); 1459 return nullptr; 1460 } 1461 unsigned RecCode = MaybeRecCode.get(); 1462 1463 if (RecCode == SM_SLOC_BUFFER_BLOB_COMPRESSED) { 1464 if (!llvm::zlib::isAvailable()) { 1465 Error("zlib is not available"); 1466 return nullptr; 1467 } 1468 SmallString<0> Uncompressed; 1469 if (llvm::Error E = 1470 llvm::zlib::uncompress(Blob, Uncompressed, Record[0])) { 1471 Error("could not decompress embedded file contents: " + 1472 llvm::toString(std::move(E))); 1473 return nullptr; 1474 } 1475 return llvm::MemoryBuffer::getMemBufferCopy(Uncompressed, Name); 1476 } else if (RecCode == SM_SLOC_BUFFER_BLOB) { 1477 return llvm::MemoryBuffer::getMemBuffer(Blob.drop_back(1), Name, true); 1478 } else { 1479 Error("AST record has invalid code"); 1480 return nullptr; 1481 } 1482 }; 1483 1484 ModuleFile *F = GlobalSLocEntryMap.find(-ID)->second; 1485 if (llvm::Error Err = F->SLocEntryCursor.JumpToBit( 1486 F->SLocEntryOffsetsBase + 1487 F->SLocEntryOffsets[ID - F->SLocEntryBaseID])) { 1488 Error(std::move(Err)); 1489 return true; 1490 } 1491 1492 BitstreamCursor &SLocEntryCursor = F->SLocEntryCursor; 1493 SourceLocation::UIntTy BaseOffset = F->SLocEntryBaseOffset; 1494 1495 ++NumSLocEntriesRead; 1496 Expected<llvm::BitstreamEntry> MaybeEntry = SLocEntryCursor.advance(); 1497 if (!MaybeEntry) { 1498 Error(MaybeEntry.takeError()); 1499 return true; 1500 } 1501 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1502 1503 if (Entry.Kind != llvm::BitstreamEntry::Record) { 1504 Error("incorrectly-formatted source location entry in AST file"); 1505 return true; 1506 } 1507 1508 RecordData Record; 1509 StringRef Blob; 1510 Expected<unsigned> MaybeSLOC = 1511 SLocEntryCursor.readRecord(Entry.ID, Record, &Blob); 1512 if (!MaybeSLOC) { 1513 Error(MaybeSLOC.takeError()); 1514 return true; 1515 } 1516 switch (MaybeSLOC.get()) { 1517 default: 1518 Error("incorrectly-formatted source location entry in AST file"); 1519 return true; 1520 1521 case SM_SLOC_FILE_ENTRY: { 1522 // We will detect whether a file changed and return 'Failure' for it, but 1523 // we will also try to fail gracefully by setting up the SLocEntry. 1524 unsigned InputID = Record[4]; 1525 InputFile IF = getInputFile(*F, InputID); 1526 Optional<FileEntryRef> File = IF.getFile(); 1527 bool OverriddenBuffer = IF.isOverridden(); 1528 1529 // Note that we only check if a File was returned. If it was out-of-date 1530 // we have complained but we will continue creating a FileID to recover 1531 // gracefully. 1532 if (!File) 1533 return true; 1534 1535 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1536 if (IncludeLoc.isInvalid() && F->Kind != MK_MainFile) { 1537 // This is the module's main file. 1538 IncludeLoc = getImportLocation(F); 1539 } 1540 SrcMgr::CharacteristicKind 1541 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1542 FileID FID = SourceMgr.createFileID(*File, IncludeLoc, FileCharacter, ID, 1543 BaseOffset + Record[0]); 1544 SrcMgr::FileInfo &FileInfo = 1545 const_cast<SrcMgr::FileInfo&>(SourceMgr.getSLocEntry(FID).getFile()); 1546 FileInfo.NumCreatedFIDs = Record[5]; 1547 if (Record[3]) 1548 FileInfo.setHasLineDirectives(); 1549 1550 unsigned NumFileDecls = Record[7]; 1551 if (NumFileDecls && ContextObj) { 1552 const DeclID *FirstDecl = F->FileSortedDecls + Record[6]; 1553 assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); 1554 FileDeclIDs[FID] = FileDeclsInfo(F, llvm::makeArrayRef(FirstDecl, 1555 NumFileDecls)); 1556 } 1557 1558 const SrcMgr::ContentCache &ContentCache = 1559 SourceMgr.getOrCreateContentCache(*File, isSystem(FileCharacter)); 1560 if (OverriddenBuffer && !ContentCache.BufferOverridden && 1561 ContentCache.ContentsEntry == ContentCache.OrigEntry && 1562 !ContentCache.getBufferIfLoaded()) { 1563 auto Buffer = ReadBuffer(SLocEntryCursor, File->getName()); 1564 if (!Buffer) 1565 return true; 1566 SourceMgr.overrideFileContents(*File, std::move(Buffer)); 1567 } 1568 1569 break; 1570 } 1571 1572 case SM_SLOC_BUFFER_ENTRY: { 1573 const char *Name = Blob.data(); 1574 unsigned Offset = Record[0]; 1575 SrcMgr::CharacteristicKind 1576 FileCharacter = (SrcMgr::CharacteristicKind)Record[2]; 1577 SourceLocation IncludeLoc = ReadSourceLocation(*F, Record[1]); 1578 if (IncludeLoc.isInvalid() && F->isModule()) { 1579 IncludeLoc = getImportLocation(F); 1580 } 1581 1582 auto Buffer = ReadBuffer(SLocEntryCursor, Name); 1583 if (!Buffer) 1584 return true; 1585 SourceMgr.createFileID(std::move(Buffer), FileCharacter, ID, 1586 BaseOffset + Offset, IncludeLoc); 1587 break; 1588 } 1589 1590 case SM_SLOC_EXPANSION_ENTRY: { 1591 SourceLocation SpellingLoc = ReadSourceLocation(*F, Record[1]); 1592 SourceMgr.createExpansionLoc(SpellingLoc, 1593 ReadSourceLocation(*F, Record[2]), 1594 ReadSourceLocation(*F, Record[3]), 1595 Record[5], 1596 Record[4], 1597 ID, 1598 BaseOffset + Record[0]); 1599 break; 1600 } 1601 } 1602 1603 return false; 1604 } 1605 1606 std::pair<SourceLocation, StringRef> ASTReader::getModuleImportLoc(int ID) { 1607 if (ID == 0) 1608 return std::make_pair(SourceLocation(), ""); 1609 1610 if (unsigned(-ID) - 2 >= getTotalNumSLocs() || ID > 0) { 1611 Error("source location entry ID out-of-range for AST file"); 1612 return std::make_pair(SourceLocation(), ""); 1613 } 1614 1615 // Find which module file this entry lands in. 1616 ModuleFile *M = GlobalSLocEntryMap.find(-ID)->second; 1617 if (!M->isModule()) 1618 return std::make_pair(SourceLocation(), ""); 1619 1620 // FIXME: Can we map this down to a particular submodule? That would be 1621 // ideal. 1622 return std::make_pair(M->ImportLoc, StringRef(M->ModuleName)); 1623 } 1624 1625 /// Find the location where the module F is imported. 1626 SourceLocation ASTReader::getImportLocation(ModuleFile *F) { 1627 if (F->ImportLoc.isValid()) 1628 return F->ImportLoc; 1629 1630 // Otherwise we have a PCH. It's considered to be "imported" at the first 1631 // location of its includer. 1632 if (F->ImportedBy.empty() || !F->ImportedBy[0]) { 1633 // Main file is the importer. 1634 assert(SourceMgr.getMainFileID().isValid() && "missing main file"); 1635 return SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1636 } 1637 return F->ImportedBy[0]->FirstLoc; 1638 } 1639 1640 /// Enter a subblock of the specified BlockID with the specified cursor. Read 1641 /// the abbreviations that are at the top of the block and then leave the cursor 1642 /// pointing into the block. 1643 llvm::Error ASTReader::ReadBlockAbbrevs(BitstreamCursor &Cursor, 1644 unsigned BlockID, 1645 uint64_t *StartOfBlockOffset) { 1646 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) 1647 return Err; 1648 1649 if (StartOfBlockOffset) 1650 *StartOfBlockOffset = Cursor.GetCurrentBitNo(); 1651 1652 while (true) { 1653 uint64_t Offset = Cursor.GetCurrentBitNo(); 1654 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 1655 if (!MaybeCode) 1656 return MaybeCode.takeError(); 1657 unsigned Code = MaybeCode.get(); 1658 1659 // We expect all abbrevs to be at the start of the block. 1660 if (Code != llvm::bitc::DEFINE_ABBREV) { 1661 if (llvm::Error Err = Cursor.JumpToBit(Offset)) 1662 return Err; 1663 return llvm::Error::success(); 1664 } 1665 if (llvm::Error Err = Cursor.ReadAbbrevRecord()) 1666 return Err; 1667 } 1668 } 1669 1670 Token ASTReader::ReadToken(ModuleFile &F, const RecordDataImpl &Record, 1671 unsigned &Idx) { 1672 Token Tok; 1673 Tok.startToken(); 1674 Tok.setLocation(ReadSourceLocation(F, Record, Idx)); 1675 Tok.setLength(Record[Idx++]); 1676 if (IdentifierInfo *II = getLocalIdentifier(F, Record[Idx++])) 1677 Tok.setIdentifierInfo(II); 1678 Tok.setKind((tok::TokenKind)Record[Idx++]); 1679 Tok.setFlag((Token::TokenFlags)Record[Idx++]); 1680 return Tok; 1681 } 1682 1683 MacroInfo *ASTReader::ReadMacroRecord(ModuleFile &F, uint64_t Offset) { 1684 BitstreamCursor &Stream = F.MacroCursor; 1685 1686 // Keep track of where we are in the stream, then jump back there 1687 // after reading this macro. 1688 SavedStreamPosition SavedPosition(Stream); 1689 1690 if (llvm::Error Err = Stream.JumpToBit(Offset)) { 1691 // FIXME this drops errors on the floor. 1692 consumeError(std::move(Err)); 1693 return nullptr; 1694 } 1695 RecordData Record; 1696 SmallVector<IdentifierInfo*, 16> MacroParams; 1697 MacroInfo *Macro = nullptr; 1698 1699 while (true) { 1700 // Advance to the next record, but if we get to the end of the block, don't 1701 // pop it (removing all the abbreviations from the cursor) since we want to 1702 // be able to reseek within the block and read entries. 1703 unsigned Flags = BitstreamCursor::AF_DontPopBlockAtEnd; 1704 Expected<llvm::BitstreamEntry> MaybeEntry = 1705 Stream.advanceSkippingSubblocks(Flags); 1706 if (!MaybeEntry) { 1707 Error(MaybeEntry.takeError()); 1708 return Macro; 1709 } 1710 llvm::BitstreamEntry Entry = MaybeEntry.get(); 1711 1712 switch (Entry.Kind) { 1713 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1714 case llvm::BitstreamEntry::Error: 1715 Error("malformed block record in AST file"); 1716 return Macro; 1717 case llvm::BitstreamEntry::EndBlock: 1718 return Macro; 1719 case llvm::BitstreamEntry::Record: 1720 // The interesting case. 1721 break; 1722 } 1723 1724 // Read a record. 1725 Record.clear(); 1726 PreprocessorRecordTypes RecType; 1727 if (Expected<unsigned> MaybeRecType = Stream.readRecord(Entry.ID, Record)) 1728 RecType = (PreprocessorRecordTypes)MaybeRecType.get(); 1729 else { 1730 Error(MaybeRecType.takeError()); 1731 return Macro; 1732 } 1733 switch (RecType) { 1734 case PP_MODULE_MACRO: 1735 case PP_MACRO_DIRECTIVE_HISTORY: 1736 return Macro; 1737 1738 case PP_MACRO_OBJECT_LIKE: 1739 case PP_MACRO_FUNCTION_LIKE: { 1740 // If we already have a macro, that means that we've hit the end 1741 // of the definition of the macro we were looking for. We're 1742 // done. 1743 if (Macro) 1744 return Macro; 1745 1746 unsigned NextIndex = 1; // Skip identifier ID. 1747 SourceLocation Loc = ReadSourceLocation(F, Record, NextIndex); 1748 MacroInfo *MI = PP.AllocateMacroInfo(Loc); 1749 MI->setDefinitionEndLoc(ReadSourceLocation(F, Record, NextIndex)); 1750 MI->setIsUsed(Record[NextIndex++]); 1751 MI->setUsedForHeaderGuard(Record[NextIndex++]); 1752 1753 if (RecType == PP_MACRO_FUNCTION_LIKE) { 1754 // Decode function-like macro info. 1755 bool isC99VarArgs = Record[NextIndex++]; 1756 bool isGNUVarArgs = Record[NextIndex++]; 1757 bool hasCommaPasting = Record[NextIndex++]; 1758 MacroParams.clear(); 1759 unsigned NumArgs = Record[NextIndex++]; 1760 for (unsigned i = 0; i != NumArgs; ++i) 1761 MacroParams.push_back(getLocalIdentifier(F, Record[NextIndex++])); 1762 1763 // Install function-like macro info. 1764 MI->setIsFunctionLike(); 1765 if (isC99VarArgs) MI->setIsC99Varargs(); 1766 if (isGNUVarArgs) MI->setIsGNUVarargs(); 1767 if (hasCommaPasting) MI->setHasCommaPasting(); 1768 MI->setParameterList(MacroParams, PP.getPreprocessorAllocator()); 1769 } 1770 1771 // Remember that we saw this macro last so that we add the tokens that 1772 // form its body to it. 1773 Macro = MI; 1774 1775 if (NextIndex + 1 == Record.size() && PP.getPreprocessingRecord() && 1776 Record[NextIndex]) { 1777 // We have a macro definition. Register the association 1778 PreprocessedEntityID 1779 GlobalID = getGlobalPreprocessedEntityID(F, Record[NextIndex]); 1780 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 1781 PreprocessingRecord::PPEntityID PPID = 1782 PPRec.getPPEntityID(GlobalID - 1, /*isLoaded=*/true); 1783 MacroDefinitionRecord *PPDef = cast_or_null<MacroDefinitionRecord>( 1784 PPRec.getPreprocessedEntity(PPID)); 1785 if (PPDef) 1786 PPRec.RegisterMacroDefinition(Macro, PPDef); 1787 } 1788 1789 ++NumMacrosRead; 1790 break; 1791 } 1792 1793 case PP_TOKEN: { 1794 // If we see a TOKEN before a PP_MACRO_*, then the file is 1795 // erroneous, just pretend we didn't see this. 1796 if (!Macro) break; 1797 1798 unsigned Idx = 0; 1799 Token Tok = ReadToken(F, Record, Idx); 1800 Macro->AddTokenToBody(Tok); 1801 break; 1802 } 1803 } 1804 } 1805 } 1806 1807 PreprocessedEntityID 1808 ASTReader::getGlobalPreprocessedEntityID(ModuleFile &M, 1809 unsigned LocalID) const { 1810 if (!M.ModuleOffsetMap.empty()) 1811 ReadModuleOffsetMap(M); 1812 1813 ContinuousRangeMap<uint32_t, int, 2>::const_iterator 1814 I = M.PreprocessedEntityRemap.find(LocalID - NUM_PREDEF_PP_ENTITY_IDS); 1815 assert(I != M.PreprocessedEntityRemap.end() 1816 && "Invalid index into preprocessed entity index remap"); 1817 1818 return LocalID + I->second; 1819 } 1820 1821 unsigned HeaderFileInfoTrait::ComputeHash(internal_key_ref ikey) { 1822 return llvm::hash_combine(ikey.Size, ikey.ModTime); 1823 } 1824 1825 HeaderFileInfoTrait::internal_key_type 1826 HeaderFileInfoTrait::GetInternalKey(const FileEntry *FE) { 1827 internal_key_type ikey = {FE->getSize(), 1828 M.HasTimestamps ? FE->getModificationTime() : 0, 1829 FE->getName(), /*Imported*/ false}; 1830 return ikey; 1831 } 1832 1833 bool HeaderFileInfoTrait::EqualKey(internal_key_ref a, internal_key_ref b) { 1834 if (a.Size != b.Size || (a.ModTime && b.ModTime && a.ModTime != b.ModTime)) 1835 return false; 1836 1837 if (llvm::sys::path::is_absolute(a.Filename) && a.Filename == b.Filename) 1838 return true; 1839 1840 // Determine whether the actual files are equivalent. 1841 FileManager &FileMgr = Reader.getFileManager(); 1842 auto GetFile = [&](const internal_key_type &Key) -> const FileEntry* { 1843 if (!Key.Imported) { 1844 if (auto File = FileMgr.getFile(Key.Filename)) 1845 return *File; 1846 return nullptr; 1847 } 1848 1849 std::string Resolved = std::string(Key.Filename); 1850 Reader.ResolveImportedPath(M, Resolved); 1851 if (auto File = FileMgr.getFile(Resolved)) 1852 return *File; 1853 return nullptr; 1854 }; 1855 1856 const FileEntry *FEA = GetFile(a); 1857 const FileEntry *FEB = GetFile(b); 1858 return FEA && FEA == FEB; 1859 } 1860 1861 std::pair<unsigned, unsigned> 1862 HeaderFileInfoTrait::ReadKeyDataLength(const unsigned char*& d) { 1863 return readULEBKeyDataLength(d); 1864 } 1865 1866 HeaderFileInfoTrait::internal_key_type 1867 HeaderFileInfoTrait::ReadKey(const unsigned char *d, unsigned) { 1868 using namespace llvm::support; 1869 1870 internal_key_type ikey; 1871 ikey.Size = off_t(endian::readNext<uint64_t, little, unaligned>(d)); 1872 ikey.ModTime = time_t(endian::readNext<uint64_t, little, unaligned>(d)); 1873 ikey.Filename = (const char *)d; 1874 ikey.Imported = true; 1875 return ikey; 1876 } 1877 1878 HeaderFileInfoTrait::data_type 1879 HeaderFileInfoTrait::ReadData(internal_key_ref key, const unsigned char *d, 1880 unsigned DataLen) { 1881 using namespace llvm::support; 1882 1883 const unsigned char *End = d + DataLen; 1884 HeaderFileInfo HFI; 1885 unsigned Flags = *d++; 1886 // FIXME: Refactor with mergeHeaderFileInfo in HeaderSearch.cpp. 1887 HFI.isImport |= (Flags >> 5) & 0x01; 1888 HFI.isPragmaOnce |= (Flags >> 4) & 0x01; 1889 HFI.DirInfo = (Flags >> 1) & 0x07; 1890 HFI.IndexHeaderMapHeader = Flags & 0x01; 1891 // FIXME: Find a better way to handle this. Maybe just store a 1892 // "has been included" flag? 1893 HFI.NumIncludes = std::max(endian::readNext<uint16_t, little, unaligned>(d), 1894 HFI.NumIncludes); 1895 HFI.ControllingMacroID = Reader.getGlobalIdentifierID( 1896 M, endian::readNext<uint32_t, little, unaligned>(d)); 1897 if (unsigned FrameworkOffset = 1898 endian::readNext<uint32_t, little, unaligned>(d)) { 1899 // The framework offset is 1 greater than the actual offset, 1900 // since 0 is used as an indicator for "no framework name". 1901 StringRef FrameworkName(FrameworkStrings + FrameworkOffset - 1); 1902 HFI.Framework = HS->getUniqueFrameworkName(FrameworkName); 1903 } 1904 1905 assert((End - d) % 4 == 0 && 1906 "Wrong data length in HeaderFileInfo deserialization"); 1907 while (d != End) { 1908 uint32_t LocalSMID = endian::readNext<uint32_t, little, unaligned>(d); 1909 auto HeaderRole = static_cast<ModuleMap::ModuleHeaderRole>(LocalSMID & 3); 1910 LocalSMID >>= 2; 1911 1912 // This header is part of a module. Associate it with the module to enable 1913 // implicit module import. 1914 SubmoduleID GlobalSMID = Reader.getGlobalSubmoduleID(M, LocalSMID); 1915 Module *Mod = Reader.getSubmodule(GlobalSMID); 1916 FileManager &FileMgr = Reader.getFileManager(); 1917 ModuleMap &ModMap = 1918 Reader.getPreprocessor().getHeaderSearchInfo().getModuleMap(); 1919 1920 std::string Filename = std::string(key.Filename); 1921 if (key.Imported) 1922 Reader.ResolveImportedPath(M, Filename); 1923 // FIXME: NameAsWritten 1924 Module::Header H = {std::string(key.Filename), "", 1925 *FileMgr.getFile(Filename)}; 1926 ModMap.addHeader(Mod, H, HeaderRole, /*Imported*/true); 1927 HFI.isModuleHeader |= !(HeaderRole & ModuleMap::TextualHeader); 1928 } 1929 1930 // This HeaderFileInfo was externally loaded. 1931 HFI.External = true; 1932 HFI.IsValid = true; 1933 return HFI; 1934 } 1935 1936 void ASTReader::addPendingMacro(IdentifierInfo *II, ModuleFile *M, 1937 uint32_t MacroDirectivesOffset) { 1938 assert(NumCurrentElementsDeserializing > 0 &&"Missing deserialization guard"); 1939 PendingMacroIDs[II].push_back(PendingMacroInfo(M, MacroDirectivesOffset)); 1940 } 1941 1942 void ASTReader::ReadDefinedMacros() { 1943 // Note that we are loading defined macros. 1944 Deserializing Macros(this); 1945 1946 for (ModuleFile &I : llvm::reverse(ModuleMgr)) { 1947 BitstreamCursor &MacroCursor = I.MacroCursor; 1948 1949 // If there was no preprocessor block, skip this file. 1950 if (MacroCursor.getBitcodeBytes().empty()) 1951 continue; 1952 1953 BitstreamCursor Cursor = MacroCursor; 1954 if (llvm::Error Err = Cursor.JumpToBit(I.MacroStartOffset)) { 1955 Error(std::move(Err)); 1956 return; 1957 } 1958 1959 RecordData Record; 1960 while (true) { 1961 Expected<llvm::BitstreamEntry> MaybeE = Cursor.advanceSkippingSubblocks(); 1962 if (!MaybeE) { 1963 Error(MaybeE.takeError()); 1964 return; 1965 } 1966 llvm::BitstreamEntry E = MaybeE.get(); 1967 1968 switch (E.Kind) { 1969 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 1970 case llvm::BitstreamEntry::Error: 1971 Error("malformed block record in AST file"); 1972 return; 1973 case llvm::BitstreamEntry::EndBlock: 1974 goto NextCursor; 1975 1976 case llvm::BitstreamEntry::Record: { 1977 Record.clear(); 1978 Expected<unsigned> MaybeRecord = Cursor.readRecord(E.ID, Record); 1979 if (!MaybeRecord) { 1980 Error(MaybeRecord.takeError()); 1981 return; 1982 } 1983 switch (MaybeRecord.get()) { 1984 default: // Default behavior: ignore. 1985 break; 1986 1987 case PP_MACRO_OBJECT_LIKE: 1988 case PP_MACRO_FUNCTION_LIKE: { 1989 IdentifierInfo *II = getLocalIdentifier(I, Record[0]); 1990 if (II->isOutOfDate()) 1991 updateOutOfDateIdentifier(*II); 1992 break; 1993 } 1994 1995 case PP_TOKEN: 1996 // Ignore tokens. 1997 break; 1998 } 1999 break; 2000 } 2001 } 2002 } 2003 NextCursor: ; 2004 } 2005 } 2006 2007 namespace { 2008 2009 /// Visitor class used to look up identifirs in an AST file. 2010 class IdentifierLookupVisitor { 2011 StringRef Name; 2012 unsigned NameHash; 2013 unsigned PriorGeneration; 2014 unsigned &NumIdentifierLookups; 2015 unsigned &NumIdentifierLookupHits; 2016 IdentifierInfo *Found = nullptr; 2017 2018 public: 2019 IdentifierLookupVisitor(StringRef Name, unsigned PriorGeneration, 2020 unsigned &NumIdentifierLookups, 2021 unsigned &NumIdentifierLookupHits) 2022 : Name(Name), NameHash(ASTIdentifierLookupTrait::ComputeHash(Name)), 2023 PriorGeneration(PriorGeneration), 2024 NumIdentifierLookups(NumIdentifierLookups), 2025 NumIdentifierLookupHits(NumIdentifierLookupHits) {} 2026 2027 bool operator()(ModuleFile &M) { 2028 // If we've already searched this module file, skip it now. 2029 if (M.Generation <= PriorGeneration) 2030 return true; 2031 2032 ASTIdentifierLookupTable *IdTable 2033 = (ASTIdentifierLookupTable *)M.IdentifierLookupTable; 2034 if (!IdTable) 2035 return false; 2036 2037 ASTIdentifierLookupTrait Trait(IdTable->getInfoObj().getReader(), M, 2038 Found); 2039 ++NumIdentifierLookups; 2040 ASTIdentifierLookupTable::iterator Pos = 2041 IdTable->find_hashed(Name, NameHash, &Trait); 2042 if (Pos == IdTable->end()) 2043 return false; 2044 2045 // Dereferencing the iterator has the effect of building the 2046 // IdentifierInfo node and populating it with the various 2047 // declarations it needs. 2048 ++NumIdentifierLookupHits; 2049 Found = *Pos; 2050 return true; 2051 } 2052 2053 // Retrieve the identifier info found within the module 2054 // files. 2055 IdentifierInfo *getIdentifierInfo() const { return Found; } 2056 }; 2057 2058 } // namespace 2059 2060 void ASTReader::updateOutOfDateIdentifier(IdentifierInfo &II) { 2061 // Note that we are loading an identifier. 2062 Deserializing AnIdentifier(this); 2063 2064 unsigned PriorGeneration = 0; 2065 if (getContext().getLangOpts().Modules) 2066 PriorGeneration = IdentifierGeneration[&II]; 2067 2068 // If there is a global index, look there first to determine which modules 2069 // provably do not have any results for this identifier. 2070 GlobalModuleIndex::HitSet Hits; 2071 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 2072 if (!loadGlobalIndex()) { 2073 if (GlobalIndex->lookupIdentifier(II.getName(), Hits)) { 2074 HitsPtr = &Hits; 2075 } 2076 } 2077 2078 IdentifierLookupVisitor Visitor(II.getName(), PriorGeneration, 2079 NumIdentifierLookups, 2080 NumIdentifierLookupHits); 2081 ModuleMgr.visit(Visitor, HitsPtr); 2082 markIdentifierUpToDate(&II); 2083 } 2084 2085 void ASTReader::markIdentifierUpToDate(IdentifierInfo *II) { 2086 if (!II) 2087 return; 2088 2089 II->setOutOfDate(false); 2090 2091 // Update the generation for this identifier. 2092 if (getContext().getLangOpts().Modules) 2093 IdentifierGeneration[II] = getGeneration(); 2094 } 2095 2096 void ASTReader::resolvePendingMacro(IdentifierInfo *II, 2097 const PendingMacroInfo &PMInfo) { 2098 ModuleFile &M = *PMInfo.M; 2099 2100 BitstreamCursor &Cursor = M.MacroCursor; 2101 SavedStreamPosition SavedPosition(Cursor); 2102 if (llvm::Error Err = 2103 Cursor.JumpToBit(M.MacroOffsetsBase + PMInfo.MacroDirectivesOffset)) { 2104 Error(std::move(Err)); 2105 return; 2106 } 2107 2108 struct ModuleMacroRecord { 2109 SubmoduleID SubModID; 2110 MacroInfo *MI; 2111 SmallVector<SubmoduleID, 8> Overrides; 2112 }; 2113 llvm::SmallVector<ModuleMacroRecord, 8> ModuleMacros; 2114 2115 // We expect to see a sequence of PP_MODULE_MACRO records listing exported 2116 // macros, followed by a PP_MACRO_DIRECTIVE_HISTORY record with the complete 2117 // macro histroy. 2118 RecordData Record; 2119 while (true) { 2120 Expected<llvm::BitstreamEntry> MaybeEntry = 2121 Cursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 2122 if (!MaybeEntry) { 2123 Error(MaybeEntry.takeError()); 2124 return; 2125 } 2126 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2127 2128 if (Entry.Kind != llvm::BitstreamEntry::Record) { 2129 Error("malformed block record in AST file"); 2130 return; 2131 } 2132 2133 Record.clear(); 2134 Expected<unsigned> MaybePP = Cursor.readRecord(Entry.ID, Record); 2135 if (!MaybePP) { 2136 Error(MaybePP.takeError()); 2137 return; 2138 } 2139 switch ((PreprocessorRecordTypes)MaybePP.get()) { 2140 case PP_MACRO_DIRECTIVE_HISTORY: 2141 break; 2142 2143 case PP_MODULE_MACRO: { 2144 ModuleMacros.push_back(ModuleMacroRecord()); 2145 auto &Info = ModuleMacros.back(); 2146 Info.SubModID = getGlobalSubmoduleID(M, Record[0]); 2147 Info.MI = getMacro(getGlobalMacroID(M, Record[1])); 2148 for (int I = 2, N = Record.size(); I != N; ++I) 2149 Info.Overrides.push_back(getGlobalSubmoduleID(M, Record[I])); 2150 continue; 2151 } 2152 2153 default: 2154 Error("malformed block record in AST file"); 2155 return; 2156 } 2157 2158 // We found the macro directive history; that's the last record 2159 // for this macro. 2160 break; 2161 } 2162 2163 // Module macros are listed in reverse dependency order. 2164 { 2165 std::reverse(ModuleMacros.begin(), ModuleMacros.end()); 2166 llvm::SmallVector<ModuleMacro*, 8> Overrides; 2167 for (auto &MMR : ModuleMacros) { 2168 Overrides.clear(); 2169 for (unsigned ModID : MMR.Overrides) { 2170 Module *Mod = getSubmodule(ModID); 2171 auto *Macro = PP.getModuleMacro(Mod, II); 2172 assert(Macro && "missing definition for overridden macro"); 2173 Overrides.push_back(Macro); 2174 } 2175 2176 bool Inserted = false; 2177 Module *Owner = getSubmodule(MMR.SubModID); 2178 PP.addModuleMacro(Owner, II, MMR.MI, Overrides, Inserted); 2179 } 2180 } 2181 2182 // Don't read the directive history for a module; we don't have anywhere 2183 // to put it. 2184 if (M.isModule()) 2185 return; 2186 2187 // Deserialize the macro directives history in reverse source-order. 2188 MacroDirective *Latest = nullptr, *Earliest = nullptr; 2189 unsigned Idx = 0, N = Record.size(); 2190 while (Idx < N) { 2191 MacroDirective *MD = nullptr; 2192 SourceLocation Loc = ReadSourceLocation(M, Record, Idx); 2193 MacroDirective::Kind K = (MacroDirective::Kind)Record[Idx++]; 2194 switch (K) { 2195 case MacroDirective::MD_Define: { 2196 MacroInfo *MI = getMacro(getGlobalMacroID(M, Record[Idx++])); 2197 MD = PP.AllocateDefMacroDirective(MI, Loc); 2198 break; 2199 } 2200 case MacroDirective::MD_Undefine: 2201 MD = PP.AllocateUndefMacroDirective(Loc); 2202 break; 2203 case MacroDirective::MD_Visibility: 2204 bool isPublic = Record[Idx++]; 2205 MD = PP.AllocateVisibilityMacroDirective(Loc, isPublic); 2206 break; 2207 } 2208 2209 if (!Latest) 2210 Latest = MD; 2211 if (Earliest) 2212 Earliest->setPrevious(MD); 2213 Earliest = MD; 2214 } 2215 2216 if (Latest) 2217 PP.setLoadedMacroDirective(II, Earliest, Latest); 2218 } 2219 2220 bool ASTReader::shouldDisableValidationForFile( 2221 const serialization::ModuleFile &M) const { 2222 if (DisableValidationKind == DisableValidationForModuleKind::None) 2223 return false; 2224 2225 // If a PCH is loaded and validation is disabled for PCH then disable 2226 // validation for the PCH and the modules it loads. 2227 ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind); 2228 2229 switch (K) { 2230 case MK_MainFile: 2231 case MK_Preamble: 2232 case MK_PCH: 2233 return bool(DisableValidationKind & DisableValidationForModuleKind::PCH); 2234 case MK_ImplicitModule: 2235 case MK_ExplicitModule: 2236 case MK_PrebuiltModule: 2237 return bool(DisableValidationKind & DisableValidationForModuleKind::Module); 2238 } 2239 2240 return false; 2241 } 2242 2243 ASTReader::InputFileInfo 2244 ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) { 2245 // Go find this input file. 2246 BitstreamCursor &Cursor = F.InputFilesCursor; 2247 SavedStreamPosition SavedPosition(Cursor); 2248 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2249 // FIXME this drops errors on the floor. 2250 consumeError(std::move(Err)); 2251 } 2252 2253 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 2254 if (!MaybeCode) { 2255 // FIXME this drops errors on the floor. 2256 consumeError(MaybeCode.takeError()); 2257 } 2258 unsigned Code = MaybeCode.get(); 2259 RecordData Record; 2260 StringRef Blob; 2261 2262 if (Expected<unsigned> Maybe = Cursor.readRecord(Code, Record, &Blob)) 2263 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE && 2264 "invalid record type for input file"); 2265 else { 2266 // FIXME this drops errors on the floor. 2267 consumeError(Maybe.takeError()); 2268 } 2269 2270 assert(Record[0] == ID && "Bogus stored ID or offset"); 2271 InputFileInfo R; 2272 R.StoredSize = static_cast<off_t>(Record[1]); 2273 R.StoredTime = static_cast<time_t>(Record[2]); 2274 R.Overridden = static_cast<bool>(Record[3]); 2275 R.Transient = static_cast<bool>(Record[4]); 2276 R.TopLevelModuleMap = static_cast<bool>(Record[5]); 2277 R.Filename = std::string(Blob); 2278 ResolveImportedPath(F, R.Filename); 2279 2280 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 2281 if (!MaybeEntry) // FIXME this drops errors on the floor. 2282 consumeError(MaybeEntry.takeError()); 2283 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2284 assert(Entry.Kind == llvm::BitstreamEntry::Record && 2285 "expected record type for input file hash"); 2286 2287 Record.clear(); 2288 if (Expected<unsigned> Maybe = Cursor.readRecord(Entry.ID, Record)) 2289 assert(static_cast<InputFileRecordTypes>(Maybe.get()) == INPUT_FILE_HASH && 2290 "invalid record type for input file hash"); 2291 else { 2292 // FIXME this drops errors on the floor. 2293 consumeError(Maybe.takeError()); 2294 } 2295 R.ContentHash = (static_cast<uint64_t>(Record[1]) << 32) | 2296 static_cast<uint64_t>(Record[0]); 2297 return R; 2298 } 2299 2300 static unsigned moduleKindForDiagnostic(ModuleKind Kind); 2301 InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) { 2302 // If this ID is bogus, just return an empty input file. 2303 if (ID == 0 || ID > F.InputFilesLoaded.size()) 2304 return InputFile(); 2305 2306 // If we've already loaded this input file, return it. 2307 if (F.InputFilesLoaded[ID-1].getFile()) 2308 return F.InputFilesLoaded[ID-1]; 2309 2310 if (F.InputFilesLoaded[ID-1].isNotFound()) 2311 return InputFile(); 2312 2313 // Go find this input file. 2314 BitstreamCursor &Cursor = F.InputFilesCursor; 2315 SavedStreamPosition SavedPosition(Cursor); 2316 if (llvm::Error Err = Cursor.JumpToBit(F.InputFileOffsets[ID - 1])) { 2317 // FIXME this drops errors on the floor. 2318 consumeError(std::move(Err)); 2319 } 2320 2321 InputFileInfo FI = readInputFileInfo(F, ID); 2322 off_t StoredSize = FI.StoredSize; 2323 time_t StoredTime = FI.StoredTime; 2324 bool Overridden = FI.Overridden; 2325 bool Transient = FI.Transient; 2326 StringRef Filename = FI.Filename; 2327 uint64_t StoredContentHash = FI.ContentHash; 2328 2329 OptionalFileEntryRefDegradesToFileEntryPtr File = 2330 expectedToOptional(FileMgr.getFileRef(Filename, /*OpenFile=*/false)); 2331 2332 // If we didn't find the file, resolve it relative to the 2333 // original directory from which this AST file was created. 2334 if (!File && !F.OriginalDir.empty() && !F.BaseDirectory.empty() && 2335 F.OriginalDir != F.BaseDirectory) { 2336 std::string Resolved = resolveFileRelativeToOriginalDir( 2337 std::string(Filename), F.OriginalDir, F.BaseDirectory); 2338 if (!Resolved.empty()) 2339 File = expectedToOptional(FileMgr.getFileRef(Resolved)); 2340 } 2341 2342 // For an overridden file, create a virtual file with the stored 2343 // size/timestamp. 2344 if ((Overridden || Transient) && !File) 2345 File = FileMgr.getVirtualFileRef(Filename, StoredSize, StoredTime); 2346 2347 if (!File) { 2348 if (Complain) { 2349 std::string ErrorStr = "could not find file '"; 2350 ErrorStr += Filename; 2351 ErrorStr += "' referenced by AST file '"; 2352 ErrorStr += F.FileName; 2353 ErrorStr += "'"; 2354 Error(ErrorStr); 2355 } 2356 // Record that we didn't find the file. 2357 F.InputFilesLoaded[ID-1] = InputFile::getNotFound(); 2358 return InputFile(); 2359 } 2360 2361 // Check if there was a request to override the contents of the file 2362 // that was part of the precompiled header. Overriding such a file 2363 // can lead to problems when lexing using the source locations from the 2364 // PCH. 2365 SourceManager &SM = getSourceManager(); 2366 // FIXME: Reject if the overrides are different. 2367 if ((!Overridden && !Transient) && SM.isFileOverridden(File)) { 2368 if (Complain) 2369 Error(diag::err_fe_pch_file_overridden, Filename); 2370 2371 // After emitting the diagnostic, bypass the overriding file to recover 2372 // (this creates a separate FileEntry). 2373 File = SM.bypassFileContentsOverride(*File); 2374 if (!File) { 2375 F.InputFilesLoaded[ID - 1] = InputFile::getNotFound(); 2376 return InputFile(); 2377 } 2378 } 2379 2380 struct Change { 2381 enum ModificationKind { 2382 Size, 2383 ModTime, 2384 Content, 2385 None, 2386 } Kind; 2387 llvm::Optional<int64_t> Old = llvm::None; 2388 llvm::Optional<int64_t> New = llvm::None; 2389 }; 2390 auto HasInputFileChanged = [&]() { 2391 if (StoredSize != File->getSize()) 2392 return Change{Change::Size, StoredSize, File->getSize()}; 2393 if (!shouldDisableValidationForFile(F) && StoredTime && 2394 StoredTime != File->getModificationTime()) { 2395 Change MTimeChange = {Change::ModTime, StoredTime, 2396 File->getModificationTime()}; 2397 2398 // In case the modification time changes but not the content, 2399 // accept the cached file as legit. 2400 if (ValidateASTInputFilesContent && 2401 StoredContentHash != static_cast<uint64_t>(llvm::hash_code(-1))) { 2402 auto MemBuffOrError = FileMgr.getBufferForFile(File); 2403 if (!MemBuffOrError) { 2404 if (!Complain) 2405 return MTimeChange; 2406 std::string ErrorStr = "could not get buffer for file '"; 2407 ErrorStr += File->getName(); 2408 ErrorStr += "'"; 2409 Error(ErrorStr); 2410 return MTimeChange; 2411 } 2412 2413 // FIXME: hash_value is not guaranteed to be stable! 2414 auto ContentHash = hash_value(MemBuffOrError.get()->getBuffer()); 2415 if (StoredContentHash == static_cast<uint64_t>(ContentHash)) 2416 return Change{Change::None}; 2417 2418 return Change{Change::Content}; 2419 } 2420 return MTimeChange; 2421 } 2422 return Change{Change::None}; 2423 }; 2424 2425 bool IsOutOfDate = false; 2426 auto FileChange = HasInputFileChanged(); 2427 // For an overridden file, there is nothing to validate. 2428 if (!Overridden && FileChange.Kind != Change::None) { 2429 if (Complain && !Diags.isDiagnosticInFlight()) { 2430 // Build a list of the PCH imports that got us here (in reverse). 2431 SmallVector<ModuleFile *, 4> ImportStack(1, &F); 2432 while (!ImportStack.back()->ImportedBy.empty()) 2433 ImportStack.push_back(ImportStack.back()->ImportedBy[0]); 2434 2435 // The top-level PCH is stale. 2436 StringRef TopLevelPCHName(ImportStack.back()->FileName); 2437 Diag(diag::err_fe_ast_file_modified) 2438 << Filename << moduleKindForDiagnostic(ImportStack.back()->Kind) 2439 << TopLevelPCHName << FileChange.Kind 2440 << (FileChange.Old && FileChange.New) 2441 << llvm::itostr(FileChange.Old.getValueOr(0)) 2442 << llvm::itostr(FileChange.New.getValueOr(0)); 2443 2444 // Print the import stack. 2445 if (ImportStack.size() > 1) { 2446 Diag(diag::note_pch_required_by) 2447 << Filename << ImportStack[0]->FileName; 2448 for (unsigned I = 1; I < ImportStack.size(); ++I) 2449 Diag(diag::note_pch_required_by) 2450 << ImportStack[I-1]->FileName << ImportStack[I]->FileName; 2451 } 2452 2453 Diag(diag::note_pch_rebuild_required) << TopLevelPCHName; 2454 } 2455 2456 IsOutOfDate = true; 2457 } 2458 // FIXME: If the file is overridden and we've already opened it, 2459 // issue an error (or split it into a separate FileEntry). 2460 2461 InputFile IF = InputFile(*File, Overridden || Transient, IsOutOfDate); 2462 2463 // Note that we've loaded this input file. 2464 F.InputFilesLoaded[ID-1] = IF; 2465 return IF; 2466 } 2467 2468 /// If we are loading a relocatable PCH or module file, and the filename 2469 /// is not an absolute path, add the system or module root to the beginning of 2470 /// the file name. 2471 void ASTReader::ResolveImportedPath(ModuleFile &M, std::string &Filename) { 2472 // Resolve relative to the base directory, if we have one. 2473 if (!M.BaseDirectory.empty()) 2474 return ResolveImportedPath(Filename, M.BaseDirectory); 2475 } 2476 2477 void ASTReader::ResolveImportedPath(std::string &Filename, StringRef Prefix) { 2478 if (Filename.empty() || llvm::sys::path::is_absolute(Filename)) 2479 return; 2480 2481 SmallString<128> Buffer; 2482 llvm::sys::path::append(Buffer, Prefix, Filename); 2483 Filename.assign(Buffer.begin(), Buffer.end()); 2484 } 2485 2486 static bool isDiagnosedResult(ASTReader::ASTReadResult ARR, unsigned Caps) { 2487 switch (ARR) { 2488 case ASTReader::Failure: return true; 2489 case ASTReader::Missing: return !(Caps & ASTReader::ARR_Missing); 2490 case ASTReader::OutOfDate: return !(Caps & ASTReader::ARR_OutOfDate); 2491 case ASTReader::VersionMismatch: return !(Caps & ASTReader::ARR_VersionMismatch); 2492 case ASTReader::ConfigurationMismatch: 2493 return !(Caps & ASTReader::ARR_ConfigurationMismatch); 2494 case ASTReader::HadErrors: return true; 2495 case ASTReader::Success: return false; 2496 } 2497 2498 llvm_unreachable("unknown ASTReadResult"); 2499 } 2500 2501 ASTReader::ASTReadResult ASTReader::ReadOptionsBlock( 2502 BitstreamCursor &Stream, unsigned ClientLoadCapabilities, 2503 bool AllowCompatibleConfigurationMismatch, ASTReaderListener &Listener, 2504 std::string &SuggestedPredefines) { 2505 if (llvm::Error Err = Stream.EnterSubBlock(OPTIONS_BLOCK_ID)) { 2506 // FIXME this drops errors on the floor. 2507 consumeError(std::move(Err)); 2508 return Failure; 2509 } 2510 2511 // Read all of the records in the options block. 2512 RecordData Record; 2513 ASTReadResult Result = Success; 2514 while (true) { 2515 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2516 if (!MaybeEntry) { 2517 // FIXME this drops errors on the floor. 2518 consumeError(MaybeEntry.takeError()); 2519 return Failure; 2520 } 2521 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2522 2523 switch (Entry.Kind) { 2524 case llvm::BitstreamEntry::Error: 2525 case llvm::BitstreamEntry::SubBlock: 2526 return Failure; 2527 2528 case llvm::BitstreamEntry::EndBlock: 2529 return Result; 2530 2531 case llvm::BitstreamEntry::Record: 2532 // The interesting case. 2533 break; 2534 } 2535 2536 // Read and process a record. 2537 Record.clear(); 2538 Expected<unsigned> MaybeRecordType = Stream.readRecord(Entry.ID, Record); 2539 if (!MaybeRecordType) { 2540 // FIXME this drops errors on the floor. 2541 consumeError(MaybeRecordType.takeError()); 2542 return Failure; 2543 } 2544 switch ((OptionsRecordTypes)MaybeRecordType.get()) { 2545 case LANGUAGE_OPTIONS: { 2546 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2547 if (ParseLanguageOptions(Record, Complain, Listener, 2548 AllowCompatibleConfigurationMismatch)) 2549 Result = ConfigurationMismatch; 2550 break; 2551 } 2552 2553 case TARGET_OPTIONS: { 2554 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2555 if (ParseTargetOptions(Record, Complain, Listener, 2556 AllowCompatibleConfigurationMismatch)) 2557 Result = ConfigurationMismatch; 2558 break; 2559 } 2560 2561 case FILE_SYSTEM_OPTIONS: { 2562 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2563 if (!AllowCompatibleConfigurationMismatch && 2564 ParseFileSystemOptions(Record, Complain, Listener)) 2565 Result = ConfigurationMismatch; 2566 break; 2567 } 2568 2569 case HEADER_SEARCH_OPTIONS: { 2570 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2571 if (!AllowCompatibleConfigurationMismatch && 2572 ParseHeaderSearchOptions(Record, Complain, Listener)) 2573 Result = ConfigurationMismatch; 2574 break; 2575 } 2576 2577 case PREPROCESSOR_OPTIONS: 2578 bool Complain = (ClientLoadCapabilities & ARR_ConfigurationMismatch) == 0; 2579 if (!AllowCompatibleConfigurationMismatch && 2580 ParsePreprocessorOptions(Record, Complain, Listener, 2581 SuggestedPredefines)) 2582 Result = ConfigurationMismatch; 2583 break; 2584 } 2585 } 2586 } 2587 2588 ASTReader::ASTReadResult 2589 ASTReader::ReadControlBlock(ModuleFile &F, 2590 SmallVectorImpl<ImportedModule> &Loaded, 2591 const ModuleFile *ImportedBy, 2592 unsigned ClientLoadCapabilities) { 2593 BitstreamCursor &Stream = F.Stream; 2594 2595 if (llvm::Error Err = Stream.EnterSubBlock(CONTROL_BLOCK_ID)) { 2596 Error(std::move(Err)); 2597 return Failure; 2598 } 2599 2600 // Lambda to read the unhashed control block the first time it's called. 2601 // 2602 // For PCM files, the unhashed control block cannot be read until after the 2603 // MODULE_NAME record. However, PCH files have no MODULE_NAME, and yet still 2604 // need to look ahead before reading the IMPORTS record. For consistency, 2605 // this block is always read somehow (see BitstreamEntry::EndBlock). 2606 bool HasReadUnhashedControlBlock = false; 2607 auto readUnhashedControlBlockOnce = [&]() { 2608 if (!HasReadUnhashedControlBlock) { 2609 HasReadUnhashedControlBlock = true; 2610 if (ASTReadResult Result = 2611 readUnhashedControlBlock(F, ImportedBy, ClientLoadCapabilities)) 2612 return Result; 2613 } 2614 return Success; 2615 }; 2616 2617 bool DisableValidation = shouldDisableValidationForFile(F); 2618 2619 // Read all of the records and blocks in the control block. 2620 RecordData Record; 2621 unsigned NumInputs = 0; 2622 unsigned NumUserInputs = 0; 2623 StringRef BaseDirectoryAsWritten; 2624 while (true) { 2625 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2626 if (!MaybeEntry) { 2627 Error(MaybeEntry.takeError()); 2628 return Failure; 2629 } 2630 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2631 2632 switch (Entry.Kind) { 2633 case llvm::BitstreamEntry::Error: 2634 Error("malformed block record in AST file"); 2635 return Failure; 2636 case llvm::BitstreamEntry::EndBlock: { 2637 // Validate the module before returning. This call catches an AST with 2638 // no module name and no imports. 2639 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2640 return Result; 2641 2642 // Validate input files. 2643 const HeaderSearchOptions &HSOpts = 2644 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 2645 2646 // All user input files reside at the index range [0, NumUserInputs), and 2647 // system input files reside at [NumUserInputs, NumInputs). For explicitly 2648 // loaded module files, ignore missing inputs. 2649 if (!DisableValidation && F.Kind != MK_ExplicitModule && 2650 F.Kind != MK_PrebuiltModule) { 2651 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 2652 2653 // If we are reading a module, we will create a verification timestamp, 2654 // so we verify all input files. Otherwise, verify only user input 2655 // files. 2656 2657 unsigned N = NumUserInputs; 2658 if (ValidateSystemInputs || 2659 (HSOpts.ModulesValidateOncePerBuildSession && 2660 F.InputFilesValidationTimestamp <= HSOpts.BuildSessionTimestamp && 2661 F.Kind == MK_ImplicitModule)) 2662 N = NumInputs; 2663 2664 for (unsigned I = 0; I < N; ++I) { 2665 InputFile IF = getInputFile(F, I+1, Complain); 2666 if (!IF.getFile() || IF.isOutOfDate()) 2667 return OutOfDate; 2668 } 2669 } 2670 2671 if (Listener) 2672 Listener->visitModuleFile(F.FileName, F.Kind); 2673 2674 if (Listener && Listener->needsInputFileVisitation()) { 2675 unsigned N = Listener->needsSystemInputFileVisitation() ? NumInputs 2676 : NumUserInputs; 2677 for (unsigned I = 0; I < N; ++I) { 2678 bool IsSystem = I >= NumUserInputs; 2679 InputFileInfo FI = readInputFileInfo(F, I+1); 2680 Listener->visitInputFile(FI.Filename, IsSystem, FI.Overridden, 2681 F.Kind == MK_ExplicitModule || 2682 F.Kind == MK_PrebuiltModule); 2683 } 2684 } 2685 2686 return Success; 2687 } 2688 2689 case llvm::BitstreamEntry::SubBlock: 2690 switch (Entry.ID) { 2691 case INPUT_FILES_BLOCK_ID: 2692 F.InputFilesCursor = Stream; 2693 if (llvm::Error Err = Stream.SkipBlock()) { 2694 Error(std::move(Err)); 2695 return Failure; 2696 } 2697 if (ReadBlockAbbrevs(F.InputFilesCursor, INPUT_FILES_BLOCK_ID)) { 2698 Error("malformed block record in AST file"); 2699 return Failure; 2700 } 2701 continue; 2702 2703 case OPTIONS_BLOCK_ID: 2704 // If we're reading the first module for this group, check its options 2705 // are compatible with ours. For modules it imports, no further checking 2706 // is required, because we checked them when we built it. 2707 if (Listener && !ImportedBy) { 2708 // Should we allow the configuration of the module file to differ from 2709 // the configuration of the current translation unit in a compatible 2710 // way? 2711 // 2712 // FIXME: Allow this for files explicitly specified with -include-pch. 2713 bool AllowCompatibleConfigurationMismatch = 2714 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 2715 2716 ASTReadResult Result = 2717 ReadOptionsBlock(Stream, ClientLoadCapabilities, 2718 AllowCompatibleConfigurationMismatch, *Listener, 2719 SuggestedPredefines); 2720 if (Result == Failure) { 2721 Error("malformed block record in AST file"); 2722 return Result; 2723 } 2724 2725 if (DisableValidation || 2726 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 2727 Result = Success; 2728 2729 // If we can't load the module, exit early since we likely 2730 // will rebuild the module anyway. The stream may be in the 2731 // middle of a block. 2732 if (Result != Success) 2733 return Result; 2734 } else if (llvm::Error Err = Stream.SkipBlock()) { 2735 Error(std::move(Err)); 2736 return Failure; 2737 } 2738 continue; 2739 2740 default: 2741 if (llvm::Error Err = Stream.SkipBlock()) { 2742 Error(std::move(Err)); 2743 return Failure; 2744 } 2745 continue; 2746 } 2747 2748 case llvm::BitstreamEntry::Record: 2749 // The interesting case. 2750 break; 2751 } 2752 2753 // Read and process a record. 2754 Record.clear(); 2755 StringRef Blob; 2756 Expected<unsigned> MaybeRecordType = 2757 Stream.readRecord(Entry.ID, Record, &Blob); 2758 if (!MaybeRecordType) { 2759 Error(MaybeRecordType.takeError()); 2760 return Failure; 2761 } 2762 switch ((ControlRecordTypes)MaybeRecordType.get()) { 2763 case METADATA: { 2764 if (Record[0] != VERSION_MAJOR && !DisableValidation) { 2765 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2766 Diag(Record[0] < VERSION_MAJOR? diag::err_pch_version_too_old 2767 : diag::err_pch_version_too_new); 2768 return VersionMismatch; 2769 } 2770 2771 bool hasErrors = Record[6]; 2772 if (hasErrors && !DisableValidation) { 2773 // If requested by the caller and the module hasn't already been read 2774 // or compiled, mark modules on error as out-of-date. 2775 if ((ClientLoadCapabilities & ARR_TreatModuleWithErrorsAsOutOfDate) && 2776 canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2777 return OutOfDate; 2778 2779 if (!AllowASTWithCompilerErrors) { 2780 Diag(diag::err_pch_with_compiler_errors); 2781 return HadErrors; 2782 } 2783 } 2784 if (hasErrors) { 2785 Diags.ErrorOccurred = true; 2786 Diags.UncompilableErrorOccurred = true; 2787 Diags.UnrecoverableErrorOccurred = true; 2788 } 2789 2790 F.RelocatablePCH = Record[4]; 2791 // Relative paths in a relocatable PCH are relative to our sysroot. 2792 if (F.RelocatablePCH) 2793 F.BaseDirectory = isysroot.empty() ? "/" : isysroot; 2794 2795 F.HasTimestamps = Record[5]; 2796 2797 const std::string &CurBranch = getClangFullRepositoryVersion(); 2798 StringRef ASTBranch = Blob; 2799 if (StringRef(CurBranch) != ASTBranch && !DisableValidation) { 2800 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 2801 Diag(diag::err_pch_different_branch) << ASTBranch << CurBranch; 2802 return VersionMismatch; 2803 } 2804 break; 2805 } 2806 2807 case IMPORTS: { 2808 // Validate the AST before processing any imports (otherwise, untangling 2809 // them can be error-prone and expensive). A module will have a name and 2810 // will already have been validated, but this catches the PCH case. 2811 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2812 return Result; 2813 2814 // Load each of the imported PCH files. 2815 unsigned Idx = 0, N = Record.size(); 2816 while (Idx < N) { 2817 // Read information about the AST file. 2818 ModuleKind ImportedKind = (ModuleKind)Record[Idx++]; 2819 // The import location will be the local one for now; we will adjust 2820 // all import locations of module imports after the global source 2821 // location info are setup, in ReadAST. 2822 SourceLocation ImportLoc = 2823 ReadUntranslatedSourceLocation(Record[Idx++]); 2824 off_t StoredSize = (off_t)Record[Idx++]; 2825 time_t StoredModTime = (time_t)Record[Idx++]; 2826 auto FirstSignatureByte = Record.begin() + Idx; 2827 ASTFileSignature StoredSignature = ASTFileSignature::create( 2828 FirstSignatureByte, FirstSignatureByte + ASTFileSignature::size); 2829 Idx += ASTFileSignature::size; 2830 2831 std::string ImportedName = ReadString(Record, Idx); 2832 std::string ImportedFile; 2833 2834 // For prebuilt and explicit modules first consult the file map for 2835 // an override. Note that here we don't search prebuilt module 2836 // directories, only the explicit name to file mappings. Also, we will 2837 // still verify the size/signature making sure it is essentially the 2838 // same file but perhaps in a different location. 2839 if (ImportedKind == MK_PrebuiltModule || ImportedKind == MK_ExplicitModule) 2840 ImportedFile = PP.getHeaderSearchInfo().getPrebuiltModuleFileName( 2841 ImportedName, /*FileMapOnly*/ true); 2842 2843 if (ImportedFile.empty()) 2844 // Use BaseDirectoryAsWritten to ensure we use the same path in the 2845 // ModuleCache as when writing. 2846 ImportedFile = ReadPath(BaseDirectoryAsWritten, Record, Idx); 2847 else 2848 SkipPath(Record, Idx); 2849 2850 // If our client can't cope with us being out of date, we can't cope with 2851 // our dependency being missing. 2852 unsigned Capabilities = ClientLoadCapabilities; 2853 if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) 2854 Capabilities &= ~ARR_Missing; 2855 2856 // Load the AST file. 2857 auto Result = ReadASTCore(ImportedFile, ImportedKind, ImportLoc, &F, 2858 Loaded, StoredSize, StoredModTime, 2859 StoredSignature, Capabilities); 2860 2861 // If we diagnosed a problem, produce a backtrace. 2862 bool recompilingFinalized = 2863 Result == OutOfDate && (Capabilities & ARR_OutOfDate) && 2864 getModuleManager().getModuleCache().isPCMFinal(F.FileName); 2865 if (isDiagnosedResult(Result, Capabilities) || recompilingFinalized) 2866 Diag(diag::note_module_file_imported_by) 2867 << F.FileName << !F.ModuleName.empty() << F.ModuleName; 2868 if (recompilingFinalized) 2869 Diag(diag::note_module_file_conflict); 2870 2871 switch (Result) { 2872 case Failure: return Failure; 2873 // If we have to ignore the dependency, we'll have to ignore this too. 2874 case Missing: 2875 case OutOfDate: return OutOfDate; 2876 case VersionMismatch: return VersionMismatch; 2877 case ConfigurationMismatch: return ConfigurationMismatch; 2878 case HadErrors: return HadErrors; 2879 case Success: break; 2880 } 2881 } 2882 break; 2883 } 2884 2885 case ORIGINAL_FILE: 2886 F.OriginalSourceFileID = FileID::get(Record[0]); 2887 F.ActualOriginalSourceFileName = std::string(Blob); 2888 F.OriginalSourceFileName = F.ActualOriginalSourceFileName; 2889 ResolveImportedPath(F, F.OriginalSourceFileName); 2890 break; 2891 2892 case ORIGINAL_FILE_ID: 2893 F.OriginalSourceFileID = FileID::get(Record[0]); 2894 break; 2895 2896 case ORIGINAL_PCH_DIR: 2897 F.OriginalDir = std::string(Blob); 2898 break; 2899 2900 case MODULE_NAME: 2901 F.ModuleName = std::string(Blob); 2902 Diag(diag::remark_module_import) 2903 << F.ModuleName << F.FileName << (ImportedBy ? true : false) 2904 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 2905 if (Listener) 2906 Listener->ReadModuleName(F.ModuleName); 2907 2908 // Validate the AST as soon as we have a name so we can exit early on 2909 // failure. 2910 if (ASTReadResult Result = readUnhashedControlBlockOnce()) 2911 return Result; 2912 2913 break; 2914 2915 case MODULE_DIRECTORY: { 2916 // Save the BaseDirectory as written in the PCM for computing the module 2917 // filename for the ModuleCache. 2918 BaseDirectoryAsWritten = Blob; 2919 assert(!F.ModuleName.empty() && 2920 "MODULE_DIRECTORY found before MODULE_NAME"); 2921 // If we've already loaded a module map file covering this module, we may 2922 // have a better path for it (relative to the current build). 2923 Module *M = PP.getHeaderSearchInfo().lookupModule( 2924 F.ModuleName, SourceLocation(), /*AllowSearch*/ true, 2925 /*AllowExtraModuleMapSearch*/ true); 2926 if (M && M->Directory) { 2927 // If we're implicitly loading a module, the base directory can't 2928 // change between the build and use. 2929 // Don't emit module relocation error if we have -fno-validate-pch 2930 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 2931 DisableValidationForModuleKind::Module) && 2932 F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) { 2933 auto BuildDir = PP.getFileManager().getDirectory(Blob); 2934 if (!BuildDir || *BuildDir != M->Directory) { 2935 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 2936 Diag(diag::err_imported_module_relocated) 2937 << F.ModuleName << Blob << M->Directory->getName(); 2938 return OutOfDate; 2939 } 2940 } 2941 F.BaseDirectory = std::string(M->Directory->getName()); 2942 } else { 2943 F.BaseDirectory = std::string(Blob); 2944 } 2945 break; 2946 } 2947 2948 case MODULE_MAP_FILE: 2949 if (ASTReadResult Result = 2950 ReadModuleMapFileBlock(Record, F, ImportedBy, ClientLoadCapabilities)) 2951 return Result; 2952 break; 2953 2954 case INPUT_FILE_OFFSETS: 2955 NumInputs = Record[0]; 2956 NumUserInputs = Record[1]; 2957 F.InputFileOffsets = 2958 (const llvm::support::unaligned_uint64_t *)Blob.data(); 2959 F.InputFilesLoaded.resize(NumInputs); 2960 F.NumUserInputFiles = NumUserInputs; 2961 break; 2962 } 2963 } 2964 } 2965 2966 llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, 2967 unsigned ClientLoadCapabilities) { 2968 BitstreamCursor &Stream = F.Stream; 2969 2970 if (llvm::Error Err = Stream.EnterSubBlock(AST_BLOCK_ID)) 2971 return Err; 2972 F.ASTBlockStartOffset = Stream.GetCurrentBitNo(); 2973 2974 // Read all of the records and blocks for the AST file. 2975 RecordData Record; 2976 while (true) { 2977 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 2978 if (!MaybeEntry) 2979 return MaybeEntry.takeError(); 2980 llvm::BitstreamEntry Entry = MaybeEntry.get(); 2981 2982 switch (Entry.Kind) { 2983 case llvm::BitstreamEntry::Error: 2984 return llvm::createStringError( 2985 std::errc::illegal_byte_sequence, 2986 "error at end of module block in AST file"); 2987 case llvm::BitstreamEntry::EndBlock: 2988 // Outside of C++, we do not store a lookup map for the translation unit. 2989 // Instead, mark it as needing a lookup map to be built if this module 2990 // contains any declarations lexically within it (which it always does!). 2991 // This usually has no cost, since we very rarely need the lookup map for 2992 // the translation unit outside C++. 2993 if (ASTContext *Ctx = ContextObj) { 2994 DeclContext *DC = Ctx->getTranslationUnitDecl(); 2995 if (DC->hasExternalLexicalStorage() && !Ctx->getLangOpts().CPlusPlus) 2996 DC->setMustBuildLookupTable(); 2997 } 2998 2999 return llvm::Error::success(); 3000 case llvm::BitstreamEntry::SubBlock: 3001 switch (Entry.ID) { 3002 case DECLTYPES_BLOCK_ID: 3003 // We lazily load the decls block, but we want to set up the 3004 // DeclsCursor cursor to point into it. Clone our current bitcode 3005 // cursor to it, enter the block and read the abbrevs in that block. 3006 // With the main cursor, we just skip over it. 3007 F.DeclsCursor = Stream; 3008 if (llvm::Error Err = Stream.SkipBlock()) 3009 return Err; 3010 if (llvm::Error Err = ReadBlockAbbrevs( 3011 F.DeclsCursor, DECLTYPES_BLOCK_ID, &F.DeclsBlockStartOffset)) 3012 return Err; 3013 break; 3014 3015 case PREPROCESSOR_BLOCK_ID: 3016 F.MacroCursor = Stream; 3017 if (!PP.getExternalSource()) 3018 PP.setExternalSource(this); 3019 3020 if (llvm::Error Err = Stream.SkipBlock()) 3021 return Err; 3022 if (llvm::Error Err = 3023 ReadBlockAbbrevs(F.MacroCursor, PREPROCESSOR_BLOCK_ID)) 3024 return Err; 3025 F.MacroStartOffset = F.MacroCursor.GetCurrentBitNo(); 3026 break; 3027 3028 case PREPROCESSOR_DETAIL_BLOCK_ID: 3029 F.PreprocessorDetailCursor = Stream; 3030 3031 if (llvm::Error Err = Stream.SkipBlock()) { 3032 return Err; 3033 } 3034 if (llvm::Error Err = ReadBlockAbbrevs(F.PreprocessorDetailCursor, 3035 PREPROCESSOR_DETAIL_BLOCK_ID)) 3036 return Err; 3037 F.PreprocessorDetailStartOffset 3038 = F.PreprocessorDetailCursor.GetCurrentBitNo(); 3039 3040 if (!PP.getPreprocessingRecord()) 3041 PP.createPreprocessingRecord(); 3042 if (!PP.getPreprocessingRecord()->getExternalSource()) 3043 PP.getPreprocessingRecord()->SetExternalSource(*this); 3044 break; 3045 3046 case SOURCE_MANAGER_BLOCK_ID: 3047 if (llvm::Error Err = ReadSourceManagerBlock(F)) 3048 return Err; 3049 break; 3050 3051 case SUBMODULE_BLOCK_ID: 3052 if (llvm::Error Err = ReadSubmoduleBlock(F, ClientLoadCapabilities)) 3053 return Err; 3054 break; 3055 3056 case COMMENTS_BLOCK_ID: { 3057 BitstreamCursor C = Stream; 3058 3059 if (llvm::Error Err = Stream.SkipBlock()) 3060 return Err; 3061 if (llvm::Error Err = ReadBlockAbbrevs(C, COMMENTS_BLOCK_ID)) 3062 return Err; 3063 CommentsCursors.push_back(std::make_pair(C, &F)); 3064 break; 3065 } 3066 3067 default: 3068 if (llvm::Error Err = Stream.SkipBlock()) 3069 return Err; 3070 break; 3071 } 3072 continue; 3073 3074 case llvm::BitstreamEntry::Record: 3075 // The interesting case. 3076 break; 3077 } 3078 3079 // Read and process a record. 3080 Record.clear(); 3081 StringRef Blob; 3082 Expected<unsigned> MaybeRecordType = 3083 Stream.readRecord(Entry.ID, Record, &Blob); 3084 if (!MaybeRecordType) 3085 return MaybeRecordType.takeError(); 3086 ASTRecordTypes RecordType = (ASTRecordTypes)MaybeRecordType.get(); 3087 3088 // If we're not loading an AST context, we don't care about most records. 3089 if (!ContextObj) { 3090 switch (RecordType) { 3091 case IDENTIFIER_TABLE: 3092 case IDENTIFIER_OFFSET: 3093 case INTERESTING_IDENTIFIERS: 3094 case STATISTICS: 3095 case PP_CONDITIONAL_STACK: 3096 case PP_COUNTER_VALUE: 3097 case SOURCE_LOCATION_OFFSETS: 3098 case MODULE_OFFSET_MAP: 3099 case SOURCE_MANAGER_LINE_TABLE: 3100 case SOURCE_LOCATION_PRELOADS: 3101 case PPD_ENTITIES_OFFSETS: 3102 case HEADER_SEARCH_TABLE: 3103 case IMPORTED_MODULES: 3104 case MACRO_OFFSET: 3105 break; 3106 default: 3107 continue; 3108 } 3109 } 3110 3111 switch (RecordType) { 3112 default: // Default behavior: ignore. 3113 break; 3114 3115 case TYPE_OFFSET: { 3116 if (F.LocalNumTypes != 0) 3117 return llvm::createStringError( 3118 std::errc::illegal_byte_sequence, 3119 "duplicate TYPE_OFFSET record in AST file"); 3120 F.TypeOffsets = reinterpret_cast<const UnderalignedInt64 *>(Blob.data()); 3121 F.LocalNumTypes = Record[0]; 3122 unsigned LocalBaseTypeIndex = Record[1]; 3123 F.BaseTypeIndex = getTotalNumTypes(); 3124 3125 if (F.LocalNumTypes > 0) { 3126 // Introduce the global -> local mapping for types within this module. 3127 GlobalTypeMap.insert(std::make_pair(getTotalNumTypes(), &F)); 3128 3129 // Introduce the local -> global mapping for types within this module. 3130 F.TypeRemap.insertOrReplace( 3131 std::make_pair(LocalBaseTypeIndex, 3132 F.BaseTypeIndex - LocalBaseTypeIndex)); 3133 3134 TypesLoaded.resize(TypesLoaded.size() + F.LocalNumTypes); 3135 } 3136 break; 3137 } 3138 3139 case DECL_OFFSET: { 3140 if (F.LocalNumDecls != 0) 3141 return llvm::createStringError( 3142 std::errc::illegal_byte_sequence, 3143 "duplicate DECL_OFFSET record in AST file"); 3144 F.DeclOffsets = (const DeclOffset *)Blob.data(); 3145 F.LocalNumDecls = Record[0]; 3146 unsigned LocalBaseDeclID = Record[1]; 3147 F.BaseDeclID = getTotalNumDecls(); 3148 3149 if (F.LocalNumDecls > 0) { 3150 // Introduce the global -> local mapping for declarations within this 3151 // module. 3152 GlobalDeclMap.insert( 3153 std::make_pair(getTotalNumDecls() + NUM_PREDEF_DECL_IDS, &F)); 3154 3155 // Introduce the local -> global mapping for declarations within this 3156 // module. 3157 F.DeclRemap.insertOrReplace( 3158 std::make_pair(LocalBaseDeclID, F.BaseDeclID - LocalBaseDeclID)); 3159 3160 // Introduce the global -> local mapping for declarations within this 3161 // module. 3162 F.GlobalToLocalDeclIDs[&F] = LocalBaseDeclID; 3163 3164 DeclsLoaded.resize(DeclsLoaded.size() + F.LocalNumDecls); 3165 } 3166 break; 3167 } 3168 3169 case TU_UPDATE_LEXICAL: { 3170 DeclContext *TU = ContextObj->getTranslationUnitDecl(); 3171 LexicalContents Contents( 3172 reinterpret_cast<const llvm::support::unaligned_uint32_t *>( 3173 Blob.data()), 3174 static_cast<unsigned int>(Blob.size() / 4)); 3175 TULexicalDecls.push_back(std::make_pair(&F, Contents)); 3176 TU->setHasExternalLexicalStorage(true); 3177 break; 3178 } 3179 3180 case UPDATE_VISIBLE: { 3181 unsigned Idx = 0; 3182 serialization::DeclID ID = ReadDeclID(F, Record, Idx); 3183 auto *Data = (const unsigned char*)Blob.data(); 3184 PendingVisibleUpdates[ID].push_back(PendingVisibleUpdate{&F, Data}); 3185 // If we've already loaded the decl, perform the updates when we finish 3186 // loading this block. 3187 if (Decl *D = GetExistingDecl(ID)) 3188 PendingUpdateRecords.push_back( 3189 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3190 break; 3191 } 3192 3193 case IDENTIFIER_TABLE: 3194 F.IdentifierTableData = 3195 reinterpret_cast<const unsigned char *>(Blob.data()); 3196 if (Record[0]) { 3197 F.IdentifierLookupTable = ASTIdentifierLookupTable::Create( 3198 F.IdentifierTableData + Record[0], 3199 F.IdentifierTableData + sizeof(uint32_t), 3200 F.IdentifierTableData, 3201 ASTIdentifierLookupTrait(*this, F)); 3202 3203 PP.getIdentifierTable().setExternalIdentifierLookup(this); 3204 } 3205 break; 3206 3207 case IDENTIFIER_OFFSET: { 3208 if (F.LocalNumIdentifiers != 0) 3209 return llvm::createStringError( 3210 std::errc::illegal_byte_sequence, 3211 "duplicate IDENTIFIER_OFFSET record in AST file"); 3212 F.IdentifierOffsets = (const uint32_t *)Blob.data(); 3213 F.LocalNumIdentifiers = Record[0]; 3214 unsigned LocalBaseIdentifierID = Record[1]; 3215 F.BaseIdentifierID = getTotalNumIdentifiers(); 3216 3217 if (F.LocalNumIdentifiers > 0) { 3218 // Introduce the global -> local mapping for identifiers within this 3219 // module. 3220 GlobalIdentifierMap.insert(std::make_pair(getTotalNumIdentifiers() + 1, 3221 &F)); 3222 3223 // Introduce the local -> global mapping for identifiers within this 3224 // module. 3225 F.IdentifierRemap.insertOrReplace( 3226 std::make_pair(LocalBaseIdentifierID, 3227 F.BaseIdentifierID - LocalBaseIdentifierID)); 3228 3229 IdentifiersLoaded.resize(IdentifiersLoaded.size() 3230 + F.LocalNumIdentifiers); 3231 } 3232 break; 3233 } 3234 3235 case INTERESTING_IDENTIFIERS: 3236 F.PreloadIdentifierOffsets.assign(Record.begin(), Record.end()); 3237 break; 3238 3239 case EAGERLY_DESERIALIZED_DECLS: 3240 // FIXME: Skip reading this record if our ASTConsumer doesn't care 3241 // about "interesting" decls (for instance, if we're building a module). 3242 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3243 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3244 break; 3245 3246 case MODULAR_CODEGEN_DECLS: 3247 // FIXME: Skip reading this record if our ASTConsumer doesn't care about 3248 // them (ie: if we're not codegenerating this module). 3249 if (F.Kind == MK_MainFile || 3250 getContext().getLangOpts().BuildingPCHWithObjectFile) 3251 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3252 EagerlyDeserializedDecls.push_back(getGlobalDeclID(F, Record[I])); 3253 break; 3254 3255 case SPECIAL_TYPES: 3256 if (SpecialTypes.empty()) { 3257 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3258 SpecialTypes.push_back(getGlobalTypeID(F, Record[I])); 3259 break; 3260 } 3261 3262 if (SpecialTypes.size() != Record.size()) 3263 return llvm::createStringError(std::errc::illegal_byte_sequence, 3264 "invalid special-types record"); 3265 3266 for (unsigned I = 0, N = Record.size(); I != N; ++I) { 3267 serialization::TypeID ID = getGlobalTypeID(F, Record[I]); 3268 if (!SpecialTypes[I]) 3269 SpecialTypes[I] = ID; 3270 // FIXME: If ID && SpecialTypes[I] != ID, do we need a separate 3271 // merge step? 3272 } 3273 break; 3274 3275 case STATISTICS: 3276 TotalNumStatements += Record[0]; 3277 TotalNumMacros += Record[1]; 3278 TotalLexicalDeclContexts += Record[2]; 3279 TotalVisibleDeclContexts += Record[3]; 3280 break; 3281 3282 case UNUSED_FILESCOPED_DECLS: 3283 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3284 UnusedFileScopedDecls.push_back(getGlobalDeclID(F, Record[I])); 3285 break; 3286 3287 case DELEGATING_CTORS: 3288 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3289 DelegatingCtorDecls.push_back(getGlobalDeclID(F, Record[I])); 3290 break; 3291 3292 case WEAK_UNDECLARED_IDENTIFIERS: 3293 if (Record.size() % 4 != 0) 3294 return llvm::createStringError(std::errc::illegal_byte_sequence, 3295 "invalid weak identifiers record"); 3296 3297 // FIXME: Ignore weak undeclared identifiers from non-original PCH 3298 // files. This isn't the way to do it :) 3299 WeakUndeclaredIdentifiers.clear(); 3300 3301 // Translate the weak, undeclared identifiers into global IDs. 3302 for (unsigned I = 0, N = Record.size(); I < N; /* in loop */) { 3303 WeakUndeclaredIdentifiers.push_back( 3304 getGlobalIdentifierID(F, Record[I++])); 3305 WeakUndeclaredIdentifiers.push_back( 3306 getGlobalIdentifierID(F, Record[I++])); 3307 WeakUndeclaredIdentifiers.push_back( 3308 ReadSourceLocation(F, Record, I).getRawEncoding()); 3309 WeakUndeclaredIdentifiers.push_back(Record[I++]); 3310 } 3311 break; 3312 3313 case SELECTOR_OFFSETS: { 3314 F.SelectorOffsets = (const uint32_t *)Blob.data(); 3315 F.LocalNumSelectors = Record[0]; 3316 unsigned LocalBaseSelectorID = Record[1]; 3317 F.BaseSelectorID = getTotalNumSelectors(); 3318 3319 if (F.LocalNumSelectors > 0) { 3320 // Introduce the global -> local mapping for selectors within this 3321 // module. 3322 GlobalSelectorMap.insert(std::make_pair(getTotalNumSelectors()+1, &F)); 3323 3324 // Introduce the local -> global mapping for selectors within this 3325 // module. 3326 F.SelectorRemap.insertOrReplace( 3327 std::make_pair(LocalBaseSelectorID, 3328 F.BaseSelectorID - LocalBaseSelectorID)); 3329 3330 SelectorsLoaded.resize(SelectorsLoaded.size() + F.LocalNumSelectors); 3331 } 3332 break; 3333 } 3334 3335 case METHOD_POOL: 3336 F.SelectorLookupTableData = (const unsigned char *)Blob.data(); 3337 if (Record[0]) 3338 F.SelectorLookupTable 3339 = ASTSelectorLookupTable::Create( 3340 F.SelectorLookupTableData + Record[0], 3341 F.SelectorLookupTableData, 3342 ASTSelectorLookupTrait(*this, F)); 3343 TotalNumMethodPoolEntries += Record[1]; 3344 break; 3345 3346 case REFERENCED_SELECTOR_POOL: 3347 if (!Record.empty()) { 3348 for (unsigned Idx = 0, N = Record.size() - 1; Idx < N; /* in loop */) { 3349 ReferencedSelectorsData.push_back(getGlobalSelectorID(F, 3350 Record[Idx++])); 3351 ReferencedSelectorsData.push_back(ReadSourceLocation(F, Record, Idx). 3352 getRawEncoding()); 3353 } 3354 } 3355 break; 3356 3357 case PP_CONDITIONAL_STACK: 3358 if (!Record.empty()) { 3359 unsigned Idx = 0, End = Record.size() - 1; 3360 bool ReachedEOFWhileSkipping = Record[Idx++]; 3361 llvm::Optional<Preprocessor::PreambleSkipInfo> SkipInfo; 3362 if (ReachedEOFWhileSkipping) { 3363 SourceLocation HashToken = ReadSourceLocation(F, Record, Idx); 3364 SourceLocation IfTokenLoc = ReadSourceLocation(F, Record, Idx); 3365 bool FoundNonSkipPortion = Record[Idx++]; 3366 bool FoundElse = Record[Idx++]; 3367 SourceLocation ElseLoc = ReadSourceLocation(F, Record, Idx); 3368 SkipInfo.emplace(HashToken, IfTokenLoc, FoundNonSkipPortion, 3369 FoundElse, ElseLoc); 3370 } 3371 SmallVector<PPConditionalInfo, 4> ConditionalStack; 3372 while (Idx < End) { 3373 auto Loc = ReadSourceLocation(F, Record, Idx); 3374 bool WasSkipping = Record[Idx++]; 3375 bool FoundNonSkip = Record[Idx++]; 3376 bool FoundElse = Record[Idx++]; 3377 ConditionalStack.push_back( 3378 {Loc, WasSkipping, FoundNonSkip, FoundElse}); 3379 } 3380 PP.setReplayablePreambleConditionalStack(ConditionalStack, SkipInfo); 3381 } 3382 break; 3383 3384 case PP_COUNTER_VALUE: 3385 if (!Record.empty() && Listener) 3386 Listener->ReadCounter(F, Record[0]); 3387 break; 3388 3389 case FILE_SORTED_DECLS: 3390 F.FileSortedDecls = (const DeclID *)Blob.data(); 3391 F.NumFileSortedDecls = Record[0]; 3392 break; 3393 3394 case SOURCE_LOCATION_OFFSETS: { 3395 F.SLocEntryOffsets = (const uint32_t *)Blob.data(); 3396 F.LocalNumSLocEntries = Record[0]; 3397 SourceLocation::UIntTy SLocSpaceSize = Record[1]; 3398 F.SLocEntryOffsetsBase = Record[2] + F.SourceManagerBlockStartOffset; 3399 std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) = 3400 SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries, 3401 SLocSpaceSize); 3402 if (!F.SLocEntryBaseID) 3403 return llvm::createStringError(std::errc::invalid_argument, 3404 "ran out of source locations"); 3405 // Make our entry in the range map. BaseID is negative and growing, so 3406 // we invert it. Because we invert it, though, we need the other end of 3407 // the range. 3408 unsigned RangeStart = 3409 unsigned(-F.SLocEntryBaseID) - F.LocalNumSLocEntries + 1; 3410 GlobalSLocEntryMap.insert(std::make_pair(RangeStart, &F)); 3411 F.FirstLoc = SourceLocation::getFromRawEncoding(F.SLocEntryBaseOffset); 3412 3413 // SLocEntryBaseOffset is lower than MaxLoadedOffset and decreasing. 3414 assert((F.SLocEntryBaseOffset & SourceLocation::MacroIDBit) == 0); 3415 GlobalSLocOffsetMap.insert( 3416 std::make_pair(SourceManager::MaxLoadedOffset - F.SLocEntryBaseOffset 3417 - SLocSpaceSize,&F)); 3418 3419 // Initialize the remapping table. 3420 // Invalid stays invalid. 3421 F.SLocRemap.insertOrReplace(std::make_pair(0U, 0)); 3422 // This module. Base was 2 when being compiled. 3423 F.SLocRemap.insertOrReplace(std::make_pair( 3424 2U, static_cast<SourceLocation::IntTy>(F.SLocEntryBaseOffset - 2))); 3425 3426 TotalNumSLocEntries += F.LocalNumSLocEntries; 3427 break; 3428 } 3429 3430 case MODULE_OFFSET_MAP: 3431 F.ModuleOffsetMap = Blob; 3432 break; 3433 3434 case SOURCE_MANAGER_LINE_TABLE: 3435 ParseLineTable(F, Record); 3436 break; 3437 3438 case SOURCE_LOCATION_PRELOADS: { 3439 // Need to transform from the local view (1-based IDs) to the global view, 3440 // which is based off F.SLocEntryBaseID. 3441 if (!F.PreloadSLocEntries.empty()) 3442 return llvm::createStringError( 3443 std::errc::illegal_byte_sequence, 3444 "Multiple SOURCE_LOCATION_PRELOADS records in AST file"); 3445 3446 F.PreloadSLocEntries.swap(Record); 3447 break; 3448 } 3449 3450 case EXT_VECTOR_DECLS: 3451 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3452 ExtVectorDecls.push_back(getGlobalDeclID(F, Record[I])); 3453 break; 3454 3455 case VTABLE_USES: 3456 if (Record.size() % 3 != 0) 3457 return llvm::createStringError(std::errc::illegal_byte_sequence, 3458 "Invalid VTABLE_USES record"); 3459 3460 // Later tables overwrite earlier ones. 3461 // FIXME: Modules will have some trouble with this. This is clearly not 3462 // the right way to do this. 3463 VTableUses.clear(); 3464 3465 for (unsigned Idx = 0, N = Record.size(); Idx != N; /* In loop */) { 3466 VTableUses.push_back(getGlobalDeclID(F, Record[Idx++])); 3467 VTableUses.push_back( 3468 ReadSourceLocation(F, Record, Idx).getRawEncoding()); 3469 VTableUses.push_back(Record[Idx++]); 3470 } 3471 break; 3472 3473 case PENDING_IMPLICIT_INSTANTIATIONS: 3474 if (PendingInstantiations.size() % 2 != 0) 3475 return llvm::createStringError( 3476 std::errc::illegal_byte_sequence, 3477 "Invalid existing PendingInstantiations"); 3478 3479 if (Record.size() % 2 != 0) 3480 return llvm::createStringError( 3481 std::errc::illegal_byte_sequence, 3482 "Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); 3483 3484 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3485 PendingInstantiations.push_back(getGlobalDeclID(F, Record[I++])); 3486 PendingInstantiations.push_back( 3487 ReadSourceLocation(F, Record, I).getRawEncoding()); 3488 } 3489 break; 3490 3491 case SEMA_DECL_REFS: 3492 if (Record.size() != 3) 3493 return llvm::createStringError(std::errc::illegal_byte_sequence, 3494 "Invalid SEMA_DECL_REFS block"); 3495 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3496 SemaDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3497 break; 3498 3499 case PPD_ENTITIES_OFFSETS: { 3500 F.PreprocessedEntityOffsets = (const PPEntityOffset *)Blob.data(); 3501 assert(Blob.size() % sizeof(PPEntityOffset) == 0); 3502 F.NumPreprocessedEntities = Blob.size() / sizeof(PPEntityOffset); 3503 3504 unsigned LocalBasePreprocessedEntityID = Record[0]; 3505 3506 unsigned StartingID; 3507 if (!PP.getPreprocessingRecord()) 3508 PP.createPreprocessingRecord(); 3509 if (!PP.getPreprocessingRecord()->getExternalSource()) 3510 PP.getPreprocessingRecord()->SetExternalSource(*this); 3511 StartingID 3512 = PP.getPreprocessingRecord() 3513 ->allocateLoadedEntities(F.NumPreprocessedEntities); 3514 F.BasePreprocessedEntityID = StartingID; 3515 3516 if (F.NumPreprocessedEntities > 0) { 3517 // Introduce the global -> local mapping for preprocessed entities in 3518 // this module. 3519 GlobalPreprocessedEntityMap.insert(std::make_pair(StartingID, &F)); 3520 3521 // Introduce the local -> global mapping for preprocessed entities in 3522 // this module. 3523 F.PreprocessedEntityRemap.insertOrReplace( 3524 std::make_pair(LocalBasePreprocessedEntityID, 3525 F.BasePreprocessedEntityID - LocalBasePreprocessedEntityID)); 3526 } 3527 3528 break; 3529 } 3530 3531 case PPD_SKIPPED_RANGES: { 3532 F.PreprocessedSkippedRangeOffsets = (const PPSkippedRange*)Blob.data(); 3533 assert(Blob.size() % sizeof(PPSkippedRange) == 0); 3534 F.NumPreprocessedSkippedRanges = Blob.size() / sizeof(PPSkippedRange); 3535 3536 if (!PP.getPreprocessingRecord()) 3537 PP.createPreprocessingRecord(); 3538 if (!PP.getPreprocessingRecord()->getExternalSource()) 3539 PP.getPreprocessingRecord()->SetExternalSource(*this); 3540 F.BasePreprocessedSkippedRangeID = PP.getPreprocessingRecord() 3541 ->allocateSkippedRanges(F.NumPreprocessedSkippedRanges); 3542 3543 if (F.NumPreprocessedSkippedRanges > 0) 3544 GlobalSkippedRangeMap.insert( 3545 std::make_pair(F.BasePreprocessedSkippedRangeID, &F)); 3546 break; 3547 } 3548 3549 case DECL_UPDATE_OFFSETS: 3550 if (Record.size() % 2 != 0) 3551 return llvm::createStringError( 3552 std::errc::illegal_byte_sequence, 3553 "invalid DECL_UPDATE_OFFSETS block in AST file"); 3554 for (unsigned I = 0, N = Record.size(); I != N; I += 2) { 3555 GlobalDeclID ID = getGlobalDeclID(F, Record[I]); 3556 DeclUpdateOffsets[ID].push_back(std::make_pair(&F, Record[I + 1])); 3557 3558 // If we've already loaded the decl, perform the updates when we finish 3559 // loading this block. 3560 if (Decl *D = GetExistingDecl(ID)) 3561 PendingUpdateRecords.push_back( 3562 PendingUpdateRecord(ID, D, /*JustLoaded=*/false)); 3563 } 3564 break; 3565 3566 case OBJC_CATEGORIES_MAP: 3567 if (F.LocalNumObjCCategoriesInMap != 0) 3568 return llvm::createStringError( 3569 std::errc::illegal_byte_sequence, 3570 "duplicate OBJC_CATEGORIES_MAP record in AST file"); 3571 3572 F.LocalNumObjCCategoriesInMap = Record[0]; 3573 F.ObjCCategoriesMap = (const ObjCCategoriesInfo *)Blob.data(); 3574 break; 3575 3576 case OBJC_CATEGORIES: 3577 F.ObjCCategories.swap(Record); 3578 break; 3579 3580 case CUDA_SPECIAL_DECL_REFS: 3581 // Later tables overwrite earlier ones. 3582 // FIXME: Modules will have trouble with this. 3583 CUDASpecialDeclRefs.clear(); 3584 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3585 CUDASpecialDeclRefs.push_back(getGlobalDeclID(F, Record[I])); 3586 break; 3587 3588 case HEADER_SEARCH_TABLE: 3589 F.HeaderFileInfoTableData = Blob.data(); 3590 F.LocalNumHeaderFileInfos = Record[1]; 3591 if (Record[0]) { 3592 F.HeaderFileInfoTable 3593 = HeaderFileInfoLookupTable::Create( 3594 (const unsigned char *)F.HeaderFileInfoTableData + Record[0], 3595 (const unsigned char *)F.HeaderFileInfoTableData, 3596 HeaderFileInfoTrait(*this, F, 3597 &PP.getHeaderSearchInfo(), 3598 Blob.data() + Record[2])); 3599 3600 PP.getHeaderSearchInfo().SetExternalSource(this); 3601 if (!PP.getHeaderSearchInfo().getExternalLookup()) 3602 PP.getHeaderSearchInfo().SetExternalLookup(this); 3603 } 3604 break; 3605 3606 case FP_PRAGMA_OPTIONS: 3607 // Later tables overwrite earlier ones. 3608 FPPragmaOptions.swap(Record); 3609 break; 3610 3611 case OPENCL_EXTENSIONS: 3612 for (unsigned I = 0, E = Record.size(); I != E; ) { 3613 auto Name = ReadString(Record, I); 3614 auto &OptInfo = OpenCLExtensions.OptMap[Name]; 3615 OptInfo.Supported = Record[I++] != 0; 3616 OptInfo.Enabled = Record[I++] != 0; 3617 OptInfo.WithPragma = Record[I++] != 0; 3618 OptInfo.Avail = Record[I++]; 3619 OptInfo.Core = Record[I++]; 3620 OptInfo.Opt = Record[I++]; 3621 } 3622 break; 3623 3624 case TENTATIVE_DEFINITIONS: 3625 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3626 TentativeDefinitions.push_back(getGlobalDeclID(F, Record[I])); 3627 break; 3628 3629 case KNOWN_NAMESPACES: 3630 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3631 KnownNamespaces.push_back(getGlobalDeclID(F, Record[I])); 3632 break; 3633 3634 case UNDEFINED_BUT_USED: 3635 if (UndefinedButUsed.size() % 2 != 0) 3636 return llvm::createStringError(std::errc::illegal_byte_sequence, 3637 "Invalid existing UndefinedButUsed"); 3638 3639 if (Record.size() % 2 != 0) 3640 return llvm::createStringError(std::errc::illegal_byte_sequence, 3641 "invalid undefined-but-used record"); 3642 for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { 3643 UndefinedButUsed.push_back(getGlobalDeclID(F, Record[I++])); 3644 UndefinedButUsed.push_back( 3645 ReadSourceLocation(F, Record, I).getRawEncoding()); 3646 } 3647 break; 3648 3649 case DELETE_EXPRS_TO_ANALYZE: 3650 for (unsigned I = 0, N = Record.size(); I != N;) { 3651 DelayedDeleteExprs.push_back(getGlobalDeclID(F, Record[I++])); 3652 const uint64_t Count = Record[I++]; 3653 DelayedDeleteExprs.push_back(Count); 3654 for (uint64_t C = 0; C < Count; ++C) { 3655 DelayedDeleteExprs.push_back(ReadSourceLocation(F, Record, I).getRawEncoding()); 3656 bool IsArrayForm = Record[I++] == 1; 3657 DelayedDeleteExprs.push_back(IsArrayForm); 3658 } 3659 } 3660 break; 3661 3662 case IMPORTED_MODULES: 3663 if (!F.isModule()) { 3664 // If we aren't loading a module (which has its own exports), make 3665 // all of the imported modules visible. 3666 // FIXME: Deal with macros-only imports. 3667 for (unsigned I = 0, N = Record.size(); I != N; /**/) { 3668 unsigned GlobalID = getGlobalSubmoduleID(F, Record[I++]); 3669 SourceLocation Loc = ReadSourceLocation(F, Record, I); 3670 if (GlobalID) { 3671 ImportedModules.push_back(ImportedSubmodule(GlobalID, Loc)); 3672 if (DeserializationListener) 3673 DeserializationListener->ModuleImportRead(GlobalID, Loc); 3674 } 3675 } 3676 } 3677 break; 3678 3679 case MACRO_OFFSET: { 3680 if (F.LocalNumMacros != 0) 3681 return llvm::createStringError( 3682 std::errc::illegal_byte_sequence, 3683 "duplicate MACRO_OFFSET record in AST file"); 3684 F.MacroOffsets = (const uint32_t *)Blob.data(); 3685 F.LocalNumMacros = Record[0]; 3686 unsigned LocalBaseMacroID = Record[1]; 3687 F.MacroOffsetsBase = Record[2] + F.ASTBlockStartOffset; 3688 F.BaseMacroID = getTotalNumMacros(); 3689 3690 if (F.LocalNumMacros > 0) { 3691 // Introduce the global -> local mapping for macros within this module. 3692 GlobalMacroMap.insert(std::make_pair(getTotalNumMacros() + 1, &F)); 3693 3694 // Introduce the local -> global mapping for macros within this module. 3695 F.MacroRemap.insertOrReplace( 3696 std::make_pair(LocalBaseMacroID, 3697 F.BaseMacroID - LocalBaseMacroID)); 3698 3699 MacrosLoaded.resize(MacrosLoaded.size() + F.LocalNumMacros); 3700 } 3701 break; 3702 } 3703 3704 case LATE_PARSED_TEMPLATE: 3705 LateParsedTemplates.emplace_back( 3706 std::piecewise_construct, std::forward_as_tuple(&F), 3707 std::forward_as_tuple(Record.begin(), Record.end())); 3708 break; 3709 3710 case OPTIMIZE_PRAGMA_OPTIONS: 3711 if (Record.size() != 1) 3712 return llvm::createStringError(std::errc::illegal_byte_sequence, 3713 "invalid pragma optimize record"); 3714 OptimizeOffPragmaLocation = ReadSourceLocation(F, Record[0]); 3715 break; 3716 3717 case MSSTRUCT_PRAGMA_OPTIONS: 3718 if (Record.size() != 1) 3719 return llvm::createStringError(std::errc::illegal_byte_sequence, 3720 "invalid pragma ms_struct record"); 3721 PragmaMSStructState = Record[0]; 3722 break; 3723 3724 case POINTERS_TO_MEMBERS_PRAGMA_OPTIONS: 3725 if (Record.size() != 2) 3726 return llvm::createStringError( 3727 std::errc::illegal_byte_sequence, 3728 "invalid pragma pointers to members record"); 3729 PragmaMSPointersToMembersState = Record[0]; 3730 PointersToMembersPragmaLocation = ReadSourceLocation(F, Record[1]); 3731 break; 3732 3733 case UNUSED_LOCAL_TYPEDEF_NAME_CANDIDATES: 3734 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3735 UnusedLocalTypedefNameCandidates.push_back( 3736 getGlobalDeclID(F, Record[I])); 3737 break; 3738 3739 case CUDA_PRAGMA_FORCE_HOST_DEVICE_DEPTH: 3740 if (Record.size() != 1) 3741 return llvm::createStringError(std::errc::illegal_byte_sequence, 3742 "invalid cuda pragma options record"); 3743 ForceCUDAHostDeviceDepth = Record[0]; 3744 break; 3745 3746 case ALIGN_PACK_PRAGMA_OPTIONS: { 3747 if (Record.size() < 3) 3748 return llvm::createStringError(std::errc::illegal_byte_sequence, 3749 "invalid pragma pack record"); 3750 PragmaAlignPackCurrentValue = ReadAlignPackInfo(Record[0]); 3751 PragmaAlignPackCurrentLocation = ReadSourceLocation(F, Record[1]); 3752 unsigned NumStackEntries = Record[2]; 3753 unsigned Idx = 3; 3754 // Reset the stack when importing a new module. 3755 PragmaAlignPackStack.clear(); 3756 for (unsigned I = 0; I < NumStackEntries; ++I) { 3757 PragmaAlignPackStackEntry Entry; 3758 Entry.Value = ReadAlignPackInfo(Record[Idx++]); 3759 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3760 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3761 PragmaAlignPackStrings.push_back(ReadString(Record, Idx)); 3762 Entry.SlotLabel = PragmaAlignPackStrings.back(); 3763 PragmaAlignPackStack.push_back(Entry); 3764 } 3765 break; 3766 } 3767 3768 case FLOAT_CONTROL_PRAGMA_OPTIONS: { 3769 if (Record.size() < 3) 3770 return llvm::createStringError(std::errc::illegal_byte_sequence, 3771 "invalid pragma float control record"); 3772 FpPragmaCurrentValue = FPOptionsOverride::getFromOpaqueInt(Record[0]); 3773 FpPragmaCurrentLocation = ReadSourceLocation(F, Record[1]); 3774 unsigned NumStackEntries = Record[2]; 3775 unsigned Idx = 3; 3776 // Reset the stack when importing a new module. 3777 FpPragmaStack.clear(); 3778 for (unsigned I = 0; I < NumStackEntries; ++I) { 3779 FpPragmaStackEntry Entry; 3780 Entry.Value = FPOptionsOverride::getFromOpaqueInt(Record[Idx++]); 3781 Entry.Location = ReadSourceLocation(F, Record[Idx++]); 3782 Entry.PushLocation = ReadSourceLocation(F, Record[Idx++]); 3783 FpPragmaStrings.push_back(ReadString(Record, Idx)); 3784 Entry.SlotLabel = FpPragmaStrings.back(); 3785 FpPragmaStack.push_back(Entry); 3786 } 3787 break; 3788 } 3789 3790 case DECLS_TO_CHECK_FOR_DEFERRED_DIAGS: 3791 for (unsigned I = 0, N = Record.size(); I != N; ++I) 3792 DeclsToCheckForDeferredDiags.insert(getGlobalDeclID(F, Record[I])); 3793 break; 3794 } 3795 } 3796 } 3797 3798 void ASTReader::ReadModuleOffsetMap(ModuleFile &F) const { 3799 assert(!F.ModuleOffsetMap.empty() && "no module offset map to read"); 3800 3801 // Additional remapping information. 3802 const unsigned char *Data = (const unsigned char*)F.ModuleOffsetMap.data(); 3803 const unsigned char *DataEnd = Data + F.ModuleOffsetMap.size(); 3804 F.ModuleOffsetMap = StringRef(); 3805 3806 // If we see this entry before SOURCE_LOCATION_OFFSETS, add placeholders. 3807 if (F.SLocRemap.find(0) == F.SLocRemap.end()) { 3808 F.SLocRemap.insert(std::make_pair(0U, 0)); 3809 F.SLocRemap.insert(std::make_pair(2U, 1)); 3810 } 3811 3812 // Continuous range maps we may be updating in our module. 3813 using SLocRemapBuilder = 3814 ContinuousRangeMap<SourceLocation::UIntTy, SourceLocation::IntTy, 3815 2>::Builder; 3816 using RemapBuilder = ContinuousRangeMap<uint32_t, int, 2>::Builder; 3817 SLocRemapBuilder SLocRemap(F.SLocRemap); 3818 RemapBuilder IdentifierRemap(F.IdentifierRemap); 3819 RemapBuilder MacroRemap(F.MacroRemap); 3820 RemapBuilder PreprocessedEntityRemap(F.PreprocessedEntityRemap); 3821 RemapBuilder SubmoduleRemap(F.SubmoduleRemap); 3822 RemapBuilder SelectorRemap(F.SelectorRemap); 3823 RemapBuilder DeclRemap(F.DeclRemap); 3824 RemapBuilder TypeRemap(F.TypeRemap); 3825 3826 while (Data < DataEnd) { 3827 // FIXME: Looking up dependency modules by filename is horrible. Let's 3828 // start fixing this with prebuilt, explicit and implicit modules and see 3829 // how it goes... 3830 using namespace llvm::support; 3831 ModuleKind Kind = static_cast<ModuleKind>( 3832 endian::readNext<uint8_t, little, unaligned>(Data)); 3833 uint16_t Len = endian::readNext<uint16_t, little, unaligned>(Data); 3834 StringRef Name = StringRef((const char*)Data, Len); 3835 Data += Len; 3836 ModuleFile *OM = (Kind == MK_PrebuiltModule || Kind == MK_ExplicitModule || 3837 Kind == MK_ImplicitModule 3838 ? ModuleMgr.lookupByModuleName(Name) 3839 : ModuleMgr.lookupByFileName(Name)); 3840 if (!OM) { 3841 std::string Msg = 3842 "SourceLocation remap refers to unknown module, cannot find "; 3843 Msg.append(std::string(Name)); 3844 Error(Msg); 3845 return; 3846 } 3847 3848 SourceLocation::UIntTy SLocOffset = 3849 endian::readNext<uint32_t, little, unaligned>(Data); 3850 uint32_t IdentifierIDOffset = 3851 endian::readNext<uint32_t, little, unaligned>(Data); 3852 uint32_t MacroIDOffset = 3853 endian::readNext<uint32_t, little, unaligned>(Data); 3854 uint32_t PreprocessedEntityIDOffset = 3855 endian::readNext<uint32_t, little, unaligned>(Data); 3856 uint32_t SubmoduleIDOffset = 3857 endian::readNext<uint32_t, little, unaligned>(Data); 3858 uint32_t SelectorIDOffset = 3859 endian::readNext<uint32_t, little, unaligned>(Data); 3860 uint32_t DeclIDOffset = 3861 endian::readNext<uint32_t, little, unaligned>(Data); 3862 uint32_t TypeIndexOffset = 3863 endian::readNext<uint32_t, little, unaligned>(Data); 3864 3865 auto mapOffset = [&](uint32_t Offset, uint32_t BaseOffset, 3866 RemapBuilder &Remap) { 3867 constexpr uint32_t None = std::numeric_limits<uint32_t>::max(); 3868 if (Offset != None) 3869 Remap.insert(std::make_pair(Offset, 3870 static_cast<int>(BaseOffset - Offset))); 3871 }; 3872 3873 constexpr SourceLocation::UIntTy SLocNone = 3874 std::numeric_limits<SourceLocation::UIntTy>::max(); 3875 if (SLocOffset != SLocNone) 3876 SLocRemap.insert(std::make_pair( 3877 SLocOffset, static_cast<SourceLocation::IntTy>( 3878 OM->SLocEntryBaseOffset - SLocOffset))); 3879 3880 mapOffset(IdentifierIDOffset, OM->BaseIdentifierID, IdentifierRemap); 3881 mapOffset(MacroIDOffset, OM->BaseMacroID, MacroRemap); 3882 mapOffset(PreprocessedEntityIDOffset, OM->BasePreprocessedEntityID, 3883 PreprocessedEntityRemap); 3884 mapOffset(SubmoduleIDOffset, OM->BaseSubmoduleID, SubmoduleRemap); 3885 mapOffset(SelectorIDOffset, OM->BaseSelectorID, SelectorRemap); 3886 mapOffset(DeclIDOffset, OM->BaseDeclID, DeclRemap); 3887 mapOffset(TypeIndexOffset, OM->BaseTypeIndex, TypeRemap); 3888 3889 // Global -> local mappings. 3890 F.GlobalToLocalDeclIDs[OM] = DeclIDOffset; 3891 } 3892 } 3893 3894 ASTReader::ASTReadResult 3895 ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F, 3896 const ModuleFile *ImportedBy, 3897 unsigned ClientLoadCapabilities) { 3898 unsigned Idx = 0; 3899 F.ModuleMapPath = ReadPath(F, Record, Idx); 3900 3901 // Try to resolve ModuleName in the current header search context and 3902 // verify that it is found in the same module map file as we saved. If the 3903 // top-level AST file is a main file, skip this check because there is no 3904 // usable header search context. 3905 assert(!F.ModuleName.empty() && 3906 "MODULE_NAME should come before MODULE_MAP_FILE"); 3907 if (F.Kind == MK_ImplicitModule && ModuleMgr.begin()->Kind != MK_MainFile) { 3908 // An implicitly-loaded module file should have its module listed in some 3909 // module map file that we've already loaded. 3910 Module *M = 3911 PP.getHeaderSearchInfo().lookupModule(F.ModuleName, F.ImportLoc); 3912 auto &Map = PP.getHeaderSearchInfo().getModuleMap(); 3913 const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr; 3914 // Don't emit module relocation error if we have -fno-validate-pch 3915 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 3916 DisableValidationForModuleKind::Module) && 3917 !ModMap) { 3918 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) { 3919 if (auto ASTFE = M ? M->getASTFile() : None) { 3920 // This module was defined by an imported (explicit) module. 3921 Diag(diag::err_module_file_conflict) << F.ModuleName << F.FileName 3922 << ASTFE->getName(); 3923 } else { 3924 // This module was built with a different module map. 3925 Diag(diag::err_imported_module_not_found) 3926 << F.ModuleName << F.FileName 3927 << (ImportedBy ? ImportedBy->FileName : "") << F.ModuleMapPath 3928 << !ImportedBy; 3929 // In case it was imported by a PCH, there's a chance the user is 3930 // just missing to include the search path to the directory containing 3931 // the modulemap. 3932 if (ImportedBy && ImportedBy->Kind == MK_PCH) 3933 Diag(diag::note_imported_by_pch_module_not_found) 3934 << llvm::sys::path::parent_path(F.ModuleMapPath); 3935 } 3936 } 3937 return OutOfDate; 3938 } 3939 3940 assert(M && M->Name == F.ModuleName && "found module with different name"); 3941 3942 // Check the primary module map file. 3943 auto StoredModMap = FileMgr.getFile(F.ModuleMapPath); 3944 if (!StoredModMap || *StoredModMap != ModMap) { 3945 assert(ModMap && "found module is missing module map file"); 3946 assert((ImportedBy || F.Kind == MK_ImplicitModule) && 3947 "top-level import should be verified"); 3948 bool NotImported = F.Kind == MK_ImplicitModule && !ImportedBy; 3949 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3950 Diag(diag::err_imported_module_modmap_changed) 3951 << F.ModuleName << (NotImported ? F.FileName : ImportedBy->FileName) 3952 << ModMap->getName() << F.ModuleMapPath << NotImported; 3953 return OutOfDate; 3954 } 3955 3956 llvm::SmallPtrSet<const FileEntry *, 1> AdditionalStoredMaps; 3957 for (unsigned I = 0, N = Record[Idx++]; I < N; ++I) { 3958 // FIXME: we should use input files rather than storing names. 3959 std::string Filename = ReadPath(F, Record, Idx); 3960 auto SF = FileMgr.getFile(Filename, false, false); 3961 if (!SF) { 3962 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3963 Error("could not find file '" + Filename +"' referenced by AST file"); 3964 return OutOfDate; 3965 } 3966 AdditionalStoredMaps.insert(*SF); 3967 } 3968 3969 // Check any additional module map files (e.g. module.private.modulemap) 3970 // that are not in the pcm. 3971 if (auto *AdditionalModuleMaps = Map.getAdditionalModuleMapFiles(M)) { 3972 for (const FileEntry *ModMap : *AdditionalModuleMaps) { 3973 // Remove files that match 3974 // Note: SmallPtrSet::erase is really remove 3975 if (!AdditionalStoredMaps.erase(ModMap)) { 3976 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3977 Diag(diag::err_module_different_modmap) 3978 << F.ModuleName << /*new*/0 << ModMap->getName(); 3979 return OutOfDate; 3980 } 3981 } 3982 } 3983 3984 // Check any additional module map files that are in the pcm, but not 3985 // found in header search. Cases that match are already removed. 3986 for (const FileEntry *ModMap : AdditionalStoredMaps) { 3987 if (!canRecoverFromOutOfDate(F.FileName, ClientLoadCapabilities)) 3988 Diag(diag::err_module_different_modmap) 3989 << F.ModuleName << /*not new*/1 << ModMap->getName(); 3990 return OutOfDate; 3991 } 3992 } 3993 3994 if (Listener) 3995 Listener->ReadModuleMapFile(F.ModuleMapPath); 3996 return Success; 3997 } 3998 3999 /// Move the given method to the back of the global list of methods. 4000 static void moveMethodToBackOfGlobalList(Sema &S, ObjCMethodDecl *Method) { 4001 // Find the entry for this selector in the method pool. 4002 Sema::GlobalMethodPool::iterator Known 4003 = S.MethodPool.find(Method->getSelector()); 4004 if (Known == S.MethodPool.end()) 4005 return; 4006 4007 // Retrieve the appropriate method list. 4008 ObjCMethodList &Start = Method->isInstanceMethod()? Known->second.first 4009 : Known->second.second; 4010 bool Found = false; 4011 for (ObjCMethodList *List = &Start; List; List = List->getNext()) { 4012 if (!Found) { 4013 if (List->getMethod() == Method) { 4014 Found = true; 4015 } else { 4016 // Keep searching. 4017 continue; 4018 } 4019 } 4020 4021 if (List->getNext()) 4022 List->setMethod(List->getNext()->getMethod()); 4023 else 4024 List->setMethod(Method); 4025 } 4026 } 4027 4028 void ASTReader::makeNamesVisible(const HiddenNames &Names, Module *Owner) { 4029 assert(Owner->NameVisibility != Module::Hidden && "nothing to make visible?"); 4030 for (Decl *D : Names) { 4031 bool wasHidden = !D->isUnconditionallyVisible(); 4032 D->setVisibleDespiteOwningModule(); 4033 4034 if (wasHidden && SemaObj) { 4035 if (ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(D)) { 4036 moveMethodToBackOfGlobalList(*SemaObj, Method); 4037 } 4038 } 4039 } 4040 } 4041 4042 void ASTReader::makeModuleVisible(Module *Mod, 4043 Module::NameVisibilityKind NameVisibility, 4044 SourceLocation ImportLoc) { 4045 llvm::SmallPtrSet<Module *, 4> Visited; 4046 SmallVector<Module *, 4> Stack; 4047 Stack.push_back(Mod); 4048 while (!Stack.empty()) { 4049 Mod = Stack.pop_back_val(); 4050 4051 if (NameVisibility <= Mod->NameVisibility) { 4052 // This module already has this level of visibility (or greater), so 4053 // there is nothing more to do. 4054 continue; 4055 } 4056 4057 if (Mod->isUnimportable()) { 4058 // Modules that aren't importable cannot be made visible. 4059 continue; 4060 } 4061 4062 // Update the module's name visibility. 4063 Mod->NameVisibility = NameVisibility; 4064 4065 // If we've already deserialized any names from this module, 4066 // mark them as visible. 4067 HiddenNamesMapType::iterator Hidden = HiddenNamesMap.find(Mod); 4068 if (Hidden != HiddenNamesMap.end()) { 4069 auto HiddenNames = std::move(*Hidden); 4070 HiddenNamesMap.erase(Hidden); 4071 makeNamesVisible(HiddenNames.second, HiddenNames.first); 4072 assert(HiddenNamesMap.find(Mod) == HiddenNamesMap.end() && 4073 "making names visible added hidden names"); 4074 } 4075 4076 // Push any exported modules onto the stack to be marked as visible. 4077 SmallVector<Module *, 16> Exports; 4078 Mod->getExportedModules(Exports); 4079 for (SmallVectorImpl<Module *>::iterator 4080 I = Exports.begin(), E = Exports.end(); I != E; ++I) { 4081 Module *Exported = *I; 4082 if (Visited.insert(Exported).second) 4083 Stack.push_back(Exported); 4084 } 4085 } 4086 } 4087 4088 /// We've merged the definition \p MergedDef into the existing definition 4089 /// \p Def. Ensure that \p Def is made visible whenever \p MergedDef is made 4090 /// visible. 4091 void ASTReader::mergeDefinitionVisibility(NamedDecl *Def, 4092 NamedDecl *MergedDef) { 4093 if (!Def->isUnconditionallyVisible()) { 4094 // If MergedDef is visible or becomes visible, make the definition visible. 4095 if (MergedDef->isUnconditionallyVisible()) 4096 Def->setVisibleDespiteOwningModule(); 4097 else { 4098 getContext().mergeDefinitionIntoModule( 4099 Def, MergedDef->getImportedOwningModule(), 4100 /*NotifyListeners*/ false); 4101 PendingMergedDefinitionsToDeduplicate.insert(Def); 4102 } 4103 } 4104 } 4105 4106 bool ASTReader::loadGlobalIndex() { 4107 if (GlobalIndex) 4108 return false; 4109 4110 if (TriedLoadingGlobalIndex || !UseGlobalIndex || 4111 !PP.getLangOpts().Modules) 4112 return true; 4113 4114 // Try to load the global index. 4115 TriedLoadingGlobalIndex = true; 4116 StringRef ModuleCachePath 4117 = getPreprocessor().getHeaderSearchInfo().getModuleCachePath(); 4118 std::pair<GlobalModuleIndex *, llvm::Error> Result = 4119 GlobalModuleIndex::readIndex(ModuleCachePath); 4120 if (llvm::Error Err = std::move(Result.second)) { 4121 assert(!Result.first); 4122 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 4123 return true; 4124 } 4125 4126 GlobalIndex.reset(Result.first); 4127 ModuleMgr.setGlobalIndex(GlobalIndex.get()); 4128 return false; 4129 } 4130 4131 bool ASTReader::isGlobalIndexUnavailable() const { 4132 return PP.getLangOpts().Modules && UseGlobalIndex && 4133 !hasGlobalIndex() && TriedLoadingGlobalIndex; 4134 } 4135 4136 static void updateModuleTimestamp(ModuleFile &MF) { 4137 // Overwrite the timestamp file contents so that file's mtime changes. 4138 std::string TimestampFilename = MF.getTimestampFilename(); 4139 std::error_code EC; 4140 llvm::raw_fd_ostream OS(TimestampFilename, EC, 4141 llvm::sys::fs::OF_TextWithCRLF); 4142 if (EC) 4143 return; 4144 OS << "Timestamp file\n"; 4145 OS.close(); 4146 OS.clear_error(); // Avoid triggering a fatal error. 4147 } 4148 4149 /// Given a cursor at the start of an AST file, scan ahead and drop the 4150 /// cursor into the start of the given block ID, returning false on success and 4151 /// true on failure. 4152 static bool SkipCursorToBlock(BitstreamCursor &Cursor, unsigned BlockID) { 4153 while (true) { 4154 Expected<llvm::BitstreamEntry> MaybeEntry = Cursor.advance(); 4155 if (!MaybeEntry) { 4156 // FIXME this drops errors on the floor. 4157 consumeError(MaybeEntry.takeError()); 4158 return true; 4159 } 4160 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4161 4162 switch (Entry.Kind) { 4163 case llvm::BitstreamEntry::Error: 4164 case llvm::BitstreamEntry::EndBlock: 4165 return true; 4166 4167 case llvm::BitstreamEntry::Record: 4168 // Ignore top-level records. 4169 if (Expected<unsigned> Skipped = Cursor.skipRecord(Entry.ID)) 4170 break; 4171 else { 4172 // FIXME this drops errors on the floor. 4173 consumeError(Skipped.takeError()); 4174 return true; 4175 } 4176 4177 case llvm::BitstreamEntry::SubBlock: 4178 if (Entry.ID == BlockID) { 4179 if (llvm::Error Err = Cursor.EnterSubBlock(BlockID)) { 4180 // FIXME this drops the error on the floor. 4181 consumeError(std::move(Err)); 4182 return true; 4183 } 4184 // Found it! 4185 return false; 4186 } 4187 4188 if (llvm::Error Err = Cursor.SkipBlock()) { 4189 // FIXME this drops the error on the floor. 4190 consumeError(std::move(Err)); 4191 return true; 4192 } 4193 } 4194 } 4195 } 4196 4197 ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName, 4198 ModuleKind Type, 4199 SourceLocation ImportLoc, 4200 unsigned ClientLoadCapabilities, 4201 SmallVectorImpl<ImportedSubmodule> *Imported) { 4202 llvm::SaveAndRestore<SourceLocation> 4203 SetCurImportLocRAII(CurrentImportLoc, ImportLoc); 4204 llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII( 4205 CurrentDeserializingModuleKind, Type); 4206 4207 // Defer any pending actions until we get to the end of reading the AST file. 4208 Deserializing AnASTFile(this); 4209 4210 // Bump the generation number. 4211 unsigned PreviousGeneration = 0; 4212 if (ContextObj) 4213 PreviousGeneration = incrementGeneration(*ContextObj); 4214 4215 unsigned NumModules = ModuleMgr.size(); 4216 SmallVector<ImportedModule, 4> Loaded; 4217 if (ASTReadResult ReadResult = 4218 ReadASTCore(FileName, Type, ImportLoc, 4219 /*ImportedBy=*/nullptr, Loaded, 0, 0, ASTFileSignature(), 4220 ClientLoadCapabilities)) { 4221 ModuleMgr.removeModules(ModuleMgr.begin() + NumModules, 4222 PP.getLangOpts().Modules 4223 ? &PP.getHeaderSearchInfo().getModuleMap() 4224 : nullptr); 4225 4226 // If we find that any modules are unusable, the global index is going 4227 // to be out-of-date. Just remove it. 4228 GlobalIndex.reset(); 4229 ModuleMgr.setGlobalIndex(nullptr); 4230 return ReadResult; 4231 } 4232 4233 // Here comes stuff that we only do once the entire chain is loaded. Do *not* 4234 // remove modules from this point. Various fields are updated during reading 4235 // the AST block and removing the modules would result in dangling pointers. 4236 // They are generally only incidentally dereferenced, ie. a binary search 4237 // runs over `GlobalSLocEntryMap`, which could cause an invalid module to 4238 // be dereferenced but it wouldn't actually be used. 4239 4240 // Load the AST blocks of all of the modules that we loaded. We can still 4241 // hit errors parsing the ASTs at this point. 4242 for (ImportedModule &M : Loaded) { 4243 ModuleFile &F = *M.Mod; 4244 4245 // Read the AST block. 4246 if (llvm::Error Err = ReadASTBlock(F, ClientLoadCapabilities)) { 4247 Error(std::move(Err)); 4248 return Failure; 4249 } 4250 4251 // The AST block should always have a definition for the main module. 4252 if (F.isModule() && !F.DidReadTopLevelSubmodule) { 4253 Error(diag::err_module_file_missing_top_level_submodule, F.FileName); 4254 return Failure; 4255 } 4256 4257 // Read the extension blocks. 4258 while (!SkipCursorToBlock(F.Stream, EXTENSION_BLOCK_ID)) { 4259 if (llvm::Error Err = ReadExtensionBlock(F)) { 4260 Error(std::move(Err)); 4261 return Failure; 4262 } 4263 } 4264 4265 // Once read, set the ModuleFile bit base offset and update the size in 4266 // bits of all files we've seen. 4267 F.GlobalBitOffset = TotalModulesSizeInBits; 4268 TotalModulesSizeInBits += F.SizeInBits; 4269 GlobalBitOffsetsMap.insert(std::make_pair(F.GlobalBitOffset, &F)); 4270 } 4271 4272 // Preload source locations and interesting indentifiers. 4273 for (ImportedModule &M : Loaded) { 4274 ModuleFile &F = *M.Mod; 4275 4276 // Preload SLocEntries. 4277 for (unsigned I = 0, N = F.PreloadSLocEntries.size(); I != N; ++I) { 4278 int Index = int(F.PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; 4279 // Load it through the SourceManager and don't call ReadSLocEntry() 4280 // directly because the entry may have already been loaded in which case 4281 // calling ReadSLocEntry() directly would trigger an assertion in 4282 // SourceManager. 4283 SourceMgr.getLoadedSLocEntryByID(Index); 4284 } 4285 4286 // Map the original source file ID into the ID space of the current 4287 // compilation. 4288 if (F.OriginalSourceFileID.isValid()) { 4289 F.OriginalSourceFileID = FileID::get( 4290 F.SLocEntryBaseID + F.OriginalSourceFileID.getOpaqueValue() - 1); 4291 } 4292 4293 // Preload all the pending interesting identifiers by marking them out of 4294 // date. 4295 for (auto Offset : F.PreloadIdentifierOffsets) { 4296 const unsigned char *Data = F.IdentifierTableData + Offset; 4297 4298 ASTIdentifierLookupTrait Trait(*this, F); 4299 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 4300 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 4301 auto &II = PP.getIdentifierTable().getOwn(Key); 4302 II.setOutOfDate(true); 4303 4304 // Mark this identifier as being from an AST file so that we can track 4305 // whether we need to serialize it. 4306 markIdentifierFromAST(*this, II); 4307 4308 // Associate the ID with the identifier so that the writer can reuse it. 4309 auto ID = Trait.ReadIdentifierID(Data + KeyDataLen.first); 4310 SetIdentifierInfo(ID, &II); 4311 } 4312 } 4313 4314 // Setup the import locations and notify the module manager that we've 4315 // committed to these module files. 4316 for (ImportedModule &M : Loaded) { 4317 ModuleFile &F = *M.Mod; 4318 4319 ModuleMgr.moduleFileAccepted(&F); 4320 4321 // Set the import location. 4322 F.DirectImportLoc = ImportLoc; 4323 // FIXME: We assume that locations from PCH / preamble do not need 4324 // any translation. 4325 if (!M.ImportedBy) 4326 F.ImportLoc = M.ImportLoc; 4327 else 4328 F.ImportLoc = TranslateSourceLocation(*M.ImportedBy, M.ImportLoc); 4329 } 4330 4331 if (!PP.getLangOpts().CPlusPlus || 4332 (Type != MK_ImplicitModule && Type != MK_ExplicitModule && 4333 Type != MK_PrebuiltModule)) { 4334 // Mark all of the identifiers in the identifier table as being out of date, 4335 // so that various accessors know to check the loaded modules when the 4336 // identifier is used. 4337 // 4338 // For C++ modules, we don't need information on many identifiers (just 4339 // those that provide macros or are poisoned), so we mark all of 4340 // the interesting ones via PreloadIdentifierOffsets. 4341 for (IdentifierTable::iterator Id = PP.getIdentifierTable().begin(), 4342 IdEnd = PP.getIdentifierTable().end(); 4343 Id != IdEnd; ++Id) 4344 Id->second->setOutOfDate(true); 4345 } 4346 // Mark selectors as out of date. 4347 for (auto Sel : SelectorGeneration) 4348 SelectorOutOfDate[Sel.first] = true; 4349 4350 // Resolve any unresolved module exports. 4351 for (unsigned I = 0, N = UnresolvedModuleRefs.size(); I != N; ++I) { 4352 UnresolvedModuleRef &Unresolved = UnresolvedModuleRefs[I]; 4353 SubmoduleID GlobalID = getGlobalSubmoduleID(*Unresolved.File,Unresolved.ID); 4354 Module *ResolvedMod = getSubmodule(GlobalID); 4355 4356 switch (Unresolved.Kind) { 4357 case UnresolvedModuleRef::Conflict: 4358 if (ResolvedMod) { 4359 Module::Conflict Conflict; 4360 Conflict.Other = ResolvedMod; 4361 Conflict.Message = Unresolved.String.str(); 4362 Unresolved.Mod->Conflicts.push_back(Conflict); 4363 } 4364 continue; 4365 4366 case UnresolvedModuleRef::Import: 4367 if (ResolvedMod) 4368 Unresolved.Mod->Imports.insert(ResolvedMod); 4369 continue; 4370 4371 case UnresolvedModuleRef::Export: 4372 if (ResolvedMod || Unresolved.IsWildcard) 4373 Unresolved.Mod->Exports.push_back( 4374 Module::ExportDecl(ResolvedMod, Unresolved.IsWildcard)); 4375 continue; 4376 } 4377 } 4378 UnresolvedModuleRefs.clear(); 4379 4380 if (Imported) 4381 Imported->append(ImportedModules.begin(), 4382 ImportedModules.end()); 4383 4384 // FIXME: How do we load the 'use'd modules? They may not be submodules. 4385 // Might be unnecessary as use declarations are only used to build the 4386 // module itself. 4387 4388 if (ContextObj) 4389 InitializeContext(); 4390 4391 if (SemaObj) 4392 UpdateSema(); 4393 4394 if (DeserializationListener) 4395 DeserializationListener->ReaderInitialized(this); 4396 4397 ModuleFile &PrimaryModule = ModuleMgr.getPrimaryModule(); 4398 if (PrimaryModule.OriginalSourceFileID.isValid()) { 4399 // If this AST file is a precompiled preamble, then set the 4400 // preamble file ID of the source manager to the file source file 4401 // from which the preamble was built. 4402 if (Type == MK_Preamble) { 4403 SourceMgr.setPreambleFileID(PrimaryModule.OriginalSourceFileID); 4404 } else if (Type == MK_MainFile) { 4405 SourceMgr.setMainFileID(PrimaryModule.OriginalSourceFileID); 4406 } 4407 } 4408 4409 // For any Objective-C class definitions we have already loaded, make sure 4410 // that we load any additional categories. 4411 if (ContextObj) { 4412 for (unsigned I = 0, N = ObjCClassesLoaded.size(); I != N; ++I) { 4413 loadObjCCategories(ObjCClassesLoaded[I]->getGlobalID(), 4414 ObjCClassesLoaded[I], 4415 PreviousGeneration); 4416 } 4417 } 4418 4419 if (PP.getHeaderSearchInfo() 4420 .getHeaderSearchOpts() 4421 .ModulesValidateOncePerBuildSession) { 4422 // Now we are certain that the module and all modules it depends on are 4423 // up to date. Create or update timestamp files for modules that are 4424 // located in the module cache (not for PCH files that could be anywhere 4425 // in the filesystem). 4426 for (unsigned I = 0, N = Loaded.size(); I != N; ++I) { 4427 ImportedModule &M = Loaded[I]; 4428 if (M.Mod->Kind == MK_ImplicitModule) { 4429 updateModuleTimestamp(*M.Mod); 4430 } 4431 } 4432 } 4433 4434 return Success; 4435 } 4436 4437 static ASTFileSignature readASTFileSignature(StringRef PCH); 4438 4439 /// Whether \p Stream doesn't start with the AST/PCH file magic number 'CPCH'. 4440 static llvm::Error doesntStartWithASTFileMagic(BitstreamCursor &Stream) { 4441 // FIXME checking magic headers is done in other places such as 4442 // SerializedDiagnosticReader and GlobalModuleIndex, but error handling isn't 4443 // always done the same. Unify it all with a helper. 4444 if (!Stream.canSkipToPos(4)) 4445 return llvm::createStringError(std::errc::illegal_byte_sequence, 4446 "file too small to contain AST file magic"); 4447 for (unsigned C : {'C', 'P', 'C', 'H'}) 4448 if (Expected<llvm::SimpleBitstreamCursor::word_t> Res = Stream.Read(8)) { 4449 if (Res.get() != C) 4450 return llvm::createStringError( 4451 std::errc::illegal_byte_sequence, 4452 "file doesn't start with AST file magic"); 4453 } else 4454 return Res.takeError(); 4455 return llvm::Error::success(); 4456 } 4457 4458 static unsigned moduleKindForDiagnostic(ModuleKind Kind) { 4459 switch (Kind) { 4460 case MK_PCH: 4461 return 0; // PCH 4462 case MK_ImplicitModule: 4463 case MK_ExplicitModule: 4464 case MK_PrebuiltModule: 4465 return 1; // module 4466 case MK_MainFile: 4467 case MK_Preamble: 4468 return 2; // main source file 4469 } 4470 llvm_unreachable("unknown module kind"); 4471 } 4472 4473 ASTReader::ASTReadResult 4474 ASTReader::ReadASTCore(StringRef FileName, 4475 ModuleKind Type, 4476 SourceLocation ImportLoc, 4477 ModuleFile *ImportedBy, 4478 SmallVectorImpl<ImportedModule> &Loaded, 4479 off_t ExpectedSize, time_t ExpectedModTime, 4480 ASTFileSignature ExpectedSignature, 4481 unsigned ClientLoadCapabilities) { 4482 ModuleFile *M; 4483 std::string ErrorStr; 4484 ModuleManager::AddModuleResult AddResult 4485 = ModuleMgr.addModule(FileName, Type, ImportLoc, ImportedBy, 4486 getGeneration(), ExpectedSize, ExpectedModTime, 4487 ExpectedSignature, readASTFileSignature, 4488 M, ErrorStr); 4489 4490 switch (AddResult) { 4491 case ModuleManager::AlreadyLoaded: 4492 Diag(diag::remark_module_import) 4493 << M->ModuleName << M->FileName << (ImportedBy ? true : false) 4494 << (ImportedBy ? StringRef(ImportedBy->ModuleName) : StringRef()); 4495 return Success; 4496 4497 case ModuleManager::NewlyLoaded: 4498 // Load module file below. 4499 break; 4500 4501 case ModuleManager::Missing: 4502 // The module file was missing; if the client can handle that, return 4503 // it. 4504 if (ClientLoadCapabilities & ARR_Missing) 4505 return Missing; 4506 4507 // Otherwise, return an error. 4508 Diag(diag::err_ast_file_not_found) 4509 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4510 << ErrorStr; 4511 return Failure; 4512 4513 case ModuleManager::OutOfDate: 4514 // We couldn't load the module file because it is out-of-date. If the 4515 // client can handle out-of-date, return it. 4516 if (ClientLoadCapabilities & ARR_OutOfDate) 4517 return OutOfDate; 4518 4519 // Otherwise, return an error. 4520 Diag(diag::err_ast_file_out_of_date) 4521 << moduleKindForDiagnostic(Type) << FileName << !ErrorStr.empty() 4522 << ErrorStr; 4523 return Failure; 4524 } 4525 4526 assert(M && "Missing module file"); 4527 4528 bool ShouldFinalizePCM = false; 4529 auto FinalizeOrDropPCM = llvm::make_scope_exit([&]() { 4530 auto &MC = getModuleManager().getModuleCache(); 4531 if (ShouldFinalizePCM) 4532 MC.finalizePCM(FileName); 4533 else 4534 MC.tryToDropPCM(FileName); 4535 }); 4536 ModuleFile &F = *M; 4537 BitstreamCursor &Stream = F.Stream; 4538 Stream = BitstreamCursor(PCHContainerRdr.ExtractPCH(*F.Buffer)); 4539 F.SizeInBits = F.Buffer->getBufferSize() * 8; 4540 4541 // Sniff for the signature. 4542 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4543 Diag(diag::err_ast_file_invalid) 4544 << moduleKindForDiagnostic(Type) << FileName << std::move(Err); 4545 return Failure; 4546 } 4547 4548 // This is used for compatibility with older PCH formats. 4549 bool HaveReadControlBlock = false; 4550 while (true) { 4551 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4552 if (!MaybeEntry) { 4553 Error(MaybeEntry.takeError()); 4554 return Failure; 4555 } 4556 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4557 4558 switch (Entry.Kind) { 4559 case llvm::BitstreamEntry::Error: 4560 case llvm::BitstreamEntry::Record: 4561 case llvm::BitstreamEntry::EndBlock: 4562 Error("invalid record at top-level of AST file"); 4563 return Failure; 4564 4565 case llvm::BitstreamEntry::SubBlock: 4566 break; 4567 } 4568 4569 switch (Entry.ID) { 4570 case CONTROL_BLOCK_ID: 4571 HaveReadControlBlock = true; 4572 switch (ReadControlBlock(F, Loaded, ImportedBy, ClientLoadCapabilities)) { 4573 case Success: 4574 // Check that we didn't try to load a non-module AST file as a module. 4575 // 4576 // FIXME: Should we also perform the converse check? Loading a module as 4577 // a PCH file sort of works, but it's a bit wonky. 4578 if ((Type == MK_ImplicitModule || Type == MK_ExplicitModule || 4579 Type == MK_PrebuiltModule) && 4580 F.ModuleName.empty()) { 4581 auto Result = (Type == MK_ImplicitModule) ? OutOfDate : Failure; 4582 if (Result != OutOfDate || 4583 (ClientLoadCapabilities & ARR_OutOfDate) == 0) 4584 Diag(diag::err_module_file_not_module) << FileName; 4585 return Result; 4586 } 4587 break; 4588 4589 case Failure: return Failure; 4590 case Missing: return Missing; 4591 case OutOfDate: return OutOfDate; 4592 case VersionMismatch: return VersionMismatch; 4593 case ConfigurationMismatch: return ConfigurationMismatch; 4594 case HadErrors: return HadErrors; 4595 } 4596 break; 4597 4598 case AST_BLOCK_ID: 4599 if (!HaveReadControlBlock) { 4600 if ((ClientLoadCapabilities & ARR_VersionMismatch) == 0) 4601 Diag(diag::err_pch_version_too_old); 4602 return VersionMismatch; 4603 } 4604 4605 // Record that we've loaded this module. 4606 Loaded.push_back(ImportedModule(M, ImportedBy, ImportLoc)); 4607 ShouldFinalizePCM = true; 4608 return Success; 4609 4610 case UNHASHED_CONTROL_BLOCK_ID: 4611 // This block is handled using look-ahead during ReadControlBlock. We 4612 // shouldn't get here! 4613 Error("malformed block record in AST file"); 4614 return Failure; 4615 4616 default: 4617 if (llvm::Error Err = Stream.SkipBlock()) { 4618 Error(std::move(Err)); 4619 return Failure; 4620 } 4621 break; 4622 } 4623 } 4624 4625 llvm_unreachable("unexpected break; expected return"); 4626 } 4627 4628 ASTReader::ASTReadResult 4629 ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy, 4630 unsigned ClientLoadCapabilities) { 4631 const HeaderSearchOptions &HSOpts = 4632 PP.getHeaderSearchInfo().getHeaderSearchOpts(); 4633 bool AllowCompatibleConfigurationMismatch = 4634 F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule; 4635 bool DisableValidation = shouldDisableValidationForFile(F); 4636 4637 ASTReadResult Result = readUnhashedControlBlockImpl( 4638 &F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch, 4639 Listener.get(), 4640 WasImportedBy ? false : HSOpts.ModulesValidateDiagnosticOptions); 4641 4642 // If F was directly imported by another module, it's implicitly validated by 4643 // the importing module. 4644 if (DisableValidation || WasImportedBy || 4645 (AllowConfigurationMismatch && Result == ConfigurationMismatch)) 4646 return Success; 4647 4648 if (Result == Failure) { 4649 Error("malformed block record in AST file"); 4650 return Failure; 4651 } 4652 4653 if (Result == OutOfDate && F.Kind == MK_ImplicitModule) { 4654 // If this module has already been finalized in the ModuleCache, we're stuck 4655 // with it; we can only load a single version of each module. 4656 // 4657 // This can happen when a module is imported in two contexts: in one, as a 4658 // user module; in another, as a system module (due to an import from 4659 // another module marked with the [system] flag). It usually indicates a 4660 // bug in the module map: this module should also be marked with [system]. 4661 // 4662 // If -Wno-system-headers (the default), and the first import is as a 4663 // system module, then validation will fail during the as-user import, 4664 // since -Werror flags won't have been validated. However, it's reasonable 4665 // to treat this consistently as a system module. 4666 // 4667 // If -Wsystem-headers, the PCM on disk was built with 4668 // -Wno-system-headers, and the first import is as a user module, then 4669 // validation will fail during the as-system import since the PCM on disk 4670 // doesn't guarantee that -Werror was respected. However, the -Werror 4671 // flags were checked during the initial as-user import. 4672 if (getModuleManager().getModuleCache().isPCMFinal(F.FileName)) { 4673 Diag(diag::warn_module_system_bit_conflict) << F.FileName; 4674 return Success; 4675 } 4676 } 4677 4678 return Result; 4679 } 4680 4681 ASTReader::ASTReadResult ASTReader::readUnhashedControlBlockImpl( 4682 ModuleFile *F, llvm::StringRef StreamData, unsigned ClientLoadCapabilities, 4683 bool AllowCompatibleConfigurationMismatch, ASTReaderListener *Listener, 4684 bool ValidateDiagnosticOptions) { 4685 // Initialize a stream. 4686 BitstreamCursor Stream(StreamData); 4687 4688 // Sniff for the signature. 4689 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 4690 // FIXME this drops the error on the floor. 4691 consumeError(std::move(Err)); 4692 return Failure; 4693 } 4694 4695 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 4696 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 4697 return Failure; 4698 4699 // Read all of the records in the options block. 4700 RecordData Record; 4701 ASTReadResult Result = Success; 4702 while (true) { 4703 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4704 if (!MaybeEntry) { 4705 // FIXME this drops the error on the floor. 4706 consumeError(MaybeEntry.takeError()); 4707 return Failure; 4708 } 4709 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4710 4711 switch (Entry.Kind) { 4712 case llvm::BitstreamEntry::Error: 4713 case llvm::BitstreamEntry::SubBlock: 4714 return Failure; 4715 4716 case llvm::BitstreamEntry::EndBlock: 4717 return Result; 4718 4719 case llvm::BitstreamEntry::Record: 4720 // The interesting case. 4721 break; 4722 } 4723 4724 // Read and process a record. 4725 Record.clear(); 4726 StringRef Blob; 4727 Expected<unsigned> MaybeRecordType = 4728 Stream.readRecord(Entry.ID, Record, &Blob); 4729 if (!MaybeRecordType) { 4730 // FIXME this drops the error. 4731 return Failure; 4732 } 4733 switch ((UnhashedControlBlockRecordTypes)MaybeRecordType.get()) { 4734 case SIGNATURE: 4735 if (F) 4736 F->Signature = ASTFileSignature::create(Record.begin(), Record.end()); 4737 break; 4738 case AST_BLOCK_HASH: 4739 if (F) 4740 F->ASTBlockHash = 4741 ASTFileSignature::create(Record.begin(), Record.end()); 4742 break; 4743 case DIAGNOSTIC_OPTIONS: { 4744 bool Complain = (ClientLoadCapabilities & ARR_OutOfDate) == 0; 4745 if (Listener && ValidateDiagnosticOptions && 4746 !AllowCompatibleConfigurationMismatch && 4747 ParseDiagnosticOptions(Record, Complain, *Listener)) 4748 Result = OutOfDate; // Don't return early. Read the signature. 4749 break; 4750 } 4751 case DIAG_PRAGMA_MAPPINGS: 4752 if (!F) 4753 break; 4754 if (F->PragmaDiagMappings.empty()) 4755 F->PragmaDiagMappings.swap(Record); 4756 else 4757 F->PragmaDiagMappings.insert(F->PragmaDiagMappings.end(), 4758 Record.begin(), Record.end()); 4759 break; 4760 case HEADER_SEARCH_ENTRY_USAGE: 4761 if (!F) 4762 break; 4763 unsigned Count = Record[0]; 4764 const char *Byte = Blob.data(); 4765 F->SearchPathUsage = llvm::BitVector(Count, 0); 4766 for (unsigned I = 0; I < Count; ++Byte) 4767 for (unsigned Bit = 0; Bit < 8 && I < Count; ++Bit, ++I) 4768 if (*Byte & (1 << Bit)) 4769 F->SearchPathUsage[I] = 1; 4770 break; 4771 } 4772 } 4773 } 4774 4775 /// Parse a record and blob containing module file extension metadata. 4776 static bool parseModuleFileExtensionMetadata( 4777 const SmallVectorImpl<uint64_t> &Record, 4778 StringRef Blob, 4779 ModuleFileExtensionMetadata &Metadata) { 4780 if (Record.size() < 4) return true; 4781 4782 Metadata.MajorVersion = Record[0]; 4783 Metadata.MinorVersion = Record[1]; 4784 4785 unsigned BlockNameLen = Record[2]; 4786 unsigned UserInfoLen = Record[3]; 4787 4788 if (BlockNameLen + UserInfoLen > Blob.size()) return true; 4789 4790 Metadata.BlockName = std::string(Blob.data(), Blob.data() + BlockNameLen); 4791 Metadata.UserInfo = std::string(Blob.data() + BlockNameLen, 4792 Blob.data() + BlockNameLen + UserInfoLen); 4793 return false; 4794 } 4795 4796 llvm::Error ASTReader::ReadExtensionBlock(ModuleFile &F) { 4797 BitstreamCursor &Stream = F.Stream; 4798 4799 RecordData Record; 4800 while (true) { 4801 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 4802 if (!MaybeEntry) 4803 return MaybeEntry.takeError(); 4804 llvm::BitstreamEntry Entry = MaybeEntry.get(); 4805 4806 switch (Entry.Kind) { 4807 case llvm::BitstreamEntry::SubBlock: 4808 if (llvm::Error Err = Stream.SkipBlock()) 4809 return Err; 4810 continue; 4811 case llvm::BitstreamEntry::EndBlock: 4812 return llvm::Error::success(); 4813 case llvm::BitstreamEntry::Error: 4814 return llvm::createStringError(std::errc::illegal_byte_sequence, 4815 "malformed block record in AST file"); 4816 case llvm::BitstreamEntry::Record: 4817 break; 4818 } 4819 4820 Record.clear(); 4821 StringRef Blob; 4822 Expected<unsigned> MaybeRecCode = 4823 Stream.readRecord(Entry.ID, Record, &Blob); 4824 if (!MaybeRecCode) 4825 return MaybeRecCode.takeError(); 4826 switch (MaybeRecCode.get()) { 4827 case EXTENSION_METADATA: { 4828 ModuleFileExtensionMetadata Metadata; 4829 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 4830 return llvm::createStringError( 4831 std::errc::illegal_byte_sequence, 4832 "malformed EXTENSION_METADATA in AST file"); 4833 4834 // Find a module file extension with this block name. 4835 auto Known = ModuleFileExtensions.find(Metadata.BlockName); 4836 if (Known == ModuleFileExtensions.end()) break; 4837 4838 // Form a reader. 4839 if (auto Reader = Known->second->createExtensionReader(Metadata, *this, 4840 F, Stream)) { 4841 F.ExtensionReaders.push_back(std::move(Reader)); 4842 } 4843 4844 break; 4845 } 4846 } 4847 } 4848 4849 return llvm::Error::success(); 4850 } 4851 4852 void ASTReader::InitializeContext() { 4853 assert(ContextObj && "no context to initialize"); 4854 ASTContext &Context = *ContextObj; 4855 4856 // If there's a listener, notify them that we "read" the translation unit. 4857 if (DeserializationListener) 4858 DeserializationListener->DeclRead(PREDEF_DECL_TRANSLATION_UNIT_ID, 4859 Context.getTranslationUnitDecl()); 4860 4861 // FIXME: Find a better way to deal with collisions between these 4862 // built-in types. Right now, we just ignore the problem. 4863 4864 // Load the special types. 4865 if (SpecialTypes.size() >= NumSpecialTypeIDs) { 4866 if (unsigned String = SpecialTypes[SPECIAL_TYPE_CF_CONSTANT_STRING]) { 4867 if (!Context.CFConstantStringTypeDecl) 4868 Context.setCFConstantStringType(GetType(String)); 4869 } 4870 4871 if (unsigned File = SpecialTypes[SPECIAL_TYPE_FILE]) { 4872 QualType FileType = GetType(File); 4873 if (FileType.isNull()) { 4874 Error("FILE type is NULL"); 4875 return; 4876 } 4877 4878 if (!Context.FILEDecl) { 4879 if (const TypedefType *Typedef = FileType->getAs<TypedefType>()) 4880 Context.setFILEDecl(Typedef->getDecl()); 4881 else { 4882 const TagType *Tag = FileType->getAs<TagType>(); 4883 if (!Tag) { 4884 Error("Invalid FILE type in AST file"); 4885 return; 4886 } 4887 Context.setFILEDecl(Tag->getDecl()); 4888 } 4889 } 4890 } 4891 4892 if (unsigned Jmp_buf = SpecialTypes[SPECIAL_TYPE_JMP_BUF]) { 4893 QualType Jmp_bufType = GetType(Jmp_buf); 4894 if (Jmp_bufType.isNull()) { 4895 Error("jmp_buf type is NULL"); 4896 return; 4897 } 4898 4899 if (!Context.jmp_bufDecl) { 4900 if (const TypedefType *Typedef = Jmp_bufType->getAs<TypedefType>()) 4901 Context.setjmp_bufDecl(Typedef->getDecl()); 4902 else { 4903 const TagType *Tag = Jmp_bufType->getAs<TagType>(); 4904 if (!Tag) { 4905 Error("Invalid jmp_buf type in AST file"); 4906 return; 4907 } 4908 Context.setjmp_bufDecl(Tag->getDecl()); 4909 } 4910 } 4911 } 4912 4913 if (unsigned Sigjmp_buf = SpecialTypes[SPECIAL_TYPE_SIGJMP_BUF]) { 4914 QualType Sigjmp_bufType = GetType(Sigjmp_buf); 4915 if (Sigjmp_bufType.isNull()) { 4916 Error("sigjmp_buf type is NULL"); 4917 return; 4918 } 4919 4920 if (!Context.sigjmp_bufDecl) { 4921 if (const TypedefType *Typedef = Sigjmp_bufType->getAs<TypedefType>()) 4922 Context.setsigjmp_bufDecl(Typedef->getDecl()); 4923 else { 4924 const TagType *Tag = Sigjmp_bufType->getAs<TagType>(); 4925 assert(Tag && "Invalid sigjmp_buf type in AST file"); 4926 Context.setsigjmp_bufDecl(Tag->getDecl()); 4927 } 4928 } 4929 } 4930 4931 if (unsigned ObjCIdRedef 4932 = SpecialTypes[SPECIAL_TYPE_OBJC_ID_REDEFINITION]) { 4933 if (Context.ObjCIdRedefinitionType.isNull()) 4934 Context.ObjCIdRedefinitionType = GetType(ObjCIdRedef); 4935 } 4936 4937 if (unsigned ObjCClassRedef 4938 = SpecialTypes[SPECIAL_TYPE_OBJC_CLASS_REDEFINITION]) { 4939 if (Context.ObjCClassRedefinitionType.isNull()) 4940 Context.ObjCClassRedefinitionType = GetType(ObjCClassRedef); 4941 } 4942 4943 if (unsigned ObjCSelRedef 4944 = SpecialTypes[SPECIAL_TYPE_OBJC_SEL_REDEFINITION]) { 4945 if (Context.ObjCSelRedefinitionType.isNull()) 4946 Context.ObjCSelRedefinitionType = GetType(ObjCSelRedef); 4947 } 4948 4949 if (unsigned Ucontext_t = SpecialTypes[SPECIAL_TYPE_UCONTEXT_T]) { 4950 QualType Ucontext_tType = GetType(Ucontext_t); 4951 if (Ucontext_tType.isNull()) { 4952 Error("ucontext_t type is NULL"); 4953 return; 4954 } 4955 4956 if (!Context.ucontext_tDecl) { 4957 if (const TypedefType *Typedef = Ucontext_tType->getAs<TypedefType>()) 4958 Context.setucontext_tDecl(Typedef->getDecl()); 4959 else { 4960 const TagType *Tag = Ucontext_tType->getAs<TagType>(); 4961 assert(Tag && "Invalid ucontext_t type in AST file"); 4962 Context.setucontext_tDecl(Tag->getDecl()); 4963 } 4964 } 4965 } 4966 } 4967 4968 ReadPragmaDiagnosticMappings(Context.getDiagnostics()); 4969 4970 // If there were any CUDA special declarations, deserialize them. 4971 if (!CUDASpecialDeclRefs.empty()) { 4972 assert(CUDASpecialDeclRefs.size() == 1 && "More decl refs than expected!"); 4973 Context.setcudaConfigureCallDecl( 4974 cast<FunctionDecl>(GetDecl(CUDASpecialDeclRefs[0]))); 4975 } 4976 4977 // Re-export any modules that were imported by a non-module AST file. 4978 // FIXME: This does not make macro-only imports visible again. 4979 for (auto &Import : ImportedModules) { 4980 if (Module *Imported = getSubmodule(Import.ID)) { 4981 makeModuleVisible(Imported, Module::AllVisible, 4982 /*ImportLoc=*/Import.ImportLoc); 4983 if (Import.ImportLoc.isValid()) 4984 PP.makeModuleVisible(Imported, Import.ImportLoc); 4985 // This updates visibility for Preprocessor only. For Sema, which can be 4986 // nullptr here, we do the same later, in UpdateSema(). 4987 } 4988 } 4989 } 4990 4991 void ASTReader::finalizeForWriting() { 4992 // Nothing to do for now. 4993 } 4994 4995 /// Reads and return the signature record from \p PCH's control block, or 4996 /// else returns 0. 4997 static ASTFileSignature readASTFileSignature(StringRef PCH) { 4998 BitstreamCursor Stream(PCH); 4999 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5000 // FIXME this drops the error on the floor. 5001 consumeError(std::move(Err)); 5002 return ASTFileSignature(); 5003 } 5004 5005 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5006 if (SkipCursorToBlock(Stream, UNHASHED_CONTROL_BLOCK_ID)) 5007 return ASTFileSignature(); 5008 5009 // Scan for SIGNATURE inside the diagnostic options block. 5010 ASTReader::RecordData Record; 5011 while (true) { 5012 Expected<llvm::BitstreamEntry> MaybeEntry = 5013 Stream.advanceSkippingSubblocks(); 5014 if (!MaybeEntry) { 5015 // FIXME this drops the error on the floor. 5016 consumeError(MaybeEntry.takeError()); 5017 return ASTFileSignature(); 5018 } 5019 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5020 5021 if (Entry.Kind != llvm::BitstreamEntry::Record) 5022 return ASTFileSignature(); 5023 5024 Record.clear(); 5025 StringRef Blob; 5026 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5027 if (!MaybeRecord) { 5028 // FIXME this drops the error on the floor. 5029 consumeError(MaybeRecord.takeError()); 5030 return ASTFileSignature(); 5031 } 5032 if (SIGNATURE == MaybeRecord.get()) 5033 return ASTFileSignature::create(Record.begin(), 5034 Record.begin() + ASTFileSignature::size); 5035 } 5036 } 5037 5038 /// Retrieve the name of the original source file name 5039 /// directly from the AST file, without actually loading the AST 5040 /// file. 5041 std::string ASTReader::getOriginalSourceFile( 5042 const std::string &ASTFileName, FileManager &FileMgr, 5043 const PCHContainerReader &PCHContainerRdr, DiagnosticsEngine &Diags) { 5044 // Open the AST file. 5045 auto Buffer = FileMgr.getBufferForFile(ASTFileName); 5046 if (!Buffer) { 5047 Diags.Report(diag::err_fe_unable_to_read_pch_file) 5048 << ASTFileName << Buffer.getError().message(); 5049 return std::string(); 5050 } 5051 5052 // Initialize the stream 5053 BitstreamCursor Stream(PCHContainerRdr.ExtractPCH(**Buffer)); 5054 5055 // Sniff for the signature. 5056 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5057 Diags.Report(diag::err_fe_not_a_pch_file) << ASTFileName << std::move(Err); 5058 return std::string(); 5059 } 5060 5061 // Scan for the CONTROL_BLOCK_ID block. 5062 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) { 5063 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5064 return std::string(); 5065 } 5066 5067 // Scan for ORIGINAL_FILE inside the control block. 5068 RecordData Record; 5069 while (true) { 5070 Expected<llvm::BitstreamEntry> MaybeEntry = 5071 Stream.advanceSkippingSubblocks(); 5072 if (!MaybeEntry) { 5073 // FIXME this drops errors on the floor. 5074 consumeError(MaybeEntry.takeError()); 5075 return std::string(); 5076 } 5077 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5078 5079 if (Entry.Kind == llvm::BitstreamEntry::EndBlock) 5080 return std::string(); 5081 5082 if (Entry.Kind != llvm::BitstreamEntry::Record) { 5083 Diags.Report(diag::err_fe_pch_malformed_block) << ASTFileName; 5084 return std::string(); 5085 } 5086 5087 Record.clear(); 5088 StringRef Blob; 5089 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record, &Blob); 5090 if (!MaybeRecord) { 5091 // FIXME this drops the errors on the floor. 5092 consumeError(MaybeRecord.takeError()); 5093 return std::string(); 5094 } 5095 if (ORIGINAL_FILE == MaybeRecord.get()) 5096 return Blob.str(); 5097 } 5098 } 5099 5100 namespace { 5101 5102 class SimplePCHValidator : public ASTReaderListener { 5103 const LangOptions &ExistingLangOpts; 5104 const TargetOptions &ExistingTargetOpts; 5105 const PreprocessorOptions &ExistingPPOpts; 5106 std::string ExistingModuleCachePath; 5107 FileManager &FileMgr; 5108 5109 public: 5110 SimplePCHValidator(const LangOptions &ExistingLangOpts, 5111 const TargetOptions &ExistingTargetOpts, 5112 const PreprocessorOptions &ExistingPPOpts, 5113 StringRef ExistingModuleCachePath, FileManager &FileMgr) 5114 : ExistingLangOpts(ExistingLangOpts), 5115 ExistingTargetOpts(ExistingTargetOpts), 5116 ExistingPPOpts(ExistingPPOpts), 5117 ExistingModuleCachePath(ExistingModuleCachePath), FileMgr(FileMgr) {} 5118 5119 bool ReadLanguageOptions(const LangOptions &LangOpts, bool Complain, 5120 bool AllowCompatibleDifferences) override { 5121 return checkLanguageOptions(ExistingLangOpts, LangOpts, nullptr, 5122 AllowCompatibleDifferences); 5123 } 5124 5125 bool ReadTargetOptions(const TargetOptions &TargetOpts, bool Complain, 5126 bool AllowCompatibleDifferences) override { 5127 return checkTargetOptions(ExistingTargetOpts, TargetOpts, nullptr, 5128 AllowCompatibleDifferences); 5129 } 5130 5131 bool ReadHeaderSearchOptions(const HeaderSearchOptions &HSOpts, 5132 StringRef SpecificModuleCachePath, 5133 bool Complain) override { 5134 return checkHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5135 ExistingModuleCachePath, nullptr, 5136 ExistingLangOpts, ExistingPPOpts); 5137 } 5138 5139 bool ReadPreprocessorOptions(const PreprocessorOptions &PPOpts, 5140 bool Complain, 5141 std::string &SuggestedPredefines) override { 5142 return checkPreprocessorOptions(ExistingPPOpts, PPOpts, nullptr, FileMgr, 5143 SuggestedPredefines, ExistingLangOpts); 5144 } 5145 }; 5146 5147 } // namespace 5148 5149 bool ASTReader::readASTFileControlBlock( 5150 StringRef Filename, FileManager &FileMgr, 5151 const PCHContainerReader &PCHContainerRdr, 5152 bool FindModuleFileExtensions, 5153 ASTReaderListener &Listener, bool ValidateDiagnosticOptions) { 5154 // Open the AST file. 5155 // FIXME: This allows use of the VFS; we do not allow use of the 5156 // VFS when actually loading a module. 5157 auto Buffer = FileMgr.getBufferForFile(Filename); 5158 if (!Buffer) { 5159 return true; 5160 } 5161 5162 // Initialize the stream 5163 StringRef Bytes = PCHContainerRdr.ExtractPCH(**Buffer); 5164 BitstreamCursor Stream(Bytes); 5165 5166 // Sniff for the signature. 5167 if (llvm::Error Err = doesntStartWithASTFileMagic(Stream)) { 5168 consumeError(std::move(Err)); // FIXME this drops errors on the floor. 5169 return true; 5170 } 5171 5172 // Scan for the CONTROL_BLOCK_ID block. 5173 if (SkipCursorToBlock(Stream, CONTROL_BLOCK_ID)) 5174 return true; 5175 5176 bool NeedsInputFiles = Listener.needsInputFileVisitation(); 5177 bool NeedsSystemInputFiles = Listener.needsSystemInputFileVisitation(); 5178 bool NeedsImports = Listener.needsImportVisitation(); 5179 BitstreamCursor InputFilesCursor; 5180 5181 RecordData Record; 5182 std::string ModuleDir; 5183 bool DoneWithControlBlock = false; 5184 while (!DoneWithControlBlock) { 5185 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5186 if (!MaybeEntry) { 5187 // FIXME this drops the error on the floor. 5188 consumeError(MaybeEntry.takeError()); 5189 return true; 5190 } 5191 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5192 5193 switch (Entry.Kind) { 5194 case llvm::BitstreamEntry::SubBlock: { 5195 switch (Entry.ID) { 5196 case OPTIONS_BLOCK_ID: { 5197 std::string IgnoredSuggestedPredefines; 5198 if (ReadOptionsBlock(Stream, ARR_ConfigurationMismatch | ARR_OutOfDate, 5199 /*AllowCompatibleConfigurationMismatch*/ false, 5200 Listener, IgnoredSuggestedPredefines) != Success) 5201 return true; 5202 break; 5203 } 5204 5205 case INPUT_FILES_BLOCK_ID: 5206 InputFilesCursor = Stream; 5207 if (llvm::Error Err = Stream.SkipBlock()) { 5208 // FIXME this drops the error on the floor. 5209 consumeError(std::move(Err)); 5210 return true; 5211 } 5212 if (NeedsInputFiles && 5213 ReadBlockAbbrevs(InputFilesCursor, INPUT_FILES_BLOCK_ID)) 5214 return true; 5215 break; 5216 5217 default: 5218 if (llvm::Error Err = Stream.SkipBlock()) { 5219 // FIXME this drops the error on the floor. 5220 consumeError(std::move(Err)); 5221 return true; 5222 } 5223 break; 5224 } 5225 5226 continue; 5227 } 5228 5229 case llvm::BitstreamEntry::EndBlock: 5230 DoneWithControlBlock = true; 5231 break; 5232 5233 case llvm::BitstreamEntry::Error: 5234 return true; 5235 5236 case llvm::BitstreamEntry::Record: 5237 break; 5238 } 5239 5240 if (DoneWithControlBlock) break; 5241 5242 Record.clear(); 5243 StringRef Blob; 5244 Expected<unsigned> MaybeRecCode = 5245 Stream.readRecord(Entry.ID, Record, &Blob); 5246 if (!MaybeRecCode) { 5247 // FIXME this drops the error. 5248 return Failure; 5249 } 5250 switch ((ControlRecordTypes)MaybeRecCode.get()) { 5251 case METADATA: 5252 if (Record[0] != VERSION_MAJOR) 5253 return true; 5254 if (Listener.ReadFullVersionInformation(Blob)) 5255 return true; 5256 break; 5257 case MODULE_NAME: 5258 Listener.ReadModuleName(Blob); 5259 break; 5260 case MODULE_DIRECTORY: 5261 ModuleDir = std::string(Blob); 5262 break; 5263 case MODULE_MAP_FILE: { 5264 unsigned Idx = 0; 5265 auto Path = ReadString(Record, Idx); 5266 ResolveImportedPath(Path, ModuleDir); 5267 Listener.ReadModuleMapFile(Path); 5268 break; 5269 } 5270 case INPUT_FILE_OFFSETS: { 5271 if (!NeedsInputFiles) 5272 break; 5273 5274 unsigned NumInputFiles = Record[0]; 5275 unsigned NumUserFiles = Record[1]; 5276 const llvm::support::unaligned_uint64_t *InputFileOffs = 5277 (const llvm::support::unaligned_uint64_t *)Blob.data(); 5278 for (unsigned I = 0; I != NumInputFiles; ++I) { 5279 // Go find this input file. 5280 bool isSystemFile = I >= NumUserFiles; 5281 5282 if (isSystemFile && !NeedsSystemInputFiles) 5283 break; // the rest are system input files 5284 5285 BitstreamCursor &Cursor = InputFilesCursor; 5286 SavedStreamPosition SavedPosition(Cursor); 5287 if (llvm::Error Err = Cursor.JumpToBit(InputFileOffs[I])) { 5288 // FIXME this drops errors on the floor. 5289 consumeError(std::move(Err)); 5290 } 5291 5292 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 5293 if (!MaybeCode) { 5294 // FIXME this drops errors on the floor. 5295 consumeError(MaybeCode.takeError()); 5296 } 5297 unsigned Code = MaybeCode.get(); 5298 5299 RecordData Record; 5300 StringRef Blob; 5301 bool shouldContinue = false; 5302 Expected<unsigned> MaybeRecordType = 5303 Cursor.readRecord(Code, Record, &Blob); 5304 if (!MaybeRecordType) { 5305 // FIXME this drops errors on the floor. 5306 consumeError(MaybeRecordType.takeError()); 5307 } 5308 switch ((InputFileRecordTypes)MaybeRecordType.get()) { 5309 case INPUT_FILE_HASH: 5310 break; 5311 case INPUT_FILE: 5312 bool Overridden = static_cast<bool>(Record[3]); 5313 std::string Filename = std::string(Blob); 5314 ResolveImportedPath(Filename, ModuleDir); 5315 shouldContinue = Listener.visitInputFile( 5316 Filename, isSystemFile, Overridden, /*IsExplicitModule*/false); 5317 break; 5318 } 5319 if (!shouldContinue) 5320 break; 5321 } 5322 break; 5323 } 5324 5325 case IMPORTS: { 5326 if (!NeedsImports) 5327 break; 5328 5329 unsigned Idx = 0, N = Record.size(); 5330 while (Idx < N) { 5331 // Read information about the AST file. 5332 Idx += 5333 1 + 1 + 1 + 1 + 5334 ASTFileSignature::size; // Kind, ImportLoc, Size, ModTime, Signature 5335 std::string ModuleName = ReadString(Record, Idx); 5336 std::string Filename = ReadString(Record, Idx); 5337 ResolveImportedPath(Filename, ModuleDir); 5338 Listener.visitImport(ModuleName, Filename); 5339 } 5340 break; 5341 } 5342 5343 default: 5344 // No other validation to perform. 5345 break; 5346 } 5347 } 5348 5349 // Look for module file extension blocks, if requested. 5350 if (FindModuleFileExtensions) { 5351 BitstreamCursor SavedStream = Stream; 5352 while (!SkipCursorToBlock(Stream, EXTENSION_BLOCK_ID)) { 5353 bool DoneWithExtensionBlock = false; 5354 while (!DoneWithExtensionBlock) { 5355 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance(); 5356 if (!MaybeEntry) { 5357 // FIXME this drops the error. 5358 return true; 5359 } 5360 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5361 5362 switch (Entry.Kind) { 5363 case llvm::BitstreamEntry::SubBlock: 5364 if (llvm::Error Err = Stream.SkipBlock()) { 5365 // FIXME this drops the error on the floor. 5366 consumeError(std::move(Err)); 5367 return true; 5368 } 5369 continue; 5370 5371 case llvm::BitstreamEntry::EndBlock: 5372 DoneWithExtensionBlock = true; 5373 continue; 5374 5375 case llvm::BitstreamEntry::Error: 5376 return true; 5377 5378 case llvm::BitstreamEntry::Record: 5379 break; 5380 } 5381 5382 Record.clear(); 5383 StringRef Blob; 5384 Expected<unsigned> MaybeRecCode = 5385 Stream.readRecord(Entry.ID, Record, &Blob); 5386 if (!MaybeRecCode) { 5387 // FIXME this drops the error. 5388 return true; 5389 } 5390 switch (MaybeRecCode.get()) { 5391 case EXTENSION_METADATA: { 5392 ModuleFileExtensionMetadata Metadata; 5393 if (parseModuleFileExtensionMetadata(Record, Blob, Metadata)) 5394 return true; 5395 5396 Listener.readModuleFileExtension(Metadata); 5397 break; 5398 } 5399 } 5400 } 5401 } 5402 Stream = SavedStream; 5403 } 5404 5405 // Scan for the UNHASHED_CONTROL_BLOCK_ID block. 5406 if (readUnhashedControlBlockImpl( 5407 nullptr, Bytes, ARR_ConfigurationMismatch | ARR_OutOfDate, 5408 /*AllowCompatibleConfigurationMismatch*/ false, &Listener, 5409 ValidateDiagnosticOptions) != Success) 5410 return true; 5411 5412 return false; 5413 } 5414 5415 bool ASTReader::isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, 5416 const PCHContainerReader &PCHContainerRdr, 5417 const LangOptions &LangOpts, 5418 const TargetOptions &TargetOpts, 5419 const PreprocessorOptions &PPOpts, 5420 StringRef ExistingModuleCachePath) { 5421 SimplePCHValidator validator(LangOpts, TargetOpts, PPOpts, 5422 ExistingModuleCachePath, FileMgr); 5423 return !readASTFileControlBlock(Filename, FileMgr, PCHContainerRdr, 5424 /*FindModuleFileExtensions=*/false, 5425 validator, 5426 /*ValidateDiagnosticOptions=*/true); 5427 } 5428 5429 llvm::Error ASTReader::ReadSubmoduleBlock(ModuleFile &F, 5430 unsigned ClientLoadCapabilities) { 5431 // Enter the submodule block. 5432 if (llvm::Error Err = F.Stream.EnterSubBlock(SUBMODULE_BLOCK_ID)) 5433 return Err; 5434 5435 ModuleMap &ModMap = PP.getHeaderSearchInfo().getModuleMap(); 5436 bool First = true; 5437 Module *CurrentModule = nullptr; 5438 RecordData Record; 5439 while (true) { 5440 Expected<llvm::BitstreamEntry> MaybeEntry = 5441 F.Stream.advanceSkippingSubblocks(); 5442 if (!MaybeEntry) 5443 return MaybeEntry.takeError(); 5444 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5445 5446 switch (Entry.Kind) { 5447 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 5448 case llvm::BitstreamEntry::Error: 5449 return llvm::createStringError(std::errc::illegal_byte_sequence, 5450 "malformed block record in AST file"); 5451 case llvm::BitstreamEntry::EndBlock: 5452 return llvm::Error::success(); 5453 case llvm::BitstreamEntry::Record: 5454 // The interesting case. 5455 break; 5456 } 5457 5458 // Read a record. 5459 StringRef Blob; 5460 Record.clear(); 5461 Expected<unsigned> MaybeKind = F.Stream.readRecord(Entry.ID, Record, &Blob); 5462 if (!MaybeKind) 5463 return MaybeKind.takeError(); 5464 unsigned Kind = MaybeKind.get(); 5465 5466 if ((Kind == SUBMODULE_METADATA) != First) 5467 return llvm::createStringError( 5468 std::errc::illegal_byte_sequence, 5469 "submodule metadata record should be at beginning of block"); 5470 First = false; 5471 5472 // Submodule information is only valid if we have a current module. 5473 // FIXME: Should we error on these cases? 5474 if (!CurrentModule && Kind != SUBMODULE_METADATA && 5475 Kind != SUBMODULE_DEFINITION) 5476 continue; 5477 5478 switch (Kind) { 5479 default: // Default behavior: ignore. 5480 break; 5481 5482 case SUBMODULE_DEFINITION: { 5483 if (Record.size() < 12) 5484 return llvm::createStringError(std::errc::illegal_byte_sequence, 5485 "malformed module definition"); 5486 5487 StringRef Name = Blob; 5488 unsigned Idx = 0; 5489 SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]); 5490 SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]); 5491 Module::ModuleKind Kind = (Module::ModuleKind)Record[Idx++]; 5492 bool IsFramework = Record[Idx++]; 5493 bool IsExplicit = Record[Idx++]; 5494 bool IsSystem = Record[Idx++]; 5495 bool IsExternC = Record[Idx++]; 5496 bool InferSubmodules = Record[Idx++]; 5497 bool InferExplicitSubmodules = Record[Idx++]; 5498 bool InferExportWildcard = Record[Idx++]; 5499 bool ConfigMacrosExhaustive = Record[Idx++]; 5500 bool ModuleMapIsPrivate = Record[Idx++]; 5501 5502 Module *ParentModule = nullptr; 5503 if (Parent) 5504 ParentModule = getSubmodule(Parent); 5505 5506 // Retrieve this (sub)module from the module map, creating it if 5507 // necessary. 5508 CurrentModule = 5509 ModMap.findOrCreateModule(Name, ParentModule, IsFramework, IsExplicit) 5510 .first; 5511 5512 // FIXME: set the definition loc for CurrentModule, or call 5513 // ModMap.setInferredModuleAllowedBy() 5514 5515 SubmoduleID GlobalIndex = GlobalID - NUM_PREDEF_SUBMODULE_IDS; 5516 if (GlobalIndex >= SubmodulesLoaded.size() || 5517 SubmodulesLoaded[GlobalIndex]) 5518 return llvm::createStringError(std::errc::invalid_argument, 5519 "too many submodules"); 5520 5521 if (!ParentModule) { 5522 if (const FileEntry *CurFile = CurrentModule->getASTFile()) { 5523 // Don't emit module relocation error if we have -fno-validate-pch 5524 if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation & 5525 DisableValidationForModuleKind::Module) && 5526 CurFile != F.File) { 5527 auto ConflictError = 5528 PartialDiagnostic(diag::err_module_file_conflict, 5529 ContextObj->DiagAllocator) 5530 << CurrentModule->getTopLevelModuleName() << CurFile->getName() 5531 << F.File->getName(); 5532 return DiagnosticError::create(CurrentImportLoc, ConflictError); 5533 } 5534 } 5535 5536 F.DidReadTopLevelSubmodule = true; 5537 CurrentModule->setASTFile(F.File); 5538 CurrentModule->PresumedModuleMapFile = F.ModuleMapPath; 5539 } 5540 5541 CurrentModule->Kind = Kind; 5542 CurrentModule->Signature = F.Signature; 5543 CurrentModule->IsFromModuleFile = true; 5544 CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem; 5545 CurrentModule->IsExternC = IsExternC; 5546 CurrentModule->InferSubmodules = InferSubmodules; 5547 CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules; 5548 CurrentModule->InferExportWildcard = InferExportWildcard; 5549 CurrentModule->ConfigMacrosExhaustive = ConfigMacrosExhaustive; 5550 CurrentModule->ModuleMapIsPrivate = ModuleMapIsPrivate; 5551 if (DeserializationListener) 5552 DeserializationListener->ModuleRead(GlobalID, CurrentModule); 5553 5554 SubmodulesLoaded[GlobalIndex] = CurrentModule; 5555 5556 // Clear out data that will be replaced by what is in the module file. 5557 CurrentModule->LinkLibraries.clear(); 5558 CurrentModule->ConfigMacros.clear(); 5559 CurrentModule->UnresolvedConflicts.clear(); 5560 CurrentModule->Conflicts.clear(); 5561 5562 // The module is available unless it's missing a requirement; relevant 5563 // requirements will be (re-)added by SUBMODULE_REQUIRES records. 5564 // Missing headers that were present when the module was built do not 5565 // make it unavailable -- if we got this far, this must be an explicitly 5566 // imported module file. 5567 CurrentModule->Requirements.clear(); 5568 CurrentModule->MissingHeaders.clear(); 5569 CurrentModule->IsUnimportable = 5570 ParentModule && ParentModule->IsUnimportable; 5571 CurrentModule->IsAvailable = !CurrentModule->IsUnimportable; 5572 break; 5573 } 5574 5575 case SUBMODULE_UMBRELLA_HEADER: { 5576 // FIXME: This doesn't work for framework modules as `Filename` is the 5577 // name as written in the module file and does not include 5578 // `Headers/`, so this path will never exist. 5579 std::string Filename = std::string(Blob); 5580 ResolveImportedPath(F, Filename); 5581 if (auto Umbrella = PP.getFileManager().getFile(Filename)) { 5582 if (!CurrentModule->getUmbrellaHeader()) { 5583 // FIXME: NameAsWritten 5584 ModMap.setUmbrellaHeader(CurrentModule, *Umbrella, Blob, ""); 5585 } 5586 // Note that it's too late at this point to return out of date if the 5587 // name from the PCM doesn't match up with the one in the module map, 5588 // but also quite unlikely since we will have already checked the 5589 // modification time and size of the module map file itself. 5590 } 5591 break; 5592 } 5593 5594 case SUBMODULE_HEADER: 5595 case SUBMODULE_EXCLUDED_HEADER: 5596 case SUBMODULE_PRIVATE_HEADER: 5597 // We lazily associate headers with their modules via the HeaderInfo table. 5598 // FIXME: Re-evaluate this section; maybe only store InputFile IDs instead 5599 // of complete filenames or remove it entirely. 5600 break; 5601 5602 case SUBMODULE_TEXTUAL_HEADER: 5603 case SUBMODULE_PRIVATE_TEXTUAL_HEADER: 5604 // FIXME: Textual headers are not marked in the HeaderInfo table. Load 5605 // them here. 5606 break; 5607 5608 case SUBMODULE_TOPHEADER: 5609 CurrentModule->addTopHeaderFilename(Blob); 5610 break; 5611 5612 case SUBMODULE_UMBRELLA_DIR: { 5613 // See comments in SUBMODULE_UMBRELLA_HEADER 5614 std::string Dirname = std::string(Blob); 5615 ResolveImportedPath(F, Dirname); 5616 if (auto Umbrella = PP.getFileManager().getDirectory(Dirname)) { 5617 if (!CurrentModule->getUmbrellaDir()) { 5618 // FIXME: NameAsWritten 5619 ModMap.setUmbrellaDir(CurrentModule, *Umbrella, Blob, ""); 5620 } 5621 } 5622 break; 5623 } 5624 5625 case SUBMODULE_METADATA: { 5626 F.BaseSubmoduleID = getTotalNumSubmodules(); 5627 F.LocalNumSubmodules = Record[0]; 5628 unsigned LocalBaseSubmoduleID = Record[1]; 5629 if (F.LocalNumSubmodules > 0) { 5630 // Introduce the global -> local mapping for submodules within this 5631 // module. 5632 GlobalSubmoduleMap.insert(std::make_pair(getTotalNumSubmodules()+1,&F)); 5633 5634 // Introduce the local -> global mapping for submodules within this 5635 // module. 5636 F.SubmoduleRemap.insertOrReplace( 5637 std::make_pair(LocalBaseSubmoduleID, 5638 F.BaseSubmoduleID - LocalBaseSubmoduleID)); 5639 5640 SubmodulesLoaded.resize(SubmodulesLoaded.size() + F.LocalNumSubmodules); 5641 } 5642 break; 5643 } 5644 5645 case SUBMODULE_IMPORTS: 5646 for (unsigned Idx = 0; Idx != Record.size(); ++Idx) { 5647 UnresolvedModuleRef Unresolved; 5648 Unresolved.File = &F; 5649 Unresolved.Mod = CurrentModule; 5650 Unresolved.ID = Record[Idx]; 5651 Unresolved.Kind = UnresolvedModuleRef::Import; 5652 Unresolved.IsWildcard = false; 5653 UnresolvedModuleRefs.push_back(Unresolved); 5654 } 5655 break; 5656 5657 case SUBMODULE_EXPORTS: 5658 for (unsigned Idx = 0; Idx + 1 < Record.size(); Idx += 2) { 5659 UnresolvedModuleRef Unresolved; 5660 Unresolved.File = &F; 5661 Unresolved.Mod = CurrentModule; 5662 Unresolved.ID = Record[Idx]; 5663 Unresolved.Kind = UnresolvedModuleRef::Export; 5664 Unresolved.IsWildcard = Record[Idx + 1]; 5665 UnresolvedModuleRefs.push_back(Unresolved); 5666 } 5667 5668 // Once we've loaded the set of exports, there's no reason to keep 5669 // the parsed, unresolved exports around. 5670 CurrentModule->UnresolvedExports.clear(); 5671 break; 5672 5673 case SUBMODULE_REQUIRES: 5674 CurrentModule->addRequirement(Blob, Record[0], PP.getLangOpts(), 5675 PP.getTargetInfo()); 5676 break; 5677 5678 case SUBMODULE_LINK_LIBRARY: 5679 ModMap.resolveLinkAsDependencies(CurrentModule); 5680 CurrentModule->LinkLibraries.push_back( 5681 Module::LinkLibrary(std::string(Blob), Record[0])); 5682 break; 5683 5684 case SUBMODULE_CONFIG_MACRO: 5685 CurrentModule->ConfigMacros.push_back(Blob.str()); 5686 break; 5687 5688 case SUBMODULE_CONFLICT: { 5689 UnresolvedModuleRef Unresolved; 5690 Unresolved.File = &F; 5691 Unresolved.Mod = CurrentModule; 5692 Unresolved.ID = Record[0]; 5693 Unresolved.Kind = UnresolvedModuleRef::Conflict; 5694 Unresolved.IsWildcard = false; 5695 Unresolved.String = Blob; 5696 UnresolvedModuleRefs.push_back(Unresolved); 5697 break; 5698 } 5699 5700 case SUBMODULE_INITIALIZERS: { 5701 if (!ContextObj) 5702 break; 5703 SmallVector<uint32_t, 16> Inits; 5704 for (auto &ID : Record) 5705 Inits.push_back(getGlobalDeclID(F, ID)); 5706 ContextObj->addLazyModuleInitializers(CurrentModule, Inits); 5707 break; 5708 } 5709 5710 case SUBMODULE_EXPORT_AS: 5711 CurrentModule->ExportAsModule = Blob.str(); 5712 ModMap.addLinkAsDependency(CurrentModule); 5713 break; 5714 } 5715 } 5716 } 5717 5718 /// Parse the record that corresponds to a LangOptions data 5719 /// structure. 5720 /// 5721 /// This routine parses the language options from the AST file and then gives 5722 /// them to the AST listener if one is set. 5723 /// 5724 /// \returns true if the listener deems the file unacceptable, false otherwise. 5725 bool ASTReader::ParseLanguageOptions(const RecordData &Record, 5726 bool Complain, 5727 ASTReaderListener &Listener, 5728 bool AllowCompatibleDifferences) { 5729 LangOptions LangOpts; 5730 unsigned Idx = 0; 5731 #define LANGOPT(Name, Bits, Default, Description) \ 5732 LangOpts.Name = Record[Idx++]; 5733 #define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ 5734 LangOpts.set##Name(static_cast<LangOptions::Type>(Record[Idx++])); 5735 #include "clang/Basic/LangOptions.def" 5736 #define SANITIZER(NAME, ID) \ 5737 LangOpts.Sanitize.set(SanitizerKind::ID, Record[Idx++]); 5738 #include "clang/Basic/Sanitizers.def" 5739 5740 for (unsigned N = Record[Idx++]; N; --N) 5741 LangOpts.ModuleFeatures.push_back(ReadString(Record, Idx)); 5742 5743 ObjCRuntime::Kind runtimeKind = (ObjCRuntime::Kind) Record[Idx++]; 5744 VersionTuple runtimeVersion = ReadVersionTuple(Record, Idx); 5745 LangOpts.ObjCRuntime = ObjCRuntime(runtimeKind, runtimeVersion); 5746 5747 LangOpts.CurrentModule = ReadString(Record, Idx); 5748 5749 // Comment options. 5750 for (unsigned N = Record[Idx++]; N; --N) { 5751 LangOpts.CommentOpts.BlockCommandNames.push_back( 5752 ReadString(Record, Idx)); 5753 } 5754 LangOpts.CommentOpts.ParseAllComments = Record[Idx++]; 5755 5756 // OpenMP offloading options. 5757 for (unsigned N = Record[Idx++]; N; --N) { 5758 LangOpts.OMPTargetTriples.push_back(llvm::Triple(ReadString(Record, Idx))); 5759 } 5760 5761 LangOpts.OMPHostIRFile = ReadString(Record, Idx); 5762 5763 return Listener.ReadLanguageOptions(LangOpts, Complain, 5764 AllowCompatibleDifferences); 5765 } 5766 5767 bool ASTReader::ParseTargetOptions(const RecordData &Record, bool Complain, 5768 ASTReaderListener &Listener, 5769 bool AllowCompatibleDifferences) { 5770 unsigned Idx = 0; 5771 TargetOptions TargetOpts; 5772 TargetOpts.Triple = ReadString(Record, Idx); 5773 TargetOpts.CPU = ReadString(Record, Idx); 5774 TargetOpts.TuneCPU = ReadString(Record, Idx); 5775 TargetOpts.ABI = ReadString(Record, Idx); 5776 for (unsigned N = Record[Idx++]; N; --N) { 5777 TargetOpts.FeaturesAsWritten.push_back(ReadString(Record, Idx)); 5778 } 5779 for (unsigned N = Record[Idx++]; N; --N) { 5780 TargetOpts.Features.push_back(ReadString(Record, Idx)); 5781 } 5782 5783 return Listener.ReadTargetOptions(TargetOpts, Complain, 5784 AllowCompatibleDifferences); 5785 } 5786 5787 bool ASTReader::ParseDiagnosticOptions(const RecordData &Record, bool Complain, 5788 ASTReaderListener &Listener) { 5789 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions); 5790 unsigned Idx = 0; 5791 #define DIAGOPT(Name, Bits, Default) DiagOpts->Name = Record[Idx++]; 5792 #define ENUM_DIAGOPT(Name, Type, Bits, Default) \ 5793 DiagOpts->set##Name(static_cast<Type>(Record[Idx++])); 5794 #include "clang/Basic/DiagnosticOptions.def" 5795 5796 for (unsigned N = Record[Idx++]; N; --N) 5797 DiagOpts->Warnings.push_back(ReadString(Record, Idx)); 5798 for (unsigned N = Record[Idx++]; N; --N) 5799 DiagOpts->Remarks.push_back(ReadString(Record, Idx)); 5800 5801 return Listener.ReadDiagnosticOptions(DiagOpts, Complain); 5802 } 5803 5804 bool ASTReader::ParseFileSystemOptions(const RecordData &Record, bool Complain, 5805 ASTReaderListener &Listener) { 5806 FileSystemOptions FSOpts; 5807 unsigned Idx = 0; 5808 FSOpts.WorkingDir = ReadString(Record, Idx); 5809 return Listener.ReadFileSystemOptions(FSOpts, Complain); 5810 } 5811 5812 bool ASTReader::ParseHeaderSearchOptions(const RecordData &Record, 5813 bool Complain, 5814 ASTReaderListener &Listener) { 5815 HeaderSearchOptions HSOpts; 5816 unsigned Idx = 0; 5817 HSOpts.Sysroot = ReadString(Record, Idx); 5818 5819 // Include entries. 5820 for (unsigned N = Record[Idx++]; N; --N) { 5821 std::string Path = ReadString(Record, Idx); 5822 frontend::IncludeDirGroup Group 5823 = static_cast<frontend::IncludeDirGroup>(Record[Idx++]); 5824 bool IsFramework = Record[Idx++]; 5825 bool IgnoreSysRoot = Record[Idx++]; 5826 HSOpts.UserEntries.emplace_back(std::move(Path), Group, IsFramework, 5827 IgnoreSysRoot); 5828 } 5829 5830 // System header prefixes. 5831 for (unsigned N = Record[Idx++]; N; --N) { 5832 std::string Prefix = ReadString(Record, Idx); 5833 bool IsSystemHeader = Record[Idx++]; 5834 HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); 5835 } 5836 5837 HSOpts.ResourceDir = ReadString(Record, Idx); 5838 HSOpts.ModuleCachePath = ReadString(Record, Idx); 5839 HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); 5840 HSOpts.DisableModuleHash = Record[Idx++]; 5841 HSOpts.ImplicitModuleMaps = Record[Idx++]; 5842 HSOpts.ModuleMapFileHomeIsCwd = Record[Idx++]; 5843 HSOpts.EnablePrebuiltImplicitModules = Record[Idx++]; 5844 HSOpts.UseBuiltinIncludes = Record[Idx++]; 5845 HSOpts.UseStandardSystemIncludes = Record[Idx++]; 5846 HSOpts.UseStandardCXXIncludes = Record[Idx++]; 5847 HSOpts.UseLibcxx = Record[Idx++]; 5848 std::string SpecificModuleCachePath = ReadString(Record, Idx); 5849 5850 return Listener.ReadHeaderSearchOptions(HSOpts, SpecificModuleCachePath, 5851 Complain); 5852 } 5853 5854 bool ASTReader::ParsePreprocessorOptions(const RecordData &Record, 5855 bool Complain, 5856 ASTReaderListener &Listener, 5857 std::string &SuggestedPredefines) { 5858 PreprocessorOptions PPOpts; 5859 unsigned Idx = 0; 5860 5861 // Macro definitions/undefs 5862 for (unsigned N = Record[Idx++]; N; --N) { 5863 std::string Macro = ReadString(Record, Idx); 5864 bool IsUndef = Record[Idx++]; 5865 PPOpts.Macros.push_back(std::make_pair(Macro, IsUndef)); 5866 } 5867 5868 // Includes 5869 for (unsigned N = Record[Idx++]; N; --N) { 5870 PPOpts.Includes.push_back(ReadString(Record, Idx)); 5871 } 5872 5873 // Macro Includes 5874 for (unsigned N = Record[Idx++]; N; --N) { 5875 PPOpts.MacroIncludes.push_back(ReadString(Record, Idx)); 5876 } 5877 5878 PPOpts.UsePredefines = Record[Idx++]; 5879 PPOpts.DetailedRecord = Record[Idx++]; 5880 PPOpts.ImplicitPCHInclude = ReadString(Record, Idx); 5881 PPOpts.ObjCXXARCStandardLibrary = 5882 static_cast<ObjCXXARCStandardLibraryKind>(Record[Idx++]); 5883 SuggestedPredefines.clear(); 5884 return Listener.ReadPreprocessorOptions(PPOpts, Complain, 5885 SuggestedPredefines); 5886 } 5887 5888 std::pair<ModuleFile *, unsigned> 5889 ASTReader::getModulePreprocessedEntity(unsigned GlobalIndex) { 5890 GlobalPreprocessedEntityMapType::iterator 5891 I = GlobalPreprocessedEntityMap.find(GlobalIndex); 5892 assert(I != GlobalPreprocessedEntityMap.end() && 5893 "Corrupted global preprocessed entity map"); 5894 ModuleFile *M = I->second; 5895 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedEntityID; 5896 return std::make_pair(M, LocalIndex); 5897 } 5898 5899 llvm::iterator_range<PreprocessingRecord::iterator> 5900 ASTReader::getModulePreprocessedEntities(ModuleFile &Mod) const { 5901 if (PreprocessingRecord *PPRec = PP.getPreprocessingRecord()) 5902 return PPRec->getIteratorsForLoadedRange(Mod.BasePreprocessedEntityID, 5903 Mod.NumPreprocessedEntities); 5904 5905 return llvm::make_range(PreprocessingRecord::iterator(), 5906 PreprocessingRecord::iterator()); 5907 } 5908 5909 bool ASTReader::canRecoverFromOutOfDate(StringRef ModuleFileName, 5910 unsigned int ClientLoadCapabilities) { 5911 return ClientLoadCapabilities & ARR_OutOfDate && 5912 !getModuleManager().getModuleCache().isPCMFinal(ModuleFileName); 5913 } 5914 5915 llvm::iterator_range<ASTReader::ModuleDeclIterator> 5916 ASTReader::getModuleFileLevelDecls(ModuleFile &Mod) { 5917 return llvm::make_range( 5918 ModuleDeclIterator(this, &Mod, Mod.FileSortedDecls), 5919 ModuleDeclIterator(this, &Mod, 5920 Mod.FileSortedDecls + Mod.NumFileSortedDecls)); 5921 } 5922 5923 SourceRange ASTReader::ReadSkippedRange(unsigned GlobalIndex) { 5924 auto I = GlobalSkippedRangeMap.find(GlobalIndex); 5925 assert(I != GlobalSkippedRangeMap.end() && 5926 "Corrupted global skipped range map"); 5927 ModuleFile *M = I->second; 5928 unsigned LocalIndex = GlobalIndex - M->BasePreprocessedSkippedRangeID; 5929 assert(LocalIndex < M->NumPreprocessedSkippedRanges); 5930 PPSkippedRange RawRange = M->PreprocessedSkippedRangeOffsets[LocalIndex]; 5931 SourceRange Range(TranslateSourceLocation(*M, RawRange.getBegin()), 5932 TranslateSourceLocation(*M, RawRange.getEnd())); 5933 assert(Range.isValid()); 5934 return Range; 5935 } 5936 5937 PreprocessedEntity *ASTReader::ReadPreprocessedEntity(unsigned Index) { 5938 PreprocessedEntityID PPID = Index+1; 5939 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 5940 ModuleFile &M = *PPInfo.first; 5941 unsigned LocalIndex = PPInfo.second; 5942 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 5943 5944 if (!PP.getPreprocessingRecord()) { 5945 Error("no preprocessing record"); 5946 return nullptr; 5947 } 5948 5949 SavedStreamPosition SavedPosition(M.PreprocessorDetailCursor); 5950 if (llvm::Error Err = M.PreprocessorDetailCursor.JumpToBit( 5951 M.MacroOffsetsBase + PPOffs.BitOffset)) { 5952 Error(std::move(Err)); 5953 return nullptr; 5954 } 5955 5956 Expected<llvm::BitstreamEntry> MaybeEntry = 5957 M.PreprocessorDetailCursor.advance(BitstreamCursor::AF_DontPopBlockAtEnd); 5958 if (!MaybeEntry) { 5959 Error(MaybeEntry.takeError()); 5960 return nullptr; 5961 } 5962 llvm::BitstreamEntry Entry = MaybeEntry.get(); 5963 5964 if (Entry.Kind != llvm::BitstreamEntry::Record) 5965 return nullptr; 5966 5967 // Read the record. 5968 SourceRange Range(TranslateSourceLocation(M, PPOffs.getBegin()), 5969 TranslateSourceLocation(M, PPOffs.getEnd())); 5970 PreprocessingRecord &PPRec = *PP.getPreprocessingRecord(); 5971 StringRef Blob; 5972 RecordData Record; 5973 Expected<unsigned> MaybeRecType = 5974 M.PreprocessorDetailCursor.readRecord(Entry.ID, Record, &Blob); 5975 if (!MaybeRecType) { 5976 Error(MaybeRecType.takeError()); 5977 return nullptr; 5978 } 5979 switch ((PreprocessorDetailRecordTypes)MaybeRecType.get()) { 5980 case PPD_MACRO_EXPANSION: { 5981 bool isBuiltin = Record[0]; 5982 IdentifierInfo *Name = nullptr; 5983 MacroDefinitionRecord *Def = nullptr; 5984 if (isBuiltin) 5985 Name = getLocalIdentifier(M, Record[1]); 5986 else { 5987 PreprocessedEntityID GlobalID = 5988 getGlobalPreprocessedEntityID(M, Record[1]); 5989 Def = cast<MacroDefinitionRecord>( 5990 PPRec.getLoadedPreprocessedEntity(GlobalID - 1)); 5991 } 5992 5993 MacroExpansion *ME; 5994 if (isBuiltin) 5995 ME = new (PPRec) MacroExpansion(Name, Range); 5996 else 5997 ME = new (PPRec) MacroExpansion(Def, Range); 5998 5999 return ME; 6000 } 6001 6002 case PPD_MACRO_DEFINITION: { 6003 // Decode the identifier info and then check again; if the macro is 6004 // still defined and associated with the identifier, 6005 IdentifierInfo *II = getLocalIdentifier(M, Record[0]); 6006 MacroDefinitionRecord *MD = new (PPRec) MacroDefinitionRecord(II, Range); 6007 6008 if (DeserializationListener) 6009 DeserializationListener->MacroDefinitionRead(PPID, MD); 6010 6011 return MD; 6012 } 6013 6014 case PPD_INCLUSION_DIRECTIVE: { 6015 const char *FullFileNameStart = Blob.data() + Record[0]; 6016 StringRef FullFileName(FullFileNameStart, Blob.size() - Record[0]); 6017 const FileEntry *File = nullptr; 6018 if (!FullFileName.empty()) 6019 if (auto FE = PP.getFileManager().getFile(FullFileName)) 6020 File = *FE; 6021 6022 // FIXME: Stable encoding 6023 InclusionDirective::InclusionKind Kind 6024 = static_cast<InclusionDirective::InclusionKind>(Record[2]); 6025 InclusionDirective *ID 6026 = new (PPRec) InclusionDirective(PPRec, Kind, 6027 StringRef(Blob.data(), Record[0]), 6028 Record[1], Record[3], 6029 File, 6030 Range); 6031 return ID; 6032 } 6033 } 6034 6035 llvm_unreachable("Invalid PreprocessorDetailRecordTypes"); 6036 } 6037 6038 /// Find the next module that contains entities and return the ID 6039 /// of the first entry. 6040 /// 6041 /// \param SLocMapI points at a chunk of a module that contains no 6042 /// preprocessed entities or the entities it contains are not the ones we are 6043 /// looking for. 6044 PreprocessedEntityID ASTReader::findNextPreprocessedEntity( 6045 GlobalSLocOffsetMapType::const_iterator SLocMapI) const { 6046 ++SLocMapI; 6047 for (GlobalSLocOffsetMapType::const_iterator 6048 EndI = GlobalSLocOffsetMap.end(); SLocMapI != EndI; ++SLocMapI) { 6049 ModuleFile &M = *SLocMapI->second; 6050 if (M.NumPreprocessedEntities) 6051 return M.BasePreprocessedEntityID; 6052 } 6053 6054 return getTotalNumPreprocessedEntities(); 6055 } 6056 6057 namespace { 6058 6059 struct PPEntityComp { 6060 const ASTReader &Reader; 6061 ModuleFile &M; 6062 6063 PPEntityComp(const ASTReader &Reader, ModuleFile &M) : Reader(Reader), M(M) {} 6064 6065 bool operator()(const PPEntityOffset &L, const PPEntityOffset &R) const { 6066 SourceLocation LHS = getLoc(L); 6067 SourceLocation RHS = getLoc(R); 6068 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6069 } 6070 6071 bool operator()(const PPEntityOffset &L, SourceLocation RHS) const { 6072 SourceLocation LHS = getLoc(L); 6073 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6074 } 6075 6076 bool operator()(SourceLocation LHS, const PPEntityOffset &R) const { 6077 SourceLocation RHS = getLoc(R); 6078 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 6079 } 6080 6081 SourceLocation getLoc(const PPEntityOffset &PPE) const { 6082 return Reader.TranslateSourceLocation(M, PPE.getBegin()); 6083 } 6084 }; 6085 6086 } // namespace 6087 6088 PreprocessedEntityID ASTReader::findPreprocessedEntity(SourceLocation Loc, 6089 bool EndsAfter) const { 6090 if (SourceMgr.isLocalSourceLocation(Loc)) 6091 return getTotalNumPreprocessedEntities(); 6092 6093 GlobalSLocOffsetMapType::const_iterator SLocMapI = GlobalSLocOffsetMap.find( 6094 SourceManager::MaxLoadedOffset - Loc.getOffset() - 1); 6095 assert(SLocMapI != GlobalSLocOffsetMap.end() && 6096 "Corrupted global sloc offset map"); 6097 6098 if (SLocMapI->second->NumPreprocessedEntities == 0) 6099 return findNextPreprocessedEntity(SLocMapI); 6100 6101 ModuleFile &M = *SLocMapI->second; 6102 6103 using pp_iterator = const PPEntityOffset *; 6104 6105 pp_iterator pp_begin = M.PreprocessedEntityOffsets; 6106 pp_iterator pp_end = pp_begin + M.NumPreprocessedEntities; 6107 6108 size_t Count = M.NumPreprocessedEntities; 6109 size_t Half; 6110 pp_iterator First = pp_begin; 6111 pp_iterator PPI; 6112 6113 if (EndsAfter) { 6114 PPI = std::upper_bound(pp_begin, pp_end, Loc, 6115 PPEntityComp(*this, M)); 6116 } else { 6117 // Do a binary search manually instead of using std::lower_bound because 6118 // The end locations of entities may be unordered (when a macro expansion 6119 // is inside another macro argument), but for this case it is not important 6120 // whether we get the first macro expansion or its containing macro. 6121 while (Count > 0) { 6122 Half = Count / 2; 6123 PPI = First; 6124 std::advance(PPI, Half); 6125 if (SourceMgr.isBeforeInTranslationUnit( 6126 TranslateSourceLocation(M, PPI->getEnd()), Loc)) { 6127 First = PPI; 6128 ++First; 6129 Count = Count - Half - 1; 6130 } else 6131 Count = Half; 6132 } 6133 } 6134 6135 if (PPI == pp_end) 6136 return findNextPreprocessedEntity(SLocMapI); 6137 6138 return M.BasePreprocessedEntityID + (PPI - pp_begin); 6139 } 6140 6141 /// Returns a pair of [Begin, End) indices of preallocated 6142 /// preprocessed entities that \arg Range encompasses. 6143 std::pair<unsigned, unsigned> 6144 ASTReader::findPreprocessedEntitiesInRange(SourceRange Range) { 6145 if (Range.isInvalid()) 6146 return std::make_pair(0,0); 6147 assert(!SourceMgr.isBeforeInTranslationUnit(Range.getEnd(),Range.getBegin())); 6148 6149 PreprocessedEntityID BeginID = 6150 findPreprocessedEntity(Range.getBegin(), false); 6151 PreprocessedEntityID EndID = findPreprocessedEntity(Range.getEnd(), true); 6152 return std::make_pair(BeginID, EndID); 6153 } 6154 6155 /// Optionally returns true or false if the preallocated preprocessed 6156 /// entity with index \arg Index came from file \arg FID. 6157 Optional<bool> ASTReader::isPreprocessedEntityInFileID(unsigned Index, 6158 FileID FID) { 6159 if (FID.isInvalid()) 6160 return false; 6161 6162 std::pair<ModuleFile *, unsigned> PPInfo = getModulePreprocessedEntity(Index); 6163 ModuleFile &M = *PPInfo.first; 6164 unsigned LocalIndex = PPInfo.second; 6165 const PPEntityOffset &PPOffs = M.PreprocessedEntityOffsets[LocalIndex]; 6166 6167 SourceLocation Loc = TranslateSourceLocation(M, PPOffs.getBegin()); 6168 if (Loc.isInvalid()) 6169 return false; 6170 6171 if (SourceMgr.isInFileID(SourceMgr.getFileLoc(Loc), FID)) 6172 return true; 6173 else 6174 return false; 6175 } 6176 6177 namespace { 6178 6179 /// Visitor used to search for information about a header file. 6180 class HeaderFileInfoVisitor { 6181 const FileEntry *FE; 6182 Optional<HeaderFileInfo> HFI; 6183 6184 public: 6185 explicit HeaderFileInfoVisitor(const FileEntry *FE) : FE(FE) {} 6186 6187 bool operator()(ModuleFile &M) { 6188 HeaderFileInfoLookupTable *Table 6189 = static_cast<HeaderFileInfoLookupTable *>(M.HeaderFileInfoTable); 6190 if (!Table) 6191 return false; 6192 6193 // Look in the on-disk hash table for an entry for this file name. 6194 HeaderFileInfoLookupTable::iterator Pos = Table->find(FE); 6195 if (Pos == Table->end()) 6196 return false; 6197 6198 HFI = *Pos; 6199 return true; 6200 } 6201 6202 Optional<HeaderFileInfo> getHeaderFileInfo() const { return HFI; } 6203 }; 6204 6205 } // namespace 6206 6207 HeaderFileInfo ASTReader::GetHeaderFileInfo(const FileEntry *FE) { 6208 HeaderFileInfoVisitor Visitor(FE); 6209 ModuleMgr.visit(Visitor); 6210 if (Optional<HeaderFileInfo> HFI = Visitor.getHeaderFileInfo()) 6211 return *HFI; 6212 6213 return HeaderFileInfo(); 6214 } 6215 6216 void ASTReader::ReadPragmaDiagnosticMappings(DiagnosticsEngine &Diag) { 6217 using DiagState = DiagnosticsEngine::DiagState; 6218 SmallVector<DiagState *, 32> DiagStates; 6219 6220 for (ModuleFile &F : ModuleMgr) { 6221 unsigned Idx = 0; 6222 auto &Record = F.PragmaDiagMappings; 6223 if (Record.empty()) 6224 continue; 6225 6226 DiagStates.clear(); 6227 6228 auto ReadDiagState = 6229 [&](const DiagState &BasedOn, SourceLocation Loc, 6230 bool IncludeNonPragmaStates) -> DiagnosticsEngine::DiagState * { 6231 unsigned BackrefID = Record[Idx++]; 6232 if (BackrefID != 0) 6233 return DiagStates[BackrefID - 1]; 6234 6235 // A new DiagState was created here. 6236 Diag.DiagStates.push_back(BasedOn); 6237 DiagState *NewState = &Diag.DiagStates.back(); 6238 DiagStates.push_back(NewState); 6239 unsigned Size = Record[Idx++]; 6240 assert(Idx + Size * 2 <= Record.size() && 6241 "Invalid data, not enough diag/map pairs"); 6242 while (Size--) { 6243 unsigned DiagID = Record[Idx++]; 6244 DiagnosticMapping NewMapping = 6245 DiagnosticMapping::deserialize(Record[Idx++]); 6246 if (!NewMapping.isPragma() && !IncludeNonPragmaStates) 6247 continue; 6248 6249 DiagnosticMapping &Mapping = NewState->getOrAddMapping(DiagID); 6250 6251 // If this mapping was specified as a warning but the severity was 6252 // upgraded due to diagnostic settings, simulate the current diagnostic 6253 // settings (and use a warning). 6254 if (NewMapping.wasUpgradedFromWarning() && !Mapping.isErrorOrFatal()) { 6255 NewMapping.setSeverity(diag::Severity::Warning); 6256 NewMapping.setUpgradedFromWarning(false); 6257 } 6258 6259 Mapping = NewMapping; 6260 } 6261 return NewState; 6262 }; 6263 6264 // Read the first state. 6265 DiagState *FirstState; 6266 if (F.Kind == MK_ImplicitModule) { 6267 // Implicitly-built modules are reused with different diagnostic 6268 // settings. Use the initial diagnostic state from Diag to simulate this 6269 // compilation's diagnostic settings. 6270 FirstState = Diag.DiagStatesByLoc.FirstDiagState; 6271 DiagStates.push_back(FirstState); 6272 6273 // Skip the initial diagnostic state from the serialized module. 6274 assert(Record[1] == 0 && 6275 "Invalid data, unexpected backref in initial state"); 6276 Idx = 3 + Record[2] * 2; 6277 assert(Idx < Record.size() && 6278 "Invalid data, not enough state change pairs in initial state"); 6279 } else if (F.isModule()) { 6280 // For an explicit module, preserve the flags from the module build 6281 // command line (-w, -Weverything, -Werror, ...) along with any explicit 6282 // -Wblah flags. 6283 unsigned Flags = Record[Idx++]; 6284 DiagState Initial; 6285 Initial.SuppressSystemWarnings = Flags & 1; Flags >>= 1; 6286 Initial.ErrorsAsFatal = Flags & 1; Flags >>= 1; 6287 Initial.WarningsAsErrors = Flags & 1; Flags >>= 1; 6288 Initial.EnableAllWarnings = Flags & 1; Flags >>= 1; 6289 Initial.IgnoreAllWarnings = Flags & 1; Flags >>= 1; 6290 Initial.ExtBehavior = (diag::Severity)Flags; 6291 FirstState = ReadDiagState(Initial, SourceLocation(), true); 6292 6293 assert(F.OriginalSourceFileID.isValid()); 6294 6295 // Set up the root buffer of the module to start with the initial 6296 // diagnostic state of the module itself, to cover files that contain no 6297 // explicit transitions (for which we did not serialize anything). 6298 Diag.DiagStatesByLoc.Files[F.OriginalSourceFileID] 6299 .StateTransitions.push_back({FirstState, 0}); 6300 } else { 6301 // For prefix ASTs, start with whatever the user configured on the 6302 // command line. 6303 Idx++; // Skip flags. 6304 FirstState = ReadDiagState(*Diag.DiagStatesByLoc.CurDiagState, 6305 SourceLocation(), false); 6306 } 6307 6308 // Read the state transitions. 6309 unsigned NumLocations = Record[Idx++]; 6310 while (NumLocations--) { 6311 assert(Idx < Record.size() && 6312 "Invalid data, missing pragma diagnostic states"); 6313 SourceLocation Loc = ReadSourceLocation(F, Record[Idx++]); 6314 auto IDAndOffset = SourceMgr.getDecomposedLoc(Loc); 6315 assert(IDAndOffset.first.isValid() && "invalid FileID for transition"); 6316 assert(IDAndOffset.second == 0 && "not a start location for a FileID"); 6317 unsigned Transitions = Record[Idx++]; 6318 6319 // Note that we don't need to set up Parent/ParentOffset here, because 6320 // we won't be changing the diagnostic state within imported FileIDs 6321 // (other than perhaps appending to the main source file, which has no 6322 // parent). 6323 auto &F = Diag.DiagStatesByLoc.Files[IDAndOffset.first]; 6324 F.StateTransitions.reserve(F.StateTransitions.size() + Transitions); 6325 for (unsigned I = 0; I != Transitions; ++I) { 6326 unsigned Offset = Record[Idx++]; 6327 auto *State = 6328 ReadDiagState(*FirstState, Loc.getLocWithOffset(Offset), false); 6329 F.StateTransitions.push_back({State, Offset}); 6330 } 6331 } 6332 6333 // Read the final state. 6334 assert(Idx < Record.size() && 6335 "Invalid data, missing final pragma diagnostic state"); 6336 SourceLocation CurStateLoc = 6337 ReadSourceLocation(F, F.PragmaDiagMappings[Idx++]); 6338 auto *CurState = ReadDiagState(*FirstState, CurStateLoc, false); 6339 6340 if (!F.isModule()) { 6341 Diag.DiagStatesByLoc.CurDiagState = CurState; 6342 Diag.DiagStatesByLoc.CurDiagStateLoc = CurStateLoc; 6343 6344 // Preserve the property that the imaginary root file describes the 6345 // current state. 6346 FileID NullFile; 6347 auto &T = Diag.DiagStatesByLoc.Files[NullFile].StateTransitions; 6348 if (T.empty()) 6349 T.push_back({CurState, 0}); 6350 else 6351 T[0].State = CurState; 6352 } 6353 6354 // Don't try to read these mappings again. 6355 Record.clear(); 6356 } 6357 } 6358 6359 /// Get the correct cursor and offset for loading a type. 6360 ASTReader::RecordLocation ASTReader::TypeCursorForIndex(unsigned Index) { 6361 GlobalTypeMapType::iterator I = GlobalTypeMap.find(Index); 6362 assert(I != GlobalTypeMap.end() && "Corrupted global type map"); 6363 ModuleFile *M = I->second; 6364 return RecordLocation( 6365 M, M->TypeOffsets[Index - M->BaseTypeIndex].getBitOffset() + 6366 M->DeclsBlockStartOffset); 6367 } 6368 6369 static llvm::Optional<Type::TypeClass> getTypeClassForCode(TypeCode code) { 6370 switch (code) { 6371 #define TYPE_BIT_CODE(CLASS_ID, CODE_ID, CODE_VALUE) \ 6372 case TYPE_##CODE_ID: return Type::CLASS_ID; 6373 #include "clang/Serialization/TypeBitCodes.def" 6374 default: return llvm::None; 6375 } 6376 } 6377 6378 /// Read and return the type with the given index.. 6379 /// 6380 /// The index is the type ID, shifted and minus the number of predefs. This 6381 /// routine actually reads the record corresponding to the type at the given 6382 /// location. It is a helper routine for GetType, which deals with reading type 6383 /// IDs. 6384 QualType ASTReader::readTypeRecord(unsigned Index) { 6385 assert(ContextObj && "reading type with no AST context"); 6386 ASTContext &Context = *ContextObj; 6387 RecordLocation Loc = TypeCursorForIndex(Index); 6388 BitstreamCursor &DeclsCursor = Loc.F->DeclsCursor; 6389 6390 // Keep track of where we are in the stream, then jump back there 6391 // after reading this type. 6392 SavedStreamPosition SavedPosition(DeclsCursor); 6393 6394 ReadingKindTracker ReadingKind(Read_Type, *this); 6395 6396 // Note that we are loading a type record. 6397 Deserializing AType(this); 6398 6399 if (llvm::Error Err = DeclsCursor.JumpToBit(Loc.Offset)) { 6400 Error(std::move(Err)); 6401 return QualType(); 6402 } 6403 Expected<unsigned> RawCode = DeclsCursor.ReadCode(); 6404 if (!RawCode) { 6405 Error(RawCode.takeError()); 6406 return QualType(); 6407 } 6408 6409 ASTRecordReader Record(*this, *Loc.F); 6410 Expected<unsigned> Code = Record.readRecord(DeclsCursor, RawCode.get()); 6411 if (!Code) { 6412 Error(Code.takeError()); 6413 return QualType(); 6414 } 6415 if (Code.get() == TYPE_EXT_QUAL) { 6416 QualType baseType = Record.readQualType(); 6417 Qualifiers quals = Record.readQualifiers(); 6418 return Context.getQualifiedType(baseType, quals); 6419 } 6420 6421 auto maybeClass = getTypeClassForCode((TypeCode) Code.get()); 6422 if (!maybeClass) { 6423 Error("Unexpected code for type"); 6424 return QualType(); 6425 } 6426 6427 serialization::AbstractTypeReader<ASTRecordReader> TypeReader(Record); 6428 return TypeReader.read(*maybeClass); 6429 } 6430 6431 namespace clang { 6432 6433 class TypeLocReader : public TypeLocVisitor<TypeLocReader> { 6434 ASTRecordReader &Reader; 6435 6436 SourceLocation readSourceLocation() { 6437 return Reader.readSourceLocation(); 6438 } 6439 6440 TypeSourceInfo *GetTypeSourceInfo() { 6441 return Reader.readTypeSourceInfo(); 6442 } 6443 6444 NestedNameSpecifierLoc ReadNestedNameSpecifierLoc() { 6445 return Reader.readNestedNameSpecifierLoc(); 6446 } 6447 6448 Attr *ReadAttr() { 6449 return Reader.readAttr(); 6450 } 6451 6452 public: 6453 TypeLocReader(ASTRecordReader &Reader) : Reader(Reader) {} 6454 6455 // We want compile-time assurance that we've enumerated all of 6456 // these, so unfortunately we have to declare them first, then 6457 // define them out-of-line. 6458 #define ABSTRACT_TYPELOC(CLASS, PARENT) 6459 #define TYPELOC(CLASS, PARENT) \ 6460 void Visit##CLASS##TypeLoc(CLASS##TypeLoc TyLoc); 6461 #include "clang/AST/TypeLocNodes.def" 6462 6463 void VisitFunctionTypeLoc(FunctionTypeLoc); 6464 void VisitArrayTypeLoc(ArrayTypeLoc); 6465 }; 6466 6467 } // namespace clang 6468 6469 void TypeLocReader::VisitQualifiedTypeLoc(QualifiedTypeLoc TL) { 6470 // nothing to do 6471 } 6472 6473 void TypeLocReader::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) { 6474 TL.setBuiltinLoc(readSourceLocation()); 6475 if (TL.needsExtraLocalData()) { 6476 TL.setWrittenTypeSpec(static_cast<DeclSpec::TST>(Reader.readInt())); 6477 TL.setWrittenSignSpec(static_cast<TypeSpecifierSign>(Reader.readInt())); 6478 TL.setWrittenWidthSpec(static_cast<TypeSpecifierWidth>(Reader.readInt())); 6479 TL.setModeAttr(Reader.readInt()); 6480 } 6481 } 6482 6483 void TypeLocReader::VisitComplexTypeLoc(ComplexTypeLoc TL) { 6484 TL.setNameLoc(readSourceLocation()); 6485 } 6486 6487 void TypeLocReader::VisitPointerTypeLoc(PointerTypeLoc TL) { 6488 TL.setStarLoc(readSourceLocation()); 6489 } 6490 6491 void TypeLocReader::VisitDecayedTypeLoc(DecayedTypeLoc TL) { 6492 // nothing to do 6493 } 6494 6495 void TypeLocReader::VisitAdjustedTypeLoc(AdjustedTypeLoc TL) { 6496 // nothing to do 6497 } 6498 6499 void TypeLocReader::VisitMacroQualifiedTypeLoc(MacroQualifiedTypeLoc TL) { 6500 TL.setExpansionLoc(readSourceLocation()); 6501 } 6502 6503 void TypeLocReader::VisitBlockPointerTypeLoc(BlockPointerTypeLoc TL) { 6504 TL.setCaretLoc(readSourceLocation()); 6505 } 6506 6507 void TypeLocReader::VisitLValueReferenceTypeLoc(LValueReferenceTypeLoc TL) { 6508 TL.setAmpLoc(readSourceLocation()); 6509 } 6510 6511 void TypeLocReader::VisitRValueReferenceTypeLoc(RValueReferenceTypeLoc TL) { 6512 TL.setAmpAmpLoc(readSourceLocation()); 6513 } 6514 6515 void TypeLocReader::VisitMemberPointerTypeLoc(MemberPointerTypeLoc TL) { 6516 TL.setStarLoc(readSourceLocation()); 6517 TL.setClassTInfo(GetTypeSourceInfo()); 6518 } 6519 6520 void TypeLocReader::VisitArrayTypeLoc(ArrayTypeLoc TL) { 6521 TL.setLBracketLoc(readSourceLocation()); 6522 TL.setRBracketLoc(readSourceLocation()); 6523 if (Reader.readBool()) 6524 TL.setSizeExpr(Reader.readExpr()); 6525 else 6526 TL.setSizeExpr(nullptr); 6527 } 6528 6529 void TypeLocReader::VisitConstantArrayTypeLoc(ConstantArrayTypeLoc TL) { 6530 VisitArrayTypeLoc(TL); 6531 } 6532 6533 void TypeLocReader::VisitIncompleteArrayTypeLoc(IncompleteArrayTypeLoc TL) { 6534 VisitArrayTypeLoc(TL); 6535 } 6536 6537 void TypeLocReader::VisitVariableArrayTypeLoc(VariableArrayTypeLoc TL) { 6538 VisitArrayTypeLoc(TL); 6539 } 6540 6541 void TypeLocReader::VisitDependentSizedArrayTypeLoc( 6542 DependentSizedArrayTypeLoc TL) { 6543 VisitArrayTypeLoc(TL); 6544 } 6545 6546 void TypeLocReader::VisitDependentAddressSpaceTypeLoc( 6547 DependentAddressSpaceTypeLoc TL) { 6548 6549 TL.setAttrNameLoc(readSourceLocation()); 6550 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6551 TL.setAttrExprOperand(Reader.readExpr()); 6552 } 6553 6554 void TypeLocReader::VisitDependentSizedExtVectorTypeLoc( 6555 DependentSizedExtVectorTypeLoc TL) { 6556 TL.setNameLoc(readSourceLocation()); 6557 } 6558 6559 void TypeLocReader::VisitVectorTypeLoc(VectorTypeLoc TL) { 6560 TL.setNameLoc(readSourceLocation()); 6561 } 6562 6563 void TypeLocReader::VisitDependentVectorTypeLoc( 6564 DependentVectorTypeLoc TL) { 6565 TL.setNameLoc(readSourceLocation()); 6566 } 6567 6568 void TypeLocReader::VisitExtVectorTypeLoc(ExtVectorTypeLoc TL) { 6569 TL.setNameLoc(readSourceLocation()); 6570 } 6571 6572 void TypeLocReader::VisitConstantMatrixTypeLoc(ConstantMatrixTypeLoc TL) { 6573 TL.setAttrNameLoc(readSourceLocation()); 6574 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6575 TL.setAttrRowOperand(Reader.readExpr()); 6576 TL.setAttrColumnOperand(Reader.readExpr()); 6577 } 6578 6579 void TypeLocReader::VisitDependentSizedMatrixTypeLoc( 6580 DependentSizedMatrixTypeLoc TL) { 6581 TL.setAttrNameLoc(readSourceLocation()); 6582 TL.setAttrOperandParensRange(Reader.readSourceRange()); 6583 TL.setAttrRowOperand(Reader.readExpr()); 6584 TL.setAttrColumnOperand(Reader.readExpr()); 6585 } 6586 6587 void TypeLocReader::VisitFunctionTypeLoc(FunctionTypeLoc TL) { 6588 TL.setLocalRangeBegin(readSourceLocation()); 6589 TL.setLParenLoc(readSourceLocation()); 6590 TL.setRParenLoc(readSourceLocation()); 6591 TL.setExceptionSpecRange(Reader.readSourceRange()); 6592 TL.setLocalRangeEnd(readSourceLocation()); 6593 for (unsigned i = 0, e = TL.getNumParams(); i != e; ++i) { 6594 TL.setParam(i, Reader.readDeclAs<ParmVarDecl>()); 6595 } 6596 } 6597 6598 void TypeLocReader::VisitFunctionProtoTypeLoc(FunctionProtoTypeLoc TL) { 6599 VisitFunctionTypeLoc(TL); 6600 } 6601 6602 void TypeLocReader::VisitFunctionNoProtoTypeLoc(FunctionNoProtoTypeLoc TL) { 6603 VisitFunctionTypeLoc(TL); 6604 } 6605 6606 void TypeLocReader::VisitUnresolvedUsingTypeLoc(UnresolvedUsingTypeLoc TL) { 6607 TL.setNameLoc(readSourceLocation()); 6608 } 6609 6610 void TypeLocReader::VisitTypedefTypeLoc(TypedefTypeLoc TL) { 6611 TL.setNameLoc(readSourceLocation()); 6612 } 6613 6614 void TypeLocReader::VisitTypeOfExprTypeLoc(TypeOfExprTypeLoc TL) { 6615 TL.setTypeofLoc(readSourceLocation()); 6616 TL.setLParenLoc(readSourceLocation()); 6617 TL.setRParenLoc(readSourceLocation()); 6618 } 6619 6620 void TypeLocReader::VisitTypeOfTypeLoc(TypeOfTypeLoc TL) { 6621 TL.setTypeofLoc(readSourceLocation()); 6622 TL.setLParenLoc(readSourceLocation()); 6623 TL.setRParenLoc(readSourceLocation()); 6624 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6625 } 6626 6627 void TypeLocReader::VisitDecltypeTypeLoc(DecltypeTypeLoc TL) { 6628 TL.setNameLoc(readSourceLocation()); 6629 } 6630 6631 void TypeLocReader::VisitUnaryTransformTypeLoc(UnaryTransformTypeLoc TL) { 6632 TL.setKWLoc(readSourceLocation()); 6633 TL.setLParenLoc(readSourceLocation()); 6634 TL.setRParenLoc(readSourceLocation()); 6635 TL.setUnderlyingTInfo(GetTypeSourceInfo()); 6636 } 6637 6638 void TypeLocReader::VisitAutoTypeLoc(AutoTypeLoc TL) { 6639 TL.setNameLoc(readSourceLocation()); 6640 if (Reader.readBool()) { 6641 TL.setNestedNameSpecifierLoc(ReadNestedNameSpecifierLoc()); 6642 TL.setTemplateKWLoc(readSourceLocation()); 6643 TL.setConceptNameLoc(readSourceLocation()); 6644 TL.setFoundDecl(Reader.readDeclAs<NamedDecl>()); 6645 TL.setLAngleLoc(readSourceLocation()); 6646 TL.setRAngleLoc(readSourceLocation()); 6647 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6648 TL.setArgLocInfo(i, Reader.readTemplateArgumentLocInfo( 6649 TL.getTypePtr()->getArg(i).getKind())); 6650 } 6651 } 6652 6653 void TypeLocReader::VisitDeducedTemplateSpecializationTypeLoc( 6654 DeducedTemplateSpecializationTypeLoc TL) { 6655 TL.setTemplateNameLoc(readSourceLocation()); 6656 } 6657 6658 void TypeLocReader::VisitRecordTypeLoc(RecordTypeLoc TL) { 6659 TL.setNameLoc(readSourceLocation()); 6660 } 6661 6662 void TypeLocReader::VisitEnumTypeLoc(EnumTypeLoc TL) { 6663 TL.setNameLoc(readSourceLocation()); 6664 } 6665 6666 void TypeLocReader::VisitAttributedTypeLoc(AttributedTypeLoc TL) { 6667 TL.setAttr(ReadAttr()); 6668 } 6669 6670 void TypeLocReader::VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { 6671 TL.setNameLoc(readSourceLocation()); 6672 } 6673 6674 void TypeLocReader::VisitSubstTemplateTypeParmTypeLoc( 6675 SubstTemplateTypeParmTypeLoc TL) { 6676 TL.setNameLoc(readSourceLocation()); 6677 } 6678 6679 void TypeLocReader::VisitSubstTemplateTypeParmPackTypeLoc( 6680 SubstTemplateTypeParmPackTypeLoc TL) { 6681 TL.setNameLoc(readSourceLocation()); 6682 } 6683 6684 void TypeLocReader::VisitTemplateSpecializationTypeLoc( 6685 TemplateSpecializationTypeLoc TL) { 6686 TL.setTemplateKeywordLoc(readSourceLocation()); 6687 TL.setTemplateNameLoc(readSourceLocation()); 6688 TL.setLAngleLoc(readSourceLocation()); 6689 TL.setRAngleLoc(readSourceLocation()); 6690 for (unsigned i = 0, e = TL.getNumArgs(); i != e; ++i) 6691 TL.setArgLocInfo( 6692 i, 6693 Reader.readTemplateArgumentLocInfo( 6694 TL.getTypePtr()->getArg(i).getKind())); 6695 } 6696 6697 void TypeLocReader::VisitParenTypeLoc(ParenTypeLoc TL) { 6698 TL.setLParenLoc(readSourceLocation()); 6699 TL.setRParenLoc(readSourceLocation()); 6700 } 6701 6702 void TypeLocReader::VisitElaboratedTypeLoc(ElaboratedTypeLoc TL) { 6703 TL.setElaboratedKeywordLoc(readSourceLocation()); 6704 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6705 } 6706 6707 void TypeLocReader::VisitInjectedClassNameTypeLoc(InjectedClassNameTypeLoc TL) { 6708 TL.setNameLoc(readSourceLocation()); 6709 } 6710 6711 void TypeLocReader::VisitDependentNameTypeLoc(DependentNameTypeLoc TL) { 6712 TL.setElaboratedKeywordLoc(readSourceLocation()); 6713 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6714 TL.setNameLoc(readSourceLocation()); 6715 } 6716 6717 void TypeLocReader::VisitDependentTemplateSpecializationTypeLoc( 6718 DependentTemplateSpecializationTypeLoc TL) { 6719 TL.setElaboratedKeywordLoc(readSourceLocation()); 6720 TL.setQualifierLoc(ReadNestedNameSpecifierLoc()); 6721 TL.setTemplateKeywordLoc(readSourceLocation()); 6722 TL.setTemplateNameLoc(readSourceLocation()); 6723 TL.setLAngleLoc(readSourceLocation()); 6724 TL.setRAngleLoc(readSourceLocation()); 6725 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) 6726 TL.setArgLocInfo( 6727 I, 6728 Reader.readTemplateArgumentLocInfo( 6729 TL.getTypePtr()->getArg(I).getKind())); 6730 } 6731 6732 void TypeLocReader::VisitPackExpansionTypeLoc(PackExpansionTypeLoc TL) { 6733 TL.setEllipsisLoc(readSourceLocation()); 6734 } 6735 6736 void TypeLocReader::VisitObjCInterfaceTypeLoc(ObjCInterfaceTypeLoc TL) { 6737 TL.setNameLoc(readSourceLocation()); 6738 } 6739 6740 void TypeLocReader::VisitObjCTypeParamTypeLoc(ObjCTypeParamTypeLoc TL) { 6741 if (TL.getNumProtocols()) { 6742 TL.setProtocolLAngleLoc(readSourceLocation()); 6743 TL.setProtocolRAngleLoc(readSourceLocation()); 6744 } 6745 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6746 TL.setProtocolLoc(i, readSourceLocation()); 6747 } 6748 6749 void TypeLocReader::VisitObjCObjectTypeLoc(ObjCObjectTypeLoc TL) { 6750 TL.setHasBaseTypeAsWritten(Reader.readBool()); 6751 TL.setTypeArgsLAngleLoc(readSourceLocation()); 6752 TL.setTypeArgsRAngleLoc(readSourceLocation()); 6753 for (unsigned i = 0, e = TL.getNumTypeArgs(); i != e; ++i) 6754 TL.setTypeArgTInfo(i, GetTypeSourceInfo()); 6755 TL.setProtocolLAngleLoc(readSourceLocation()); 6756 TL.setProtocolRAngleLoc(readSourceLocation()); 6757 for (unsigned i = 0, e = TL.getNumProtocols(); i != e; ++i) 6758 TL.setProtocolLoc(i, readSourceLocation()); 6759 } 6760 6761 void TypeLocReader::VisitObjCObjectPointerTypeLoc(ObjCObjectPointerTypeLoc TL) { 6762 TL.setStarLoc(readSourceLocation()); 6763 } 6764 6765 void TypeLocReader::VisitAtomicTypeLoc(AtomicTypeLoc TL) { 6766 TL.setKWLoc(readSourceLocation()); 6767 TL.setLParenLoc(readSourceLocation()); 6768 TL.setRParenLoc(readSourceLocation()); 6769 } 6770 6771 void TypeLocReader::VisitPipeTypeLoc(PipeTypeLoc TL) { 6772 TL.setKWLoc(readSourceLocation()); 6773 } 6774 6775 void TypeLocReader::VisitExtIntTypeLoc(clang::ExtIntTypeLoc TL) { 6776 TL.setNameLoc(readSourceLocation()); 6777 } 6778 void TypeLocReader::VisitDependentExtIntTypeLoc( 6779 clang::DependentExtIntTypeLoc TL) { 6780 TL.setNameLoc(readSourceLocation()); 6781 } 6782 6783 6784 void ASTRecordReader::readTypeLoc(TypeLoc TL) { 6785 TypeLocReader TLR(*this); 6786 for (; !TL.isNull(); TL = TL.getNextTypeLoc()) 6787 TLR.Visit(TL); 6788 } 6789 6790 TypeSourceInfo *ASTRecordReader::readTypeSourceInfo() { 6791 QualType InfoTy = readType(); 6792 if (InfoTy.isNull()) 6793 return nullptr; 6794 6795 TypeSourceInfo *TInfo = getContext().CreateTypeSourceInfo(InfoTy); 6796 readTypeLoc(TInfo->getTypeLoc()); 6797 return TInfo; 6798 } 6799 6800 QualType ASTReader::GetType(TypeID ID) { 6801 assert(ContextObj && "reading type with no AST context"); 6802 ASTContext &Context = *ContextObj; 6803 6804 unsigned FastQuals = ID & Qualifiers::FastMask; 6805 unsigned Index = ID >> Qualifiers::FastWidth; 6806 6807 if (Index < NUM_PREDEF_TYPE_IDS) { 6808 QualType T; 6809 switch ((PredefinedTypeIDs)Index) { 6810 case PREDEF_TYPE_NULL_ID: 6811 return QualType(); 6812 case PREDEF_TYPE_VOID_ID: 6813 T = Context.VoidTy; 6814 break; 6815 case PREDEF_TYPE_BOOL_ID: 6816 T = Context.BoolTy; 6817 break; 6818 case PREDEF_TYPE_CHAR_U_ID: 6819 case PREDEF_TYPE_CHAR_S_ID: 6820 // FIXME: Check that the signedness of CharTy is correct! 6821 T = Context.CharTy; 6822 break; 6823 case PREDEF_TYPE_UCHAR_ID: 6824 T = Context.UnsignedCharTy; 6825 break; 6826 case PREDEF_TYPE_USHORT_ID: 6827 T = Context.UnsignedShortTy; 6828 break; 6829 case PREDEF_TYPE_UINT_ID: 6830 T = Context.UnsignedIntTy; 6831 break; 6832 case PREDEF_TYPE_ULONG_ID: 6833 T = Context.UnsignedLongTy; 6834 break; 6835 case PREDEF_TYPE_ULONGLONG_ID: 6836 T = Context.UnsignedLongLongTy; 6837 break; 6838 case PREDEF_TYPE_UINT128_ID: 6839 T = Context.UnsignedInt128Ty; 6840 break; 6841 case PREDEF_TYPE_SCHAR_ID: 6842 T = Context.SignedCharTy; 6843 break; 6844 case PREDEF_TYPE_WCHAR_ID: 6845 T = Context.WCharTy; 6846 break; 6847 case PREDEF_TYPE_SHORT_ID: 6848 T = Context.ShortTy; 6849 break; 6850 case PREDEF_TYPE_INT_ID: 6851 T = Context.IntTy; 6852 break; 6853 case PREDEF_TYPE_LONG_ID: 6854 T = Context.LongTy; 6855 break; 6856 case PREDEF_TYPE_LONGLONG_ID: 6857 T = Context.LongLongTy; 6858 break; 6859 case PREDEF_TYPE_INT128_ID: 6860 T = Context.Int128Ty; 6861 break; 6862 case PREDEF_TYPE_BFLOAT16_ID: 6863 T = Context.BFloat16Ty; 6864 break; 6865 case PREDEF_TYPE_HALF_ID: 6866 T = Context.HalfTy; 6867 break; 6868 case PREDEF_TYPE_FLOAT_ID: 6869 T = Context.FloatTy; 6870 break; 6871 case PREDEF_TYPE_DOUBLE_ID: 6872 T = Context.DoubleTy; 6873 break; 6874 case PREDEF_TYPE_LONGDOUBLE_ID: 6875 T = Context.LongDoubleTy; 6876 break; 6877 case PREDEF_TYPE_SHORT_ACCUM_ID: 6878 T = Context.ShortAccumTy; 6879 break; 6880 case PREDEF_TYPE_ACCUM_ID: 6881 T = Context.AccumTy; 6882 break; 6883 case PREDEF_TYPE_LONG_ACCUM_ID: 6884 T = Context.LongAccumTy; 6885 break; 6886 case PREDEF_TYPE_USHORT_ACCUM_ID: 6887 T = Context.UnsignedShortAccumTy; 6888 break; 6889 case PREDEF_TYPE_UACCUM_ID: 6890 T = Context.UnsignedAccumTy; 6891 break; 6892 case PREDEF_TYPE_ULONG_ACCUM_ID: 6893 T = Context.UnsignedLongAccumTy; 6894 break; 6895 case PREDEF_TYPE_SHORT_FRACT_ID: 6896 T = Context.ShortFractTy; 6897 break; 6898 case PREDEF_TYPE_FRACT_ID: 6899 T = Context.FractTy; 6900 break; 6901 case PREDEF_TYPE_LONG_FRACT_ID: 6902 T = Context.LongFractTy; 6903 break; 6904 case PREDEF_TYPE_USHORT_FRACT_ID: 6905 T = Context.UnsignedShortFractTy; 6906 break; 6907 case PREDEF_TYPE_UFRACT_ID: 6908 T = Context.UnsignedFractTy; 6909 break; 6910 case PREDEF_TYPE_ULONG_FRACT_ID: 6911 T = Context.UnsignedLongFractTy; 6912 break; 6913 case PREDEF_TYPE_SAT_SHORT_ACCUM_ID: 6914 T = Context.SatShortAccumTy; 6915 break; 6916 case PREDEF_TYPE_SAT_ACCUM_ID: 6917 T = Context.SatAccumTy; 6918 break; 6919 case PREDEF_TYPE_SAT_LONG_ACCUM_ID: 6920 T = Context.SatLongAccumTy; 6921 break; 6922 case PREDEF_TYPE_SAT_USHORT_ACCUM_ID: 6923 T = Context.SatUnsignedShortAccumTy; 6924 break; 6925 case PREDEF_TYPE_SAT_UACCUM_ID: 6926 T = Context.SatUnsignedAccumTy; 6927 break; 6928 case PREDEF_TYPE_SAT_ULONG_ACCUM_ID: 6929 T = Context.SatUnsignedLongAccumTy; 6930 break; 6931 case PREDEF_TYPE_SAT_SHORT_FRACT_ID: 6932 T = Context.SatShortFractTy; 6933 break; 6934 case PREDEF_TYPE_SAT_FRACT_ID: 6935 T = Context.SatFractTy; 6936 break; 6937 case PREDEF_TYPE_SAT_LONG_FRACT_ID: 6938 T = Context.SatLongFractTy; 6939 break; 6940 case PREDEF_TYPE_SAT_USHORT_FRACT_ID: 6941 T = Context.SatUnsignedShortFractTy; 6942 break; 6943 case PREDEF_TYPE_SAT_UFRACT_ID: 6944 T = Context.SatUnsignedFractTy; 6945 break; 6946 case PREDEF_TYPE_SAT_ULONG_FRACT_ID: 6947 T = Context.SatUnsignedLongFractTy; 6948 break; 6949 case PREDEF_TYPE_FLOAT16_ID: 6950 T = Context.Float16Ty; 6951 break; 6952 case PREDEF_TYPE_FLOAT128_ID: 6953 T = Context.Float128Ty; 6954 break; 6955 case PREDEF_TYPE_IBM128_ID: 6956 T = Context.Ibm128Ty; 6957 break; 6958 case PREDEF_TYPE_OVERLOAD_ID: 6959 T = Context.OverloadTy; 6960 break; 6961 case PREDEF_TYPE_BOUND_MEMBER: 6962 T = Context.BoundMemberTy; 6963 break; 6964 case PREDEF_TYPE_PSEUDO_OBJECT: 6965 T = Context.PseudoObjectTy; 6966 break; 6967 case PREDEF_TYPE_DEPENDENT_ID: 6968 T = Context.DependentTy; 6969 break; 6970 case PREDEF_TYPE_UNKNOWN_ANY: 6971 T = Context.UnknownAnyTy; 6972 break; 6973 case PREDEF_TYPE_NULLPTR_ID: 6974 T = Context.NullPtrTy; 6975 break; 6976 case PREDEF_TYPE_CHAR8_ID: 6977 T = Context.Char8Ty; 6978 break; 6979 case PREDEF_TYPE_CHAR16_ID: 6980 T = Context.Char16Ty; 6981 break; 6982 case PREDEF_TYPE_CHAR32_ID: 6983 T = Context.Char32Ty; 6984 break; 6985 case PREDEF_TYPE_OBJC_ID: 6986 T = Context.ObjCBuiltinIdTy; 6987 break; 6988 case PREDEF_TYPE_OBJC_CLASS: 6989 T = Context.ObjCBuiltinClassTy; 6990 break; 6991 case PREDEF_TYPE_OBJC_SEL: 6992 T = Context.ObjCBuiltinSelTy; 6993 break; 6994 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 6995 case PREDEF_TYPE_##Id##_ID: \ 6996 T = Context.SingletonId; \ 6997 break; 6998 #include "clang/Basic/OpenCLImageTypes.def" 6999 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \ 7000 case PREDEF_TYPE_##Id##_ID: \ 7001 T = Context.Id##Ty; \ 7002 break; 7003 #include "clang/Basic/OpenCLExtensionTypes.def" 7004 case PREDEF_TYPE_SAMPLER_ID: 7005 T = Context.OCLSamplerTy; 7006 break; 7007 case PREDEF_TYPE_EVENT_ID: 7008 T = Context.OCLEventTy; 7009 break; 7010 case PREDEF_TYPE_CLK_EVENT_ID: 7011 T = Context.OCLClkEventTy; 7012 break; 7013 case PREDEF_TYPE_QUEUE_ID: 7014 T = Context.OCLQueueTy; 7015 break; 7016 case PREDEF_TYPE_RESERVE_ID_ID: 7017 T = Context.OCLReserveIDTy; 7018 break; 7019 case PREDEF_TYPE_AUTO_DEDUCT: 7020 T = Context.getAutoDeductType(); 7021 break; 7022 case PREDEF_TYPE_AUTO_RREF_DEDUCT: 7023 T = Context.getAutoRRefDeductType(); 7024 break; 7025 case PREDEF_TYPE_ARC_UNBRIDGED_CAST: 7026 T = Context.ARCUnbridgedCastTy; 7027 break; 7028 case PREDEF_TYPE_BUILTIN_FN: 7029 T = Context.BuiltinFnTy; 7030 break; 7031 case PREDEF_TYPE_INCOMPLETE_MATRIX_IDX: 7032 T = Context.IncompleteMatrixIdxTy; 7033 break; 7034 case PREDEF_TYPE_OMP_ARRAY_SECTION: 7035 T = Context.OMPArraySectionTy; 7036 break; 7037 case PREDEF_TYPE_OMP_ARRAY_SHAPING: 7038 T = Context.OMPArraySectionTy; 7039 break; 7040 case PREDEF_TYPE_OMP_ITERATOR: 7041 T = Context.OMPIteratorTy; 7042 break; 7043 #define SVE_TYPE(Name, Id, SingletonId) \ 7044 case PREDEF_TYPE_##Id##_ID: \ 7045 T = Context.SingletonId; \ 7046 break; 7047 #include "clang/Basic/AArch64SVEACLETypes.def" 7048 #define PPC_VECTOR_TYPE(Name, Id, Size) \ 7049 case PREDEF_TYPE_##Id##_ID: \ 7050 T = Context.Id##Ty; \ 7051 break; 7052 #include "clang/Basic/PPCTypes.def" 7053 #define RVV_TYPE(Name, Id, SingletonId) \ 7054 case PREDEF_TYPE_##Id##_ID: \ 7055 T = Context.SingletonId; \ 7056 break; 7057 #include "clang/Basic/RISCVVTypes.def" 7058 } 7059 7060 assert(!T.isNull() && "Unknown predefined type"); 7061 return T.withFastQualifiers(FastQuals); 7062 } 7063 7064 Index -= NUM_PREDEF_TYPE_IDS; 7065 assert(Index < TypesLoaded.size() && "Type index out-of-range"); 7066 if (TypesLoaded[Index].isNull()) { 7067 TypesLoaded[Index] = readTypeRecord(Index); 7068 if (TypesLoaded[Index].isNull()) 7069 return QualType(); 7070 7071 TypesLoaded[Index]->setFromAST(); 7072 if (DeserializationListener) 7073 DeserializationListener->TypeRead(TypeIdx::fromTypeID(ID), 7074 TypesLoaded[Index]); 7075 } 7076 7077 return TypesLoaded[Index].withFastQualifiers(FastQuals); 7078 } 7079 7080 QualType ASTReader::getLocalType(ModuleFile &F, unsigned LocalID) { 7081 return GetType(getGlobalTypeID(F, LocalID)); 7082 } 7083 7084 serialization::TypeID 7085 ASTReader::getGlobalTypeID(ModuleFile &F, unsigned LocalID) const { 7086 unsigned FastQuals = LocalID & Qualifiers::FastMask; 7087 unsigned LocalIndex = LocalID >> Qualifiers::FastWidth; 7088 7089 if (LocalIndex < NUM_PREDEF_TYPE_IDS) 7090 return LocalID; 7091 7092 if (!F.ModuleOffsetMap.empty()) 7093 ReadModuleOffsetMap(F); 7094 7095 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7096 = F.TypeRemap.find(LocalIndex - NUM_PREDEF_TYPE_IDS); 7097 assert(I != F.TypeRemap.end() && "Invalid index into type index remap"); 7098 7099 unsigned GlobalIndex = LocalIndex + I->second; 7100 return (GlobalIndex << Qualifiers::FastWidth) | FastQuals; 7101 } 7102 7103 TemplateArgumentLocInfo 7104 ASTRecordReader::readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind) { 7105 switch (Kind) { 7106 case TemplateArgument::Expression: 7107 return readExpr(); 7108 case TemplateArgument::Type: 7109 return readTypeSourceInfo(); 7110 case TemplateArgument::Template: { 7111 NestedNameSpecifierLoc QualifierLoc = 7112 readNestedNameSpecifierLoc(); 7113 SourceLocation TemplateNameLoc = readSourceLocation(); 7114 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7115 TemplateNameLoc, SourceLocation()); 7116 } 7117 case TemplateArgument::TemplateExpansion: { 7118 NestedNameSpecifierLoc QualifierLoc = readNestedNameSpecifierLoc(); 7119 SourceLocation TemplateNameLoc = readSourceLocation(); 7120 SourceLocation EllipsisLoc = readSourceLocation(); 7121 return TemplateArgumentLocInfo(getASTContext(), QualifierLoc, 7122 TemplateNameLoc, EllipsisLoc); 7123 } 7124 case TemplateArgument::Null: 7125 case TemplateArgument::Integral: 7126 case TemplateArgument::Declaration: 7127 case TemplateArgument::NullPtr: 7128 case TemplateArgument::Pack: 7129 // FIXME: Is this right? 7130 return TemplateArgumentLocInfo(); 7131 } 7132 llvm_unreachable("unexpected template argument loc"); 7133 } 7134 7135 TemplateArgumentLoc ASTRecordReader::readTemplateArgumentLoc() { 7136 TemplateArgument Arg = readTemplateArgument(); 7137 7138 if (Arg.getKind() == TemplateArgument::Expression) { 7139 if (readBool()) // bool InfoHasSameExpr. 7140 return TemplateArgumentLoc(Arg, TemplateArgumentLocInfo(Arg.getAsExpr())); 7141 } 7142 return TemplateArgumentLoc(Arg, readTemplateArgumentLocInfo(Arg.getKind())); 7143 } 7144 7145 const ASTTemplateArgumentListInfo * 7146 ASTRecordReader::readASTTemplateArgumentListInfo() { 7147 SourceLocation LAngleLoc = readSourceLocation(); 7148 SourceLocation RAngleLoc = readSourceLocation(); 7149 unsigned NumArgsAsWritten = readInt(); 7150 TemplateArgumentListInfo TemplArgsInfo(LAngleLoc, RAngleLoc); 7151 for (unsigned i = 0; i != NumArgsAsWritten; ++i) 7152 TemplArgsInfo.addArgument(readTemplateArgumentLoc()); 7153 return ASTTemplateArgumentListInfo::Create(getContext(), TemplArgsInfo); 7154 } 7155 7156 Decl *ASTReader::GetExternalDecl(uint32_t ID) { 7157 return GetDecl(ID); 7158 } 7159 7160 void ASTReader::CompleteRedeclChain(const Decl *D) { 7161 if (NumCurrentElementsDeserializing) { 7162 // We arrange to not care about the complete redeclaration chain while we're 7163 // deserializing. Just remember that the AST has marked this one as complete 7164 // but that it's not actually complete yet, so we know we still need to 7165 // complete it later. 7166 PendingIncompleteDeclChains.push_back(const_cast<Decl*>(D)); 7167 return; 7168 } 7169 7170 if (!D->getDeclContext()) { 7171 assert(isa<TranslationUnitDecl>(D) && "Not a TU?"); 7172 return; 7173 } 7174 7175 const DeclContext *DC = D->getDeclContext()->getRedeclContext(); 7176 7177 // If this is a named declaration, complete it by looking it up 7178 // within its context. 7179 // 7180 // FIXME: Merging a function definition should merge 7181 // all mergeable entities within it. 7182 if (isa<TranslationUnitDecl>(DC) || isa<NamespaceDecl>(DC) || 7183 isa<CXXRecordDecl>(DC) || isa<EnumDecl>(DC)) { 7184 if (DeclarationName Name = cast<NamedDecl>(D)->getDeclName()) { 7185 if (!getContext().getLangOpts().CPlusPlus && 7186 isa<TranslationUnitDecl>(DC)) { 7187 // Outside of C++, we don't have a lookup table for the TU, so update 7188 // the identifier instead. (For C++ modules, we don't store decls 7189 // in the serialized identifier table, so we do the lookup in the TU.) 7190 auto *II = Name.getAsIdentifierInfo(); 7191 assert(II && "non-identifier name in C?"); 7192 if (II->isOutOfDate()) 7193 updateOutOfDateIdentifier(*II); 7194 } else 7195 DC->lookup(Name); 7196 } else if (needsAnonymousDeclarationNumber(cast<NamedDecl>(D))) { 7197 // Find all declarations of this kind from the relevant context. 7198 for (auto *DCDecl : cast<Decl>(D->getLexicalDeclContext())->redecls()) { 7199 auto *DC = cast<DeclContext>(DCDecl); 7200 SmallVector<Decl*, 8> Decls; 7201 FindExternalLexicalDecls( 7202 DC, [&](Decl::Kind K) { return K == D->getKind(); }, Decls); 7203 } 7204 } 7205 } 7206 7207 if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) 7208 CTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7209 if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D)) 7210 VTSD->getSpecializedTemplate()->LoadLazySpecializations(); 7211 if (auto *FD = dyn_cast<FunctionDecl>(D)) { 7212 if (auto *Template = FD->getPrimaryTemplate()) 7213 Template->LoadLazySpecializations(); 7214 } 7215 } 7216 7217 CXXCtorInitializer ** 7218 ASTReader::GetExternalCXXCtorInitializers(uint64_t Offset) { 7219 RecordLocation Loc = getLocalBitOffset(Offset); 7220 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7221 SavedStreamPosition SavedPosition(Cursor); 7222 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7223 Error(std::move(Err)); 7224 return nullptr; 7225 } 7226 ReadingKindTracker ReadingKind(Read_Decl, *this); 7227 7228 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7229 if (!MaybeCode) { 7230 Error(MaybeCode.takeError()); 7231 return nullptr; 7232 } 7233 unsigned Code = MaybeCode.get(); 7234 7235 ASTRecordReader Record(*this, *Loc.F); 7236 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7237 if (!MaybeRecCode) { 7238 Error(MaybeRecCode.takeError()); 7239 return nullptr; 7240 } 7241 if (MaybeRecCode.get() != DECL_CXX_CTOR_INITIALIZERS) { 7242 Error("malformed AST file: missing C++ ctor initializers"); 7243 return nullptr; 7244 } 7245 7246 return Record.readCXXCtorInitializers(); 7247 } 7248 7249 CXXBaseSpecifier *ASTReader::GetExternalCXXBaseSpecifiers(uint64_t Offset) { 7250 assert(ContextObj && "reading base specifiers with no AST context"); 7251 ASTContext &Context = *ContextObj; 7252 7253 RecordLocation Loc = getLocalBitOffset(Offset); 7254 BitstreamCursor &Cursor = Loc.F->DeclsCursor; 7255 SavedStreamPosition SavedPosition(Cursor); 7256 if (llvm::Error Err = Cursor.JumpToBit(Loc.Offset)) { 7257 Error(std::move(Err)); 7258 return nullptr; 7259 } 7260 ReadingKindTracker ReadingKind(Read_Decl, *this); 7261 7262 Expected<unsigned> MaybeCode = Cursor.ReadCode(); 7263 if (!MaybeCode) { 7264 Error(MaybeCode.takeError()); 7265 return nullptr; 7266 } 7267 unsigned Code = MaybeCode.get(); 7268 7269 ASTRecordReader Record(*this, *Loc.F); 7270 Expected<unsigned> MaybeRecCode = Record.readRecord(Cursor, Code); 7271 if (!MaybeRecCode) { 7272 Error(MaybeCode.takeError()); 7273 return nullptr; 7274 } 7275 unsigned RecCode = MaybeRecCode.get(); 7276 7277 if (RecCode != DECL_CXX_BASE_SPECIFIERS) { 7278 Error("malformed AST file: missing C++ base specifiers"); 7279 return nullptr; 7280 } 7281 7282 unsigned NumBases = Record.readInt(); 7283 void *Mem = Context.Allocate(sizeof(CXXBaseSpecifier) * NumBases); 7284 CXXBaseSpecifier *Bases = new (Mem) CXXBaseSpecifier [NumBases]; 7285 for (unsigned I = 0; I != NumBases; ++I) 7286 Bases[I] = Record.readCXXBaseSpecifier(); 7287 return Bases; 7288 } 7289 7290 serialization::DeclID 7291 ASTReader::getGlobalDeclID(ModuleFile &F, LocalDeclID LocalID) const { 7292 if (LocalID < NUM_PREDEF_DECL_IDS) 7293 return LocalID; 7294 7295 if (!F.ModuleOffsetMap.empty()) 7296 ReadModuleOffsetMap(F); 7297 7298 ContinuousRangeMap<uint32_t, int, 2>::iterator I 7299 = F.DeclRemap.find(LocalID - NUM_PREDEF_DECL_IDS); 7300 assert(I != F.DeclRemap.end() && "Invalid index into decl index remap"); 7301 7302 return LocalID + I->second; 7303 } 7304 7305 bool ASTReader::isDeclIDFromModule(serialization::GlobalDeclID ID, 7306 ModuleFile &M) const { 7307 // Predefined decls aren't from any module. 7308 if (ID < NUM_PREDEF_DECL_IDS) 7309 return false; 7310 7311 return ID - NUM_PREDEF_DECL_IDS >= M.BaseDeclID && 7312 ID - NUM_PREDEF_DECL_IDS < M.BaseDeclID + M.LocalNumDecls; 7313 } 7314 7315 ModuleFile *ASTReader::getOwningModuleFile(const Decl *D) { 7316 if (!D->isFromASTFile()) 7317 return nullptr; 7318 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(D->getGlobalID()); 7319 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7320 return I->second; 7321 } 7322 7323 SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) { 7324 if (ID < NUM_PREDEF_DECL_IDS) 7325 return SourceLocation(); 7326 7327 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7328 7329 if (Index > DeclsLoaded.size()) { 7330 Error("declaration ID out-of-range for AST file"); 7331 return SourceLocation(); 7332 } 7333 7334 if (Decl *D = DeclsLoaded[Index]) 7335 return D->getLocation(); 7336 7337 SourceLocation Loc; 7338 DeclCursorForID(ID, Loc); 7339 return Loc; 7340 } 7341 7342 static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) { 7343 switch (ID) { 7344 case PREDEF_DECL_NULL_ID: 7345 return nullptr; 7346 7347 case PREDEF_DECL_TRANSLATION_UNIT_ID: 7348 return Context.getTranslationUnitDecl(); 7349 7350 case PREDEF_DECL_OBJC_ID_ID: 7351 return Context.getObjCIdDecl(); 7352 7353 case PREDEF_DECL_OBJC_SEL_ID: 7354 return Context.getObjCSelDecl(); 7355 7356 case PREDEF_DECL_OBJC_CLASS_ID: 7357 return Context.getObjCClassDecl(); 7358 7359 case PREDEF_DECL_OBJC_PROTOCOL_ID: 7360 return Context.getObjCProtocolDecl(); 7361 7362 case PREDEF_DECL_INT_128_ID: 7363 return Context.getInt128Decl(); 7364 7365 case PREDEF_DECL_UNSIGNED_INT_128_ID: 7366 return Context.getUInt128Decl(); 7367 7368 case PREDEF_DECL_OBJC_INSTANCETYPE_ID: 7369 return Context.getObjCInstanceTypeDecl(); 7370 7371 case PREDEF_DECL_BUILTIN_VA_LIST_ID: 7372 return Context.getBuiltinVaListDecl(); 7373 7374 case PREDEF_DECL_VA_LIST_TAG: 7375 return Context.getVaListTagDecl(); 7376 7377 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID: 7378 return Context.getBuiltinMSVaListDecl(); 7379 7380 case PREDEF_DECL_BUILTIN_MS_GUID_ID: 7381 return Context.getMSGuidTagDecl(); 7382 7383 case PREDEF_DECL_EXTERN_C_CONTEXT_ID: 7384 return Context.getExternCContextDecl(); 7385 7386 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID: 7387 return Context.getMakeIntegerSeqDecl(); 7388 7389 case PREDEF_DECL_CF_CONSTANT_STRING_ID: 7390 return Context.getCFConstantStringDecl(); 7391 7392 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID: 7393 return Context.getCFConstantStringTagDecl(); 7394 7395 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID: 7396 return Context.getTypePackElementDecl(); 7397 } 7398 llvm_unreachable("PredefinedDeclIDs unknown enum value"); 7399 } 7400 7401 Decl *ASTReader::GetExistingDecl(DeclID ID) { 7402 assert(ContextObj && "reading decl with no AST context"); 7403 if (ID < NUM_PREDEF_DECL_IDS) { 7404 Decl *D = getPredefinedDecl(*ContextObj, (PredefinedDeclIDs)ID); 7405 if (D) { 7406 // Track that we have merged the declaration with ID \p ID into the 7407 // pre-existing predefined declaration \p D. 7408 auto &Merged = KeyDecls[D->getCanonicalDecl()]; 7409 if (Merged.empty()) 7410 Merged.push_back(ID); 7411 } 7412 return D; 7413 } 7414 7415 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7416 7417 if (Index >= DeclsLoaded.size()) { 7418 assert(0 && "declaration ID out-of-range for AST file"); 7419 Error("declaration ID out-of-range for AST file"); 7420 return nullptr; 7421 } 7422 7423 return DeclsLoaded[Index]; 7424 } 7425 7426 Decl *ASTReader::GetDecl(DeclID ID) { 7427 if (ID < NUM_PREDEF_DECL_IDS) 7428 return GetExistingDecl(ID); 7429 7430 unsigned Index = ID - NUM_PREDEF_DECL_IDS; 7431 7432 if (Index >= DeclsLoaded.size()) { 7433 assert(0 && "declaration ID out-of-range for AST file"); 7434 Error("declaration ID out-of-range for AST file"); 7435 return nullptr; 7436 } 7437 7438 if (!DeclsLoaded[Index]) { 7439 ReadDeclRecord(ID); 7440 if (DeserializationListener) 7441 DeserializationListener->DeclRead(ID, DeclsLoaded[Index]); 7442 } 7443 7444 return DeclsLoaded[Index]; 7445 } 7446 7447 DeclID ASTReader::mapGlobalIDToModuleFileGlobalID(ModuleFile &M, 7448 DeclID GlobalID) { 7449 if (GlobalID < NUM_PREDEF_DECL_IDS) 7450 return GlobalID; 7451 7452 GlobalDeclMapType::const_iterator I = GlobalDeclMap.find(GlobalID); 7453 assert(I != GlobalDeclMap.end() && "Corrupted global declaration map"); 7454 ModuleFile *Owner = I->second; 7455 7456 llvm::DenseMap<ModuleFile *, serialization::DeclID>::iterator Pos 7457 = M.GlobalToLocalDeclIDs.find(Owner); 7458 if (Pos == M.GlobalToLocalDeclIDs.end()) 7459 return 0; 7460 7461 return GlobalID - Owner->BaseDeclID + Pos->second; 7462 } 7463 7464 serialization::DeclID ASTReader::ReadDeclID(ModuleFile &F, 7465 const RecordData &Record, 7466 unsigned &Idx) { 7467 if (Idx >= Record.size()) { 7468 Error("Corrupted AST file"); 7469 return 0; 7470 } 7471 7472 return getGlobalDeclID(F, Record[Idx++]); 7473 } 7474 7475 /// Resolve the offset of a statement into a statement. 7476 /// 7477 /// This operation will read a new statement from the external 7478 /// source each time it is called, and is meant to be used via a 7479 /// LazyOffsetPtr (which is used by Decls for the body of functions, etc). 7480 Stmt *ASTReader::GetExternalDeclStmt(uint64_t Offset) { 7481 // Switch case IDs are per Decl. 7482 ClearSwitchCaseIDs(); 7483 7484 // Offset here is a global offset across the entire chain. 7485 RecordLocation Loc = getLocalBitOffset(Offset); 7486 if (llvm::Error Err = Loc.F->DeclsCursor.JumpToBit(Loc.Offset)) { 7487 Error(std::move(Err)); 7488 return nullptr; 7489 } 7490 assert(NumCurrentElementsDeserializing == 0 && 7491 "should not be called while already deserializing"); 7492 Deserializing D(this); 7493 return ReadStmtFromStream(*Loc.F); 7494 } 7495 7496 void ASTReader::FindExternalLexicalDecls( 7497 const DeclContext *DC, llvm::function_ref<bool(Decl::Kind)> IsKindWeWant, 7498 SmallVectorImpl<Decl *> &Decls) { 7499 bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; 7500 7501 auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { 7502 assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); 7503 for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { 7504 auto K = (Decl::Kind)+LexicalDecls[I]; 7505 if (!IsKindWeWant(K)) 7506 continue; 7507 7508 auto ID = (serialization::DeclID)+LexicalDecls[I + 1]; 7509 7510 // Don't add predefined declarations to the lexical context more 7511 // than once. 7512 if (ID < NUM_PREDEF_DECL_IDS) { 7513 if (PredefsVisited[ID]) 7514 continue; 7515 7516 PredefsVisited[ID] = true; 7517 } 7518 7519 if (Decl *D = GetLocalDecl(*M, ID)) { 7520 assert(D->getKind() == K && "wrong kind for lexical decl"); 7521 if (!DC->isDeclInLexicalTraversal(D)) 7522 Decls.push_back(D); 7523 } 7524 } 7525 }; 7526 7527 if (isa<TranslationUnitDecl>(DC)) { 7528 for (auto Lexical : TULexicalDecls) 7529 Visit(Lexical.first, Lexical.second); 7530 } else { 7531 auto I = LexicalDecls.find(DC); 7532 if (I != LexicalDecls.end()) 7533 Visit(I->second.first, I->second.second); 7534 } 7535 7536 ++NumLexicalDeclContextsRead; 7537 } 7538 7539 namespace { 7540 7541 class DeclIDComp { 7542 ASTReader &Reader; 7543 ModuleFile &Mod; 7544 7545 public: 7546 DeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} 7547 7548 bool operator()(LocalDeclID L, LocalDeclID R) const { 7549 SourceLocation LHS = getLocation(L); 7550 SourceLocation RHS = getLocation(R); 7551 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7552 } 7553 7554 bool operator()(SourceLocation LHS, LocalDeclID R) const { 7555 SourceLocation RHS = getLocation(R); 7556 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7557 } 7558 7559 bool operator()(LocalDeclID L, SourceLocation RHS) const { 7560 SourceLocation LHS = getLocation(L); 7561 return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); 7562 } 7563 7564 SourceLocation getLocation(LocalDeclID ID) const { 7565 return Reader.getSourceManager().getFileLoc( 7566 Reader.getSourceLocationForDeclID(Reader.getGlobalDeclID(Mod, ID))); 7567 } 7568 }; 7569 7570 } // namespace 7571 7572 void ASTReader::FindFileRegionDecls(FileID File, 7573 unsigned Offset, unsigned Length, 7574 SmallVectorImpl<Decl *> &Decls) { 7575 SourceManager &SM = getSourceManager(); 7576 7577 llvm::DenseMap<FileID, FileDeclsInfo>::iterator I = FileDeclIDs.find(File); 7578 if (I == FileDeclIDs.end()) 7579 return; 7580 7581 FileDeclsInfo &DInfo = I->second; 7582 if (DInfo.Decls.empty()) 7583 return; 7584 7585 SourceLocation 7586 BeginLoc = SM.getLocForStartOfFile(File).getLocWithOffset(Offset); 7587 SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); 7588 7589 DeclIDComp DIDComp(*this, *DInfo.Mod); 7590 ArrayRef<serialization::LocalDeclID>::iterator BeginIt = 7591 llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); 7592 if (BeginIt != DInfo.Decls.begin()) 7593 --BeginIt; 7594 7595 // If we are pointing at a top-level decl inside an objc container, we need 7596 // to backtrack until we find it otherwise we will fail to report that the 7597 // region overlaps with an objc container. 7598 while (BeginIt != DInfo.Decls.begin() && 7599 GetDecl(getGlobalDeclID(*DInfo.Mod, *BeginIt)) 7600 ->isTopLevelDeclInObjCContainer()) 7601 --BeginIt; 7602 7603 ArrayRef<serialization::LocalDeclID>::iterator EndIt = 7604 llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); 7605 if (EndIt != DInfo.Decls.end()) 7606 ++EndIt; 7607 7608 for (ArrayRef<serialization::LocalDeclID>::iterator 7609 DIt = BeginIt; DIt != EndIt; ++DIt) 7610 Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, *DIt))); 7611 } 7612 7613 bool 7614 ASTReader::FindExternalVisibleDeclsByName(const DeclContext *DC, 7615 DeclarationName Name) { 7616 assert(DC->hasExternalVisibleStorage() && DC == DC->getPrimaryContext() && 7617 "DeclContext has no visible decls in storage"); 7618 if (!Name) 7619 return false; 7620 7621 auto It = Lookups.find(DC); 7622 if (It == Lookups.end()) 7623 return false; 7624 7625 Deserializing LookupResults(this); 7626 7627 // Load the list of declarations. 7628 SmallVector<NamedDecl *, 64> Decls; 7629 llvm::SmallPtrSet<NamedDecl *, 8> Found; 7630 for (DeclID ID : It->second.Table.find(Name)) { 7631 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7632 if (ND->getDeclName() == Name && Found.insert(ND).second) 7633 Decls.push_back(ND); 7634 } 7635 7636 ++NumVisibleDeclContextsRead; 7637 SetExternalVisibleDeclsForName(DC, Name, Decls); 7638 return !Decls.empty(); 7639 } 7640 7641 void ASTReader::completeVisibleDeclsMap(const DeclContext *DC) { 7642 if (!DC->hasExternalVisibleStorage()) 7643 return; 7644 7645 auto It = Lookups.find(DC); 7646 assert(It != Lookups.end() && 7647 "have external visible storage but no lookup tables"); 7648 7649 DeclsMap Decls; 7650 7651 for (DeclID ID : It->second.Table.findAll()) { 7652 NamedDecl *ND = cast<NamedDecl>(GetDecl(ID)); 7653 Decls[ND->getDeclName()].push_back(ND); 7654 } 7655 7656 ++NumVisibleDeclContextsRead; 7657 7658 for (DeclsMap::iterator I = Decls.begin(), E = Decls.end(); I != E; ++I) { 7659 SetExternalVisibleDeclsForName(DC, I->first, I->second); 7660 } 7661 const_cast<DeclContext *>(DC)->setHasExternalVisibleStorage(false); 7662 } 7663 7664 const serialization::reader::DeclContextLookupTable * 7665 ASTReader::getLoadedLookupTables(DeclContext *Primary) const { 7666 auto I = Lookups.find(Primary); 7667 return I == Lookups.end() ? nullptr : &I->second; 7668 } 7669 7670 /// Under non-PCH compilation the consumer receives the objc methods 7671 /// before receiving the implementation, and codegen depends on this. 7672 /// We simulate this by deserializing and passing to consumer the methods of the 7673 /// implementation before passing the deserialized implementation decl. 7674 static void PassObjCImplDeclToConsumer(ObjCImplDecl *ImplD, 7675 ASTConsumer *Consumer) { 7676 assert(ImplD && Consumer); 7677 7678 for (auto *I : ImplD->methods()) 7679 Consumer->HandleInterestingDecl(DeclGroupRef(I)); 7680 7681 Consumer->HandleInterestingDecl(DeclGroupRef(ImplD)); 7682 } 7683 7684 void ASTReader::PassInterestingDeclToConsumer(Decl *D) { 7685 if (ObjCImplDecl *ImplD = dyn_cast<ObjCImplDecl>(D)) 7686 PassObjCImplDeclToConsumer(ImplD, Consumer); 7687 else 7688 Consumer->HandleInterestingDecl(DeclGroupRef(D)); 7689 } 7690 7691 void ASTReader::StartTranslationUnit(ASTConsumer *Consumer) { 7692 this->Consumer = Consumer; 7693 7694 if (Consumer) 7695 PassInterestingDeclsToConsumer(); 7696 7697 if (DeserializationListener) 7698 DeserializationListener->ReaderInitialized(this); 7699 } 7700 7701 void ASTReader::PrintStats() { 7702 std::fprintf(stderr, "*** AST File Statistics:\n"); 7703 7704 unsigned NumTypesLoaded = 7705 TypesLoaded.size() - llvm::count(TypesLoaded, QualType()); 7706 unsigned NumDeclsLoaded = 7707 DeclsLoaded.size() - llvm::count(DeclsLoaded, (Decl *)nullptr); 7708 unsigned NumIdentifiersLoaded = 7709 IdentifiersLoaded.size() - 7710 llvm::count(IdentifiersLoaded, (IdentifierInfo *)nullptr); 7711 unsigned NumMacrosLoaded = 7712 MacrosLoaded.size() - llvm::count(MacrosLoaded, (MacroInfo *)nullptr); 7713 unsigned NumSelectorsLoaded = 7714 SelectorsLoaded.size() - llvm::count(SelectorsLoaded, Selector()); 7715 7716 if (unsigned TotalNumSLocEntries = getTotalNumSLocs()) 7717 std::fprintf(stderr, " %u/%u source location entries read (%f%%)\n", 7718 NumSLocEntriesRead, TotalNumSLocEntries, 7719 ((float)NumSLocEntriesRead/TotalNumSLocEntries * 100)); 7720 if (!TypesLoaded.empty()) 7721 std::fprintf(stderr, " %u/%u types read (%f%%)\n", 7722 NumTypesLoaded, (unsigned)TypesLoaded.size(), 7723 ((float)NumTypesLoaded/TypesLoaded.size() * 100)); 7724 if (!DeclsLoaded.empty()) 7725 std::fprintf(stderr, " %u/%u declarations read (%f%%)\n", 7726 NumDeclsLoaded, (unsigned)DeclsLoaded.size(), 7727 ((float)NumDeclsLoaded/DeclsLoaded.size() * 100)); 7728 if (!IdentifiersLoaded.empty()) 7729 std::fprintf(stderr, " %u/%u identifiers read (%f%%)\n", 7730 NumIdentifiersLoaded, (unsigned)IdentifiersLoaded.size(), 7731 ((float)NumIdentifiersLoaded/IdentifiersLoaded.size() * 100)); 7732 if (!MacrosLoaded.empty()) 7733 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7734 NumMacrosLoaded, (unsigned)MacrosLoaded.size(), 7735 ((float)NumMacrosLoaded/MacrosLoaded.size() * 100)); 7736 if (!SelectorsLoaded.empty()) 7737 std::fprintf(stderr, " %u/%u selectors read (%f%%)\n", 7738 NumSelectorsLoaded, (unsigned)SelectorsLoaded.size(), 7739 ((float)NumSelectorsLoaded/SelectorsLoaded.size() * 100)); 7740 if (TotalNumStatements) 7741 std::fprintf(stderr, " %u/%u statements read (%f%%)\n", 7742 NumStatementsRead, TotalNumStatements, 7743 ((float)NumStatementsRead/TotalNumStatements * 100)); 7744 if (TotalNumMacros) 7745 std::fprintf(stderr, " %u/%u macros read (%f%%)\n", 7746 NumMacrosRead, TotalNumMacros, 7747 ((float)NumMacrosRead/TotalNumMacros * 100)); 7748 if (TotalLexicalDeclContexts) 7749 std::fprintf(stderr, " %u/%u lexical declcontexts read (%f%%)\n", 7750 NumLexicalDeclContextsRead, TotalLexicalDeclContexts, 7751 ((float)NumLexicalDeclContextsRead/TotalLexicalDeclContexts 7752 * 100)); 7753 if (TotalVisibleDeclContexts) 7754 std::fprintf(stderr, " %u/%u visible declcontexts read (%f%%)\n", 7755 NumVisibleDeclContextsRead, TotalVisibleDeclContexts, 7756 ((float)NumVisibleDeclContextsRead/TotalVisibleDeclContexts 7757 * 100)); 7758 if (TotalNumMethodPoolEntries) 7759 std::fprintf(stderr, " %u/%u method pool entries read (%f%%)\n", 7760 NumMethodPoolEntriesRead, TotalNumMethodPoolEntries, 7761 ((float)NumMethodPoolEntriesRead/TotalNumMethodPoolEntries 7762 * 100)); 7763 if (NumMethodPoolLookups) 7764 std::fprintf(stderr, " %u/%u method pool lookups succeeded (%f%%)\n", 7765 NumMethodPoolHits, NumMethodPoolLookups, 7766 ((float)NumMethodPoolHits/NumMethodPoolLookups * 100.0)); 7767 if (NumMethodPoolTableLookups) 7768 std::fprintf(stderr, " %u/%u method pool table lookups succeeded (%f%%)\n", 7769 NumMethodPoolTableHits, NumMethodPoolTableLookups, 7770 ((float)NumMethodPoolTableHits/NumMethodPoolTableLookups 7771 * 100.0)); 7772 if (NumIdentifierLookupHits) 7773 std::fprintf(stderr, 7774 " %u / %u identifier table lookups succeeded (%f%%)\n", 7775 NumIdentifierLookupHits, NumIdentifierLookups, 7776 (double)NumIdentifierLookupHits*100.0/NumIdentifierLookups); 7777 7778 if (GlobalIndex) { 7779 std::fprintf(stderr, "\n"); 7780 GlobalIndex->printStats(); 7781 } 7782 7783 std::fprintf(stderr, "\n"); 7784 dump(); 7785 std::fprintf(stderr, "\n"); 7786 } 7787 7788 template<typename Key, typename ModuleFile, unsigned InitialCapacity> 7789 LLVM_DUMP_METHOD static void 7790 dumpModuleIDMap(StringRef Name, 7791 const ContinuousRangeMap<Key, ModuleFile *, 7792 InitialCapacity> &Map) { 7793 if (Map.begin() == Map.end()) 7794 return; 7795 7796 using MapType = ContinuousRangeMap<Key, ModuleFile *, InitialCapacity>; 7797 7798 llvm::errs() << Name << ":\n"; 7799 for (typename MapType::const_iterator I = Map.begin(), IEnd = Map.end(); 7800 I != IEnd; ++I) { 7801 llvm::errs() << " " << I->first << " -> " << I->second->FileName 7802 << "\n"; 7803 } 7804 } 7805 7806 LLVM_DUMP_METHOD void ASTReader::dump() { 7807 llvm::errs() << "*** PCH/ModuleFile Remappings:\n"; 7808 dumpModuleIDMap("Global bit offset map", GlobalBitOffsetsMap); 7809 dumpModuleIDMap("Global source location entry map", GlobalSLocEntryMap); 7810 dumpModuleIDMap("Global type map", GlobalTypeMap); 7811 dumpModuleIDMap("Global declaration map", GlobalDeclMap); 7812 dumpModuleIDMap("Global identifier map", GlobalIdentifierMap); 7813 dumpModuleIDMap("Global macro map", GlobalMacroMap); 7814 dumpModuleIDMap("Global submodule map", GlobalSubmoduleMap); 7815 dumpModuleIDMap("Global selector map", GlobalSelectorMap); 7816 dumpModuleIDMap("Global preprocessed entity map", 7817 GlobalPreprocessedEntityMap); 7818 7819 llvm::errs() << "\n*** PCH/Modules Loaded:"; 7820 for (ModuleFile &M : ModuleMgr) 7821 M.dump(); 7822 } 7823 7824 /// Return the amount of memory used by memory buffers, breaking down 7825 /// by heap-backed versus mmap'ed memory. 7826 void ASTReader::getMemoryBufferSizes(MemoryBufferSizes &sizes) const { 7827 for (ModuleFile &I : ModuleMgr) { 7828 if (llvm::MemoryBuffer *buf = I.Buffer) { 7829 size_t bytes = buf->getBufferSize(); 7830 switch (buf->getBufferKind()) { 7831 case llvm::MemoryBuffer::MemoryBuffer_Malloc: 7832 sizes.malloc_bytes += bytes; 7833 break; 7834 case llvm::MemoryBuffer::MemoryBuffer_MMap: 7835 sizes.mmap_bytes += bytes; 7836 break; 7837 } 7838 } 7839 } 7840 } 7841 7842 void ASTReader::InitializeSema(Sema &S) { 7843 SemaObj = &S; 7844 S.addExternalSource(this); 7845 7846 // Makes sure any declarations that were deserialized "too early" 7847 // still get added to the identifier's declaration chains. 7848 for (uint64_t ID : PreloadedDeclIDs) { 7849 NamedDecl *D = cast<NamedDecl>(GetDecl(ID)); 7850 pushExternalDeclIntoScope(D, D->getDeclName()); 7851 } 7852 PreloadedDeclIDs.clear(); 7853 7854 // FIXME: What happens if these are changed by a module import? 7855 if (!FPPragmaOptions.empty()) { 7856 assert(FPPragmaOptions.size() == 1 && "Wrong number of FP_PRAGMA_OPTIONS"); 7857 FPOptionsOverride NewOverrides = 7858 FPOptionsOverride::getFromOpaqueInt(FPPragmaOptions[0]); 7859 SemaObj->CurFPFeatures = 7860 NewOverrides.applyOverrides(SemaObj->getLangOpts()); 7861 } 7862 7863 SemaObj->OpenCLFeatures = OpenCLExtensions; 7864 7865 UpdateSema(); 7866 } 7867 7868 void ASTReader::UpdateSema() { 7869 assert(SemaObj && "no Sema to update"); 7870 7871 // Load the offsets of the declarations that Sema references. 7872 // They will be lazily deserialized when needed. 7873 if (!SemaDeclRefs.empty()) { 7874 assert(SemaDeclRefs.size() % 3 == 0); 7875 for (unsigned I = 0; I != SemaDeclRefs.size(); I += 3) { 7876 if (!SemaObj->StdNamespace) 7877 SemaObj->StdNamespace = SemaDeclRefs[I]; 7878 if (!SemaObj->StdBadAlloc) 7879 SemaObj->StdBadAlloc = SemaDeclRefs[I+1]; 7880 if (!SemaObj->StdAlignValT) 7881 SemaObj->StdAlignValT = SemaDeclRefs[I+2]; 7882 } 7883 SemaDeclRefs.clear(); 7884 } 7885 7886 // Update the state of pragmas. Use the same API as if we had encountered the 7887 // pragma in the source. 7888 if(OptimizeOffPragmaLocation.isValid()) 7889 SemaObj->ActOnPragmaOptimize(/* On = */ false, OptimizeOffPragmaLocation); 7890 if (PragmaMSStructState != -1) 7891 SemaObj->ActOnPragmaMSStruct((PragmaMSStructKind)PragmaMSStructState); 7892 if (PointersToMembersPragmaLocation.isValid()) { 7893 SemaObj->ActOnPragmaMSPointersToMembers( 7894 (LangOptions::PragmaMSPointersToMembersKind) 7895 PragmaMSPointersToMembersState, 7896 PointersToMembersPragmaLocation); 7897 } 7898 SemaObj->ForceCUDAHostDeviceDepth = ForceCUDAHostDeviceDepth; 7899 7900 if (PragmaAlignPackCurrentValue) { 7901 // The bottom of the stack might have a default value. It must be adjusted 7902 // to the current value to ensure that the packing state is preserved after 7903 // popping entries that were included/imported from a PCH/module. 7904 bool DropFirst = false; 7905 if (!PragmaAlignPackStack.empty() && 7906 PragmaAlignPackStack.front().Location.isInvalid()) { 7907 assert(PragmaAlignPackStack.front().Value == 7908 SemaObj->AlignPackStack.DefaultValue && 7909 "Expected a default alignment value"); 7910 SemaObj->AlignPackStack.Stack.emplace_back( 7911 PragmaAlignPackStack.front().SlotLabel, 7912 SemaObj->AlignPackStack.CurrentValue, 7913 SemaObj->AlignPackStack.CurrentPragmaLocation, 7914 PragmaAlignPackStack.front().PushLocation); 7915 DropFirst = true; 7916 } 7917 for (const auto &Entry : llvm::makeArrayRef(PragmaAlignPackStack) 7918 .drop_front(DropFirst ? 1 : 0)) { 7919 SemaObj->AlignPackStack.Stack.emplace_back( 7920 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7921 } 7922 if (PragmaAlignPackCurrentLocation.isInvalid()) { 7923 assert(*PragmaAlignPackCurrentValue == 7924 SemaObj->AlignPackStack.DefaultValue && 7925 "Expected a default align and pack value"); 7926 // Keep the current values. 7927 } else { 7928 SemaObj->AlignPackStack.CurrentValue = *PragmaAlignPackCurrentValue; 7929 SemaObj->AlignPackStack.CurrentPragmaLocation = 7930 PragmaAlignPackCurrentLocation; 7931 } 7932 } 7933 if (FpPragmaCurrentValue) { 7934 // The bottom of the stack might have a default value. It must be adjusted 7935 // to the current value to ensure that fp-pragma state is preserved after 7936 // popping entries that were included/imported from a PCH/module. 7937 bool DropFirst = false; 7938 if (!FpPragmaStack.empty() && FpPragmaStack.front().Location.isInvalid()) { 7939 assert(FpPragmaStack.front().Value == 7940 SemaObj->FpPragmaStack.DefaultValue && 7941 "Expected a default pragma float_control value"); 7942 SemaObj->FpPragmaStack.Stack.emplace_back( 7943 FpPragmaStack.front().SlotLabel, SemaObj->FpPragmaStack.CurrentValue, 7944 SemaObj->FpPragmaStack.CurrentPragmaLocation, 7945 FpPragmaStack.front().PushLocation); 7946 DropFirst = true; 7947 } 7948 for (const auto &Entry : 7949 llvm::makeArrayRef(FpPragmaStack).drop_front(DropFirst ? 1 : 0)) 7950 SemaObj->FpPragmaStack.Stack.emplace_back( 7951 Entry.SlotLabel, Entry.Value, Entry.Location, Entry.PushLocation); 7952 if (FpPragmaCurrentLocation.isInvalid()) { 7953 assert(*FpPragmaCurrentValue == SemaObj->FpPragmaStack.DefaultValue && 7954 "Expected a default pragma float_control value"); 7955 // Keep the current values. 7956 } else { 7957 SemaObj->FpPragmaStack.CurrentValue = *FpPragmaCurrentValue; 7958 SemaObj->FpPragmaStack.CurrentPragmaLocation = FpPragmaCurrentLocation; 7959 } 7960 } 7961 7962 // For non-modular AST files, restore visiblity of modules. 7963 for (auto &Import : ImportedModules) { 7964 if (Import.ImportLoc.isInvalid()) 7965 continue; 7966 if (Module *Imported = getSubmodule(Import.ID)) { 7967 SemaObj->makeModuleVisible(Imported, Import.ImportLoc); 7968 } 7969 } 7970 } 7971 7972 IdentifierInfo *ASTReader::get(StringRef Name) { 7973 // Note that we are loading an identifier. 7974 Deserializing AnIdentifier(this); 7975 7976 IdentifierLookupVisitor Visitor(Name, /*PriorGeneration=*/0, 7977 NumIdentifierLookups, 7978 NumIdentifierLookupHits); 7979 7980 // We don't need to do identifier table lookups in C++ modules (we preload 7981 // all interesting declarations, and don't need to use the scope for name 7982 // lookups). Perform the lookup in PCH files, though, since we don't build 7983 // a complete initial identifier table if we're carrying on from a PCH. 7984 if (PP.getLangOpts().CPlusPlus) { 7985 for (auto F : ModuleMgr.pch_modules()) 7986 if (Visitor(*F)) 7987 break; 7988 } else { 7989 // If there is a global index, look there first to determine which modules 7990 // provably do not have any results for this identifier. 7991 GlobalModuleIndex::HitSet Hits; 7992 GlobalModuleIndex::HitSet *HitsPtr = nullptr; 7993 if (!loadGlobalIndex()) { 7994 if (GlobalIndex->lookupIdentifier(Name, Hits)) { 7995 HitsPtr = &Hits; 7996 } 7997 } 7998 7999 ModuleMgr.visit(Visitor, HitsPtr); 8000 } 8001 8002 IdentifierInfo *II = Visitor.getIdentifierInfo(); 8003 markIdentifierUpToDate(II); 8004 return II; 8005 } 8006 8007 namespace clang { 8008 8009 /// An identifier-lookup iterator that enumerates all of the 8010 /// identifiers stored within a set of AST files. 8011 class ASTIdentifierIterator : public IdentifierIterator { 8012 /// The AST reader whose identifiers are being enumerated. 8013 const ASTReader &Reader; 8014 8015 /// The current index into the chain of AST files stored in 8016 /// the AST reader. 8017 unsigned Index; 8018 8019 /// The current position within the identifier lookup table 8020 /// of the current AST file. 8021 ASTIdentifierLookupTable::key_iterator Current; 8022 8023 /// The end position within the identifier lookup table of 8024 /// the current AST file. 8025 ASTIdentifierLookupTable::key_iterator End; 8026 8027 /// Whether to skip any modules in the ASTReader. 8028 bool SkipModules; 8029 8030 public: 8031 explicit ASTIdentifierIterator(const ASTReader &Reader, 8032 bool SkipModules = false); 8033 8034 StringRef Next() override; 8035 }; 8036 8037 } // namespace clang 8038 8039 ASTIdentifierIterator::ASTIdentifierIterator(const ASTReader &Reader, 8040 bool SkipModules) 8041 : Reader(Reader), Index(Reader.ModuleMgr.size()), SkipModules(SkipModules) { 8042 } 8043 8044 StringRef ASTIdentifierIterator::Next() { 8045 while (Current == End) { 8046 // If we have exhausted all of our AST files, we're done. 8047 if (Index == 0) 8048 return StringRef(); 8049 8050 --Index; 8051 ModuleFile &F = Reader.ModuleMgr[Index]; 8052 if (SkipModules && F.isModule()) 8053 continue; 8054 8055 ASTIdentifierLookupTable *IdTable = 8056 (ASTIdentifierLookupTable *)F.IdentifierLookupTable; 8057 Current = IdTable->key_begin(); 8058 End = IdTable->key_end(); 8059 } 8060 8061 // We have any identifiers remaining in the current AST file; return 8062 // the next one. 8063 StringRef Result = *Current; 8064 ++Current; 8065 return Result; 8066 } 8067 8068 namespace { 8069 8070 /// A utility for appending two IdentifierIterators. 8071 class ChainedIdentifierIterator : public IdentifierIterator { 8072 std::unique_ptr<IdentifierIterator> Current; 8073 std::unique_ptr<IdentifierIterator> Queued; 8074 8075 public: 8076 ChainedIdentifierIterator(std::unique_ptr<IdentifierIterator> First, 8077 std::unique_ptr<IdentifierIterator> Second) 8078 : Current(std::move(First)), Queued(std::move(Second)) {} 8079 8080 StringRef Next() override { 8081 if (!Current) 8082 return StringRef(); 8083 8084 StringRef result = Current->Next(); 8085 if (!result.empty()) 8086 return result; 8087 8088 // Try the queued iterator, which may itself be empty. 8089 Current.reset(); 8090 std::swap(Current, Queued); 8091 return Next(); 8092 } 8093 }; 8094 8095 } // namespace 8096 8097 IdentifierIterator *ASTReader::getIdentifiers() { 8098 if (!loadGlobalIndex()) { 8099 std::unique_ptr<IdentifierIterator> ReaderIter( 8100 new ASTIdentifierIterator(*this, /*SkipModules=*/true)); 8101 std::unique_ptr<IdentifierIterator> ModulesIter( 8102 GlobalIndex->createIdentifierIterator()); 8103 return new ChainedIdentifierIterator(std::move(ReaderIter), 8104 std::move(ModulesIter)); 8105 } 8106 8107 return new ASTIdentifierIterator(*this); 8108 } 8109 8110 namespace clang { 8111 namespace serialization { 8112 8113 class ReadMethodPoolVisitor { 8114 ASTReader &Reader; 8115 Selector Sel; 8116 unsigned PriorGeneration; 8117 unsigned InstanceBits = 0; 8118 unsigned FactoryBits = 0; 8119 bool InstanceHasMoreThanOneDecl = false; 8120 bool FactoryHasMoreThanOneDecl = false; 8121 SmallVector<ObjCMethodDecl *, 4> InstanceMethods; 8122 SmallVector<ObjCMethodDecl *, 4> FactoryMethods; 8123 8124 public: 8125 ReadMethodPoolVisitor(ASTReader &Reader, Selector Sel, 8126 unsigned PriorGeneration) 8127 : Reader(Reader), Sel(Sel), PriorGeneration(PriorGeneration) {} 8128 8129 bool operator()(ModuleFile &M) { 8130 if (!M.SelectorLookupTable) 8131 return false; 8132 8133 // If we've already searched this module file, skip it now. 8134 if (M.Generation <= PriorGeneration) 8135 return true; 8136 8137 ++Reader.NumMethodPoolTableLookups; 8138 ASTSelectorLookupTable *PoolTable 8139 = (ASTSelectorLookupTable*)M.SelectorLookupTable; 8140 ASTSelectorLookupTable::iterator Pos = PoolTable->find(Sel); 8141 if (Pos == PoolTable->end()) 8142 return false; 8143 8144 ++Reader.NumMethodPoolTableHits; 8145 ++Reader.NumSelectorsRead; 8146 // FIXME: Not quite happy with the statistics here. We probably should 8147 // disable this tracking when called via LoadSelector. 8148 // Also, should entries without methods count as misses? 8149 ++Reader.NumMethodPoolEntriesRead; 8150 ASTSelectorLookupTrait::data_type Data = *Pos; 8151 if (Reader.DeserializationListener) 8152 Reader.DeserializationListener->SelectorRead(Data.ID, Sel); 8153 8154 InstanceMethods.append(Data.Instance.begin(), Data.Instance.end()); 8155 FactoryMethods.append(Data.Factory.begin(), Data.Factory.end()); 8156 InstanceBits = Data.InstanceBits; 8157 FactoryBits = Data.FactoryBits; 8158 InstanceHasMoreThanOneDecl = Data.InstanceHasMoreThanOneDecl; 8159 FactoryHasMoreThanOneDecl = Data.FactoryHasMoreThanOneDecl; 8160 return true; 8161 } 8162 8163 /// Retrieve the instance methods found by this visitor. 8164 ArrayRef<ObjCMethodDecl *> getInstanceMethods() const { 8165 return InstanceMethods; 8166 } 8167 8168 /// Retrieve the instance methods found by this visitor. 8169 ArrayRef<ObjCMethodDecl *> getFactoryMethods() const { 8170 return FactoryMethods; 8171 } 8172 8173 unsigned getInstanceBits() const { return InstanceBits; } 8174 unsigned getFactoryBits() const { return FactoryBits; } 8175 8176 bool instanceHasMoreThanOneDecl() const { 8177 return InstanceHasMoreThanOneDecl; 8178 } 8179 8180 bool factoryHasMoreThanOneDecl() const { return FactoryHasMoreThanOneDecl; } 8181 }; 8182 8183 } // namespace serialization 8184 } // namespace clang 8185 8186 /// Add the given set of methods to the method list. 8187 static void addMethodsToPool(Sema &S, ArrayRef<ObjCMethodDecl *> Methods, 8188 ObjCMethodList &List) { 8189 for (unsigned I = 0, N = Methods.size(); I != N; ++I) { 8190 S.addMethodToGlobalList(&List, Methods[I]); 8191 } 8192 } 8193 8194 void ASTReader::ReadMethodPool(Selector Sel) { 8195 // Get the selector generation and update it to the current generation. 8196 unsigned &Generation = SelectorGeneration[Sel]; 8197 unsigned PriorGeneration = Generation; 8198 Generation = getGeneration(); 8199 SelectorOutOfDate[Sel] = false; 8200 8201 // Search for methods defined with this selector. 8202 ++NumMethodPoolLookups; 8203 ReadMethodPoolVisitor Visitor(*this, Sel, PriorGeneration); 8204 ModuleMgr.visit(Visitor); 8205 8206 if (Visitor.getInstanceMethods().empty() && 8207 Visitor.getFactoryMethods().empty()) 8208 return; 8209 8210 ++NumMethodPoolHits; 8211 8212 if (!getSema()) 8213 return; 8214 8215 Sema &S = *getSema(); 8216 Sema::GlobalMethodPool::iterator Pos = 8217 S.MethodPool.insert(std::make_pair(Sel, Sema::GlobalMethodPool::Lists())) 8218 .first; 8219 8220 Pos->second.first.setBits(Visitor.getInstanceBits()); 8221 Pos->second.first.setHasMoreThanOneDecl(Visitor.instanceHasMoreThanOneDecl()); 8222 Pos->second.second.setBits(Visitor.getFactoryBits()); 8223 Pos->second.second.setHasMoreThanOneDecl(Visitor.factoryHasMoreThanOneDecl()); 8224 8225 // Add methods to the global pool *after* setting hasMoreThanOneDecl, since 8226 // when building a module we keep every method individually and may need to 8227 // update hasMoreThanOneDecl as we add the methods. 8228 addMethodsToPool(S, Visitor.getInstanceMethods(), Pos->second.first); 8229 addMethodsToPool(S, Visitor.getFactoryMethods(), Pos->second.second); 8230 } 8231 8232 void ASTReader::updateOutOfDateSelector(Selector Sel) { 8233 if (SelectorOutOfDate[Sel]) 8234 ReadMethodPool(Sel); 8235 } 8236 8237 void ASTReader::ReadKnownNamespaces( 8238 SmallVectorImpl<NamespaceDecl *> &Namespaces) { 8239 Namespaces.clear(); 8240 8241 for (unsigned I = 0, N = KnownNamespaces.size(); I != N; ++I) { 8242 if (NamespaceDecl *Namespace 8243 = dyn_cast_or_null<NamespaceDecl>(GetDecl(KnownNamespaces[I]))) 8244 Namespaces.push_back(Namespace); 8245 } 8246 } 8247 8248 void ASTReader::ReadUndefinedButUsed( 8249 llvm::MapVector<NamedDecl *, SourceLocation> &Undefined) { 8250 for (unsigned Idx = 0, N = UndefinedButUsed.size(); Idx != N;) { 8251 NamedDecl *D = cast<NamedDecl>(GetDecl(UndefinedButUsed[Idx++])); 8252 SourceLocation Loc = 8253 SourceLocation::getFromRawEncoding(UndefinedButUsed[Idx++]); 8254 Undefined.insert(std::make_pair(D, Loc)); 8255 } 8256 } 8257 8258 void ASTReader::ReadMismatchingDeleteExpressions(llvm::MapVector< 8259 FieldDecl *, llvm::SmallVector<std::pair<SourceLocation, bool>, 4>> & 8260 Exprs) { 8261 for (unsigned Idx = 0, N = DelayedDeleteExprs.size(); Idx != N;) { 8262 FieldDecl *FD = cast<FieldDecl>(GetDecl(DelayedDeleteExprs[Idx++])); 8263 uint64_t Count = DelayedDeleteExprs[Idx++]; 8264 for (uint64_t C = 0; C < Count; ++C) { 8265 SourceLocation DeleteLoc = 8266 SourceLocation::getFromRawEncoding(DelayedDeleteExprs[Idx++]); 8267 const bool IsArrayForm = DelayedDeleteExprs[Idx++]; 8268 Exprs[FD].push_back(std::make_pair(DeleteLoc, IsArrayForm)); 8269 } 8270 } 8271 } 8272 8273 void ASTReader::ReadTentativeDefinitions( 8274 SmallVectorImpl<VarDecl *> &TentativeDefs) { 8275 for (unsigned I = 0, N = TentativeDefinitions.size(); I != N; ++I) { 8276 VarDecl *Var = dyn_cast_or_null<VarDecl>(GetDecl(TentativeDefinitions[I])); 8277 if (Var) 8278 TentativeDefs.push_back(Var); 8279 } 8280 TentativeDefinitions.clear(); 8281 } 8282 8283 void ASTReader::ReadUnusedFileScopedDecls( 8284 SmallVectorImpl<const DeclaratorDecl *> &Decls) { 8285 for (unsigned I = 0, N = UnusedFileScopedDecls.size(); I != N; ++I) { 8286 DeclaratorDecl *D 8287 = dyn_cast_or_null<DeclaratorDecl>(GetDecl(UnusedFileScopedDecls[I])); 8288 if (D) 8289 Decls.push_back(D); 8290 } 8291 UnusedFileScopedDecls.clear(); 8292 } 8293 8294 void ASTReader::ReadDelegatingConstructors( 8295 SmallVectorImpl<CXXConstructorDecl *> &Decls) { 8296 for (unsigned I = 0, N = DelegatingCtorDecls.size(); I != N; ++I) { 8297 CXXConstructorDecl *D 8298 = dyn_cast_or_null<CXXConstructorDecl>(GetDecl(DelegatingCtorDecls[I])); 8299 if (D) 8300 Decls.push_back(D); 8301 } 8302 DelegatingCtorDecls.clear(); 8303 } 8304 8305 void ASTReader::ReadExtVectorDecls(SmallVectorImpl<TypedefNameDecl *> &Decls) { 8306 for (unsigned I = 0, N = ExtVectorDecls.size(); I != N; ++I) { 8307 TypedefNameDecl *D 8308 = dyn_cast_or_null<TypedefNameDecl>(GetDecl(ExtVectorDecls[I])); 8309 if (D) 8310 Decls.push_back(D); 8311 } 8312 ExtVectorDecls.clear(); 8313 } 8314 8315 void ASTReader::ReadUnusedLocalTypedefNameCandidates( 8316 llvm::SmallSetVector<const TypedefNameDecl *, 4> &Decls) { 8317 for (unsigned I = 0, N = UnusedLocalTypedefNameCandidates.size(); I != N; 8318 ++I) { 8319 TypedefNameDecl *D = dyn_cast_or_null<TypedefNameDecl>( 8320 GetDecl(UnusedLocalTypedefNameCandidates[I])); 8321 if (D) 8322 Decls.insert(D); 8323 } 8324 UnusedLocalTypedefNameCandidates.clear(); 8325 } 8326 8327 void ASTReader::ReadDeclsToCheckForDeferredDiags( 8328 llvm::SmallSetVector<Decl *, 4> &Decls) { 8329 for (auto I : DeclsToCheckForDeferredDiags) { 8330 auto *D = dyn_cast_or_null<Decl>(GetDecl(I)); 8331 if (D) 8332 Decls.insert(D); 8333 } 8334 DeclsToCheckForDeferredDiags.clear(); 8335 } 8336 8337 void ASTReader::ReadReferencedSelectors( 8338 SmallVectorImpl<std::pair<Selector, SourceLocation>> &Sels) { 8339 if (ReferencedSelectorsData.empty()) 8340 return; 8341 8342 // If there are @selector references added them to its pool. This is for 8343 // implementation of -Wselector. 8344 unsigned int DataSize = ReferencedSelectorsData.size()-1; 8345 unsigned I = 0; 8346 while (I < DataSize) { 8347 Selector Sel = DecodeSelector(ReferencedSelectorsData[I++]); 8348 SourceLocation SelLoc 8349 = SourceLocation::getFromRawEncoding(ReferencedSelectorsData[I++]); 8350 Sels.push_back(std::make_pair(Sel, SelLoc)); 8351 } 8352 ReferencedSelectorsData.clear(); 8353 } 8354 8355 void ASTReader::ReadWeakUndeclaredIdentifiers( 8356 SmallVectorImpl<std::pair<IdentifierInfo *, WeakInfo>> &WeakIDs) { 8357 if (WeakUndeclaredIdentifiers.empty()) 8358 return; 8359 8360 for (unsigned I = 0, N = WeakUndeclaredIdentifiers.size(); I < N; /*none*/) { 8361 IdentifierInfo *WeakId 8362 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8363 IdentifierInfo *AliasId 8364 = DecodeIdentifierInfo(WeakUndeclaredIdentifiers[I++]); 8365 SourceLocation Loc 8366 = SourceLocation::getFromRawEncoding(WeakUndeclaredIdentifiers[I++]); 8367 bool Used = WeakUndeclaredIdentifiers[I++]; 8368 WeakInfo WI(AliasId, Loc); 8369 WI.setUsed(Used); 8370 WeakIDs.push_back(std::make_pair(WeakId, WI)); 8371 } 8372 WeakUndeclaredIdentifiers.clear(); 8373 } 8374 8375 void ASTReader::ReadUsedVTables(SmallVectorImpl<ExternalVTableUse> &VTables) { 8376 for (unsigned Idx = 0, N = VTableUses.size(); Idx < N; /* In loop */) { 8377 ExternalVTableUse VT; 8378 VT.Record = dyn_cast_or_null<CXXRecordDecl>(GetDecl(VTableUses[Idx++])); 8379 VT.Location = SourceLocation::getFromRawEncoding(VTableUses[Idx++]); 8380 VT.DefinitionRequired = VTableUses[Idx++]; 8381 VTables.push_back(VT); 8382 } 8383 8384 VTableUses.clear(); 8385 } 8386 8387 void ASTReader::ReadPendingInstantiations( 8388 SmallVectorImpl<std::pair<ValueDecl *, SourceLocation>> &Pending) { 8389 for (unsigned Idx = 0, N = PendingInstantiations.size(); Idx < N;) { 8390 ValueDecl *D = cast<ValueDecl>(GetDecl(PendingInstantiations[Idx++])); 8391 SourceLocation Loc 8392 = SourceLocation::getFromRawEncoding(PendingInstantiations[Idx++]); 8393 8394 Pending.push_back(std::make_pair(D, Loc)); 8395 } 8396 PendingInstantiations.clear(); 8397 } 8398 8399 void ASTReader::ReadLateParsedTemplates( 8400 llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>> 8401 &LPTMap) { 8402 for (auto &LPT : LateParsedTemplates) { 8403 ModuleFile *FMod = LPT.first; 8404 RecordDataImpl &LateParsed = LPT.second; 8405 for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; 8406 /* In loop */) { 8407 FunctionDecl *FD = 8408 cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++])); 8409 8410 auto LT = std::make_unique<LateParsedTemplate>(); 8411 LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]); 8412 8413 ModuleFile *F = getOwningModuleFile(LT->D); 8414 assert(F && "No module"); 8415 8416 unsigned TokN = LateParsed[Idx++]; 8417 LT->Toks.reserve(TokN); 8418 for (unsigned T = 0; T < TokN; ++T) 8419 LT->Toks.push_back(ReadToken(*F, LateParsed, Idx)); 8420 8421 LPTMap.insert(std::make_pair(FD, std::move(LT))); 8422 } 8423 } 8424 8425 LateParsedTemplates.clear(); 8426 } 8427 8428 void ASTReader::LoadSelector(Selector Sel) { 8429 // It would be complicated to avoid reading the methods anyway. So don't. 8430 ReadMethodPool(Sel); 8431 } 8432 8433 void ASTReader::SetIdentifierInfo(IdentifierID ID, IdentifierInfo *II) { 8434 assert(ID && "Non-zero identifier ID required"); 8435 assert(ID <= IdentifiersLoaded.size() && "identifier ID out of range"); 8436 IdentifiersLoaded[ID - 1] = II; 8437 if (DeserializationListener) 8438 DeserializationListener->IdentifierRead(ID, II); 8439 } 8440 8441 /// Set the globally-visible declarations associated with the given 8442 /// identifier. 8443 /// 8444 /// If the AST reader is currently in a state where the given declaration IDs 8445 /// cannot safely be resolved, they are queued until it is safe to resolve 8446 /// them. 8447 /// 8448 /// \param II an IdentifierInfo that refers to one or more globally-visible 8449 /// declarations. 8450 /// 8451 /// \param DeclIDs the set of declaration IDs with the name @p II that are 8452 /// visible at global scope. 8453 /// 8454 /// \param Decls if non-null, this vector will be populated with the set of 8455 /// deserialized declarations. These declarations will not be pushed into 8456 /// scope. 8457 void 8458 ASTReader::SetGloballyVisibleDecls(IdentifierInfo *II, 8459 const SmallVectorImpl<uint32_t> &DeclIDs, 8460 SmallVectorImpl<Decl *> *Decls) { 8461 if (NumCurrentElementsDeserializing && !Decls) { 8462 PendingIdentifierInfos[II].append(DeclIDs.begin(), DeclIDs.end()); 8463 return; 8464 } 8465 8466 for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) { 8467 if (!SemaObj) { 8468 // Queue this declaration so that it will be added to the 8469 // translation unit scope and identifier's declaration chain 8470 // once a Sema object is known. 8471 PreloadedDeclIDs.push_back(DeclIDs[I]); 8472 continue; 8473 } 8474 8475 NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I])); 8476 8477 // If we're simply supposed to record the declarations, do so now. 8478 if (Decls) { 8479 Decls->push_back(D); 8480 continue; 8481 } 8482 8483 // Introduce this declaration into the translation-unit scope 8484 // and add it to the declaration chain for this identifier, so 8485 // that (unqualified) name lookup will find it. 8486 pushExternalDeclIntoScope(D, II); 8487 } 8488 } 8489 8490 IdentifierInfo *ASTReader::DecodeIdentifierInfo(IdentifierID ID) { 8491 if (ID == 0) 8492 return nullptr; 8493 8494 if (IdentifiersLoaded.empty()) { 8495 Error("no identifier table in AST file"); 8496 return nullptr; 8497 } 8498 8499 ID -= 1; 8500 if (!IdentifiersLoaded[ID]) { 8501 GlobalIdentifierMapType::iterator I = GlobalIdentifierMap.find(ID + 1); 8502 assert(I != GlobalIdentifierMap.end() && "Corrupted global identifier map"); 8503 ModuleFile *M = I->second; 8504 unsigned Index = ID - M->BaseIdentifierID; 8505 const unsigned char *Data = 8506 M->IdentifierTableData + M->IdentifierOffsets[Index]; 8507 8508 ASTIdentifierLookupTrait Trait(*this, *M); 8509 auto KeyDataLen = Trait.ReadKeyDataLength(Data); 8510 auto Key = Trait.ReadKey(Data, KeyDataLen.first); 8511 auto &II = PP.getIdentifierTable().get(Key); 8512 IdentifiersLoaded[ID] = &II; 8513 markIdentifierFromAST(*this, II); 8514 if (DeserializationListener) 8515 DeserializationListener->IdentifierRead(ID + 1, &II); 8516 } 8517 8518 return IdentifiersLoaded[ID]; 8519 } 8520 8521 IdentifierInfo *ASTReader::getLocalIdentifier(ModuleFile &M, unsigned LocalID) { 8522 return DecodeIdentifierInfo(getGlobalIdentifierID(M, LocalID)); 8523 } 8524 8525 IdentifierID ASTReader::getGlobalIdentifierID(ModuleFile &M, unsigned LocalID) { 8526 if (LocalID < NUM_PREDEF_IDENT_IDS) 8527 return LocalID; 8528 8529 if (!M.ModuleOffsetMap.empty()) 8530 ReadModuleOffsetMap(M); 8531 8532 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8533 = M.IdentifierRemap.find(LocalID - NUM_PREDEF_IDENT_IDS); 8534 assert(I != M.IdentifierRemap.end() 8535 && "Invalid index into identifier index remap"); 8536 8537 return LocalID + I->second; 8538 } 8539 8540 MacroInfo *ASTReader::getMacro(MacroID ID) { 8541 if (ID == 0) 8542 return nullptr; 8543 8544 if (MacrosLoaded.empty()) { 8545 Error("no macro table in AST file"); 8546 return nullptr; 8547 } 8548 8549 ID -= NUM_PREDEF_MACRO_IDS; 8550 if (!MacrosLoaded[ID]) { 8551 GlobalMacroMapType::iterator I 8552 = GlobalMacroMap.find(ID + NUM_PREDEF_MACRO_IDS); 8553 assert(I != GlobalMacroMap.end() && "Corrupted global macro map"); 8554 ModuleFile *M = I->second; 8555 unsigned Index = ID - M->BaseMacroID; 8556 MacrosLoaded[ID] = 8557 ReadMacroRecord(*M, M->MacroOffsetsBase + M->MacroOffsets[Index]); 8558 8559 if (DeserializationListener) 8560 DeserializationListener->MacroRead(ID + NUM_PREDEF_MACRO_IDS, 8561 MacrosLoaded[ID]); 8562 } 8563 8564 return MacrosLoaded[ID]; 8565 } 8566 8567 MacroID ASTReader::getGlobalMacroID(ModuleFile &M, unsigned LocalID) { 8568 if (LocalID < NUM_PREDEF_MACRO_IDS) 8569 return LocalID; 8570 8571 if (!M.ModuleOffsetMap.empty()) 8572 ReadModuleOffsetMap(M); 8573 8574 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8575 = M.MacroRemap.find(LocalID - NUM_PREDEF_MACRO_IDS); 8576 assert(I != M.MacroRemap.end() && "Invalid index into macro index remap"); 8577 8578 return LocalID + I->second; 8579 } 8580 8581 serialization::SubmoduleID 8582 ASTReader::getGlobalSubmoduleID(ModuleFile &M, unsigned LocalID) { 8583 if (LocalID < NUM_PREDEF_SUBMODULE_IDS) 8584 return LocalID; 8585 8586 if (!M.ModuleOffsetMap.empty()) 8587 ReadModuleOffsetMap(M); 8588 8589 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8590 = M.SubmoduleRemap.find(LocalID - NUM_PREDEF_SUBMODULE_IDS); 8591 assert(I != M.SubmoduleRemap.end() 8592 && "Invalid index into submodule index remap"); 8593 8594 return LocalID + I->second; 8595 } 8596 8597 Module *ASTReader::getSubmodule(SubmoduleID GlobalID) { 8598 if (GlobalID < NUM_PREDEF_SUBMODULE_IDS) { 8599 assert(GlobalID == 0 && "Unhandled global submodule ID"); 8600 return nullptr; 8601 } 8602 8603 if (GlobalID > SubmodulesLoaded.size()) { 8604 Error("submodule ID out of range in AST file"); 8605 return nullptr; 8606 } 8607 8608 return SubmodulesLoaded[GlobalID - NUM_PREDEF_SUBMODULE_IDS]; 8609 } 8610 8611 Module *ASTReader::getModule(unsigned ID) { 8612 return getSubmodule(ID); 8613 } 8614 8615 ModuleFile *ASTReader::getLocalModuleFile(ModuleFile &F, unsigned ID) { 8616 if (ID & 1) { 8617 // It's a module, look it up by submodule ID. 8618 auto I = GlobalSubmoduleMap.find(getGlobalSubmoduleID(F, ID >> 1)); 8619 return I == GlobalSubmoduleMap.end() ? nullptr : I->second; 8620 } else { 8621 // It's a prefix (preamble, PCH, ...). Look it up by index. 8622 unsigned IndexFromEnd = ID >> 1; 8623 assert(IndexFromEnd && "got reference to unknown module file"); 8624 return getModuleManager().pch_modules().end()[-IndexFromEnd]; 8625 } 8626 } 8627 8628 unsigned ASTReader::getModuleFileID(ModuleFile *F) { 8629 if (!F) 8630 return 1; 8631 8632 // For a file representing a module, use the submodule ID of the top-level 8633 // module as the file ID. For any other kind of file, the number of such 8634 // files loaded beforehand will be the same on reload. 8635 // FIXME: Is this true even if we have an explicit module file and a PCH? 8636 if (F->isModule()) 8637 return ((F->BaseSubmoduleID + NUM_PREDEF_SUBMODULE_IDS) << 1) | 1; 8638 8639 auto PCHModules = getModuleManager().pch_modules(); 8640 auto I = llvm::find(PCHModules, F); 8641 assert(I != PCHModules.end() && "emitting reference to unknown file"); 8642 return (I - PCHModules.end()) << 1; 8643 } 8644 8645 llvm::Optional<ASTSourceDescriptor> 8646 ASTReader::getSourceDescriptor(unsigned ID) { 8647 if (Module *M = getSubmodule(ID)) 8648 return ASTSourceDescriptor(*M); 8649 8650 // If there is only a single PCH, return it instead. 8651 // Chained PCH are not supported. 8652 const auto &PCHChain = ModuleMgr.pch_modules(); 8653 if (std::distance(std::begin(PCHChain), std::end(PCHChain))) { 8654 ModuleFile &MF = ModuleMgr.getPrimaryModule(); 8655 StringRef ModuleName = llvm::sys::path::filename(MF.OriginalSourceFileName); 8656 StringRef FileName = llvm::sys::path::filename(MF.FileName); 8657 return ASTSourceDescriptor(ModuleName, MF.OriginalDir, FileName, 8658 MF.Signature); 8659 } 8660 return None; 8661 } 8662 8663 ExternalASTSource::ExtKind ASTReader::hasExternalDefinitions(const Decl *FD) { 8664 auto I = DefinitionSource.find(FD); 8665 if (I == DefinitionSource.end()) 8666 return EK_ReplyHazy; 8667 return I->second ? EK_Never : EK_Always; 8668 } 8669 8670 Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) { 8671 return DecodeSelector(getGlobalSelectorID(M, LocalID)); 8672 } 8673 8674 Selector ASTReader::DecodeSelector(serialization::SelectorID ID) { 8675 if (ID == 0) 8676 return Selector(); 8677 8678 if (ID > SelectorsLoaded.size()) { 8679 Error("selector ID out of range in AST file"); 8680 return Selector(); 8681 } 8682 8683 if (SelectorsLoaded[ID - 1].getAsOpaquePtr() == nullptr) { 8684 // Load this selector from the selector table. 8685 GlobalSelectorMapType::iterator I = GlobalSelectorMap.find(ID); 8686 assert(I != GlobalSelectorMap.end() && "Corrupted global selector map"); 8687 ModuleFile &M = *I->second; 8688 ASTSelectorLookupTrait Trait(*this, M); 8689 unsigned Idx = ID - M.BaseSelectorID - NUM_PREDEF_SELECTOR_IDS; 8690 SelectorsLoaded[ID - 1] = 8691 Trait.ReadKey(M.SelectorLookupTableData + M.SelectorOffsets[Idx], 0); 8692 if (DeserializationListener) 8693 DeserializationListener->SelectorRead(ID, SelectorsLoaded[ID - 1]); 8694 } 8695 8696 return SelectorsLoaded[ID - 1]; 8697 } 8698 8699 Selector ASTReader::GetExternalSelector(serialization::SelectorID ID) { 8700 return DecodeSelector(ID); 8701 } 8702 8703 uint32_t ASTReader::GetNumExternalSelectors() { 8704 // ID 0 (the null selector) is considered an external selector. 8705 return getTotalNumSelectors() + 1; 8706 } 8707 8708 serialization::SelectorID 8709 ASTReader::getGlobalSelectorID(ModuleFile &M, unsigned LocalID) const { 8710 if (LocalID < NUM_PREDEF_SELECTOR_IDS) 8711 return LocalID; 8712 8713 if (!M.ModuleOffsetMap.empty()) 8714 ReadModuleOffsetMap(M); 8715 8716 ContinuousRangeMap<uint32_t, int, 2>::iterator I 8717 = M.SelectorRemap.find(LocalID - NUM_PREDEF_SELECTOR_IDS); 8718 assert(I != M.SelectorRemap.end() 8719 && "Invalid index into selector index remap"); 8720 8721 return LocalID + I->second; 8722 } 8723 8724 DeclarationNameLoc 8725 ASTRecordReader::readDeclarationNameLoc(DeclarationName Name) { 8726 switch (Name.getNameKind()) { 8727 case DeclarationName::CXXConstructorName: 8728 case DeclarationName::CXXDestructorName: 8729 case DeclarationName::CXXConversionFunctionName: 8730 return DeclarationNameLoc::makeNamedTypeLoc(readTypeSourceInfo()); 8731 8732 case DeclarationName::CXXOperatorName: 8733 return DeclarationNameLoc::makeCXXOperatorNameLoc(readSourceRange()); 8734 8735 case DeclarationName::CXXLiteralOperatorName: 8736 return DeclarationNameLoc::makeCXXLiteralOperatorNameLoc( 8737 readSourceLocation()); 8738 8739 case DeclarationName::Identifier: 8740 case DeclarationName::ObjCZeroArgSelector: 8741 case DeclarationName::ObjCOneArgSelector: 8742 case DeclarationName::ObjCMultiArgSelector: 8743 case DeclarationName::CXXUsingDirective: 8744 case DeclarationName::CXXDeductionGuideName: 8745 break; 8746 } 8747 return DeclarationNameLoc(); 8748 } 8749 8750 DeclarationNameInfo ASTRecordReader::readDeclarationNameInfo() { 8751 DeclarationNameInfo NameInfo; 8752 NameInfo.setName(readDeclarationName()); 8753 NameInfo.setLoc(readSourceLocation()); 8754 NameInfo.setInfo(readDeclarationNameLoc(NameInfo.getName())); 8755 return NameInfo; 8756 } 8757 8758 void ASTRecordReader::readQualifierInfo(QualifierInfo &Info) { 8759 Info.QualifierLoc = readNestedNameSpecifierLoc(); 8760 unsigned NumTPLists = readInt(); 8761 Info.NumTemplParamLists = NumTPLists; 8762 if (NumTPLists) { 8763 Info.TemplParamLists = 8764 new (getContext()) TemplateParameterList *[NumTPLists]; 8765 for (unsigned i = 0; i != NumTPLists; ++i) 8766 Info.TemplParamLists[i] = readTemplateParameterList(); 8767 } 8768 } 8769 8770 TemplateParameterList * 8771 ASTRecordReader::readTemplateParameterList() { 8772 SourceLocation TemplateLoc = readSourceLocation(); 8773 SourceLocation LAngleLoc = readSourceLocation(); 8774 SourceLocation RAngleLoc = readSourceLocation(); 8775 8776 unsigned NumParams = readInt(); 8777 SmallVector<NamedDecl *, 16> Params; 8778 Params.reserve(NumParams); 8779 while (NumParams--) 8780 Params.push_back(readDeclAs<NamedDecl>()); 8781 8782 bool HasRequiresClause = readBool(); 8783 Expr *RequiresClause = HasRequiresClause ? readExpr() : nullptr; 8784 8785 TemplateParameterList *TemplateParams = TemplateParameterList::Create( 8786 getContext(), TemplateLoc, LAngleLoc, Params, RAngleLoc, RequiresClause); 8787 return TemplateParams; 8788 } 8789 8790 void ASTRecordReader::readTemplateArgumentList( 8791 SmallVectorImpl<TemplateArgument> &TemplArgs, 8792 bool Canonicalize) { 8793 unsigned NumTemplateArgs = readInt(); 8794 TemplArgs.reserve(NumTemplateArgs); 8795 while (NumTemplateArgs--) 8796 TemplArgs.push_back(readTemplateArgument(Canonicalize)); 8797 } 8798 8799 /// Read a UnresolvedSet structure. 8800 void ASTRecordReader::readUnresolvedSet(LazyASTUnresolvedSet &Set) { 8801 unsigned NumDecls = readInt(); 8802 Set.reserve(getContext(), NumDecls); 8803 while (NumDecls--) { 8804 DeclID ID = readDeclID(); 8805 AccessSpecifier AS = (AccessSpecifier) readInt(); 8806 Set.addLazyDecl(getContext(), ID, AS); 8807 } 8808 } 8809 8810 CXXBaseSpecifier 8811 ASTRecordReader::readCXXBaseSpecifier() { 8812 bool isVirtual = readBool(); 8813 bool isBaseOfClass = readBool(); 8814 AccessSpecifier AS = static_cast<AccessSpecifier>(readInt()); 8815 bool inheritConstructors = readBool(); 8816 TypeSourceInfo *TInfo = readTypeSourceInfo(); 8817 SourceRange Range = readSourceRange(); 8818 SourceLocation EllipsisLoc = readSourceLocation(); 8819 CXXBaseSpecifier Result(Range, isVirtual, isBaseOfClass, AS, TInfo, 8820 EllipsisLoc); 8821 Result.setInheritConstructors(inheritConstructors); 8822 return Result; 8823 } 8824 8825 CXXCtorInitializer ** 8826 ASTRecordReader::readCXXCtorInitializers() { 8827 ASTContext &Context = getContext(); 8828 unsigned NumInitializers = readInt(); 8829 assert(NumInitializers && "wrote ctor initializers but have no inits"); 8830 auto **CtorInitializers = new (Context) CXXCtorInitializer*[NumInitializers]; 8831 for (unsigned i = 0; i != NumInitializers; ++i) { 8832 TypeSourceInfo *TInfo = nullptr; 8833 bool IsBaseVirtual = false; 8834 FieldDecl *Member = nullptr; 8835 IndirectFieldDecl *IndirectMember = nullptr; 8836 8837 CtorInitializerType Type = (CtorInitializerType) readInt(); 8838 switch (Type) { 8839 case CTOR_INITIALIZER_BASE: 8840 TInfo = readTypeSourceInfo(); 8841 IsBaseVirtual = readBool(); 8842 break; 8843 8844 case CTOR_INITIALIZER_DELEGATING: 8845 TInfo = readTypeSourceInfo(); 8846 break; 8847 8848 case CTOR_INITIALIZER_MEMBER: 8849 Member = readDeclAs<FieldDecl>(); 8850 break; 8851 8852 case CTOR_INITIALIZER_INDIRECT_MEMBER: 8853 IndirectMember = readDeclAs<IndirectFieldDecl>(); 8854 break; 8855 } 8856 8857 SourceLocation MemberOrEllipsisLoc = readSourceLocation(); 8858 Expr *Init = readExpr(); 8859 SourceLocation LParenLoc = readSourceLocation(); 8860 SourceLocation RParenLoc = readSourceLocation(); 8861 8862 CXXCtorInitializer *BOMInit; 8863 if (Type == CTOR_INITIALIZER_BASE) 8864 BOMInit = new (Context) 8865 CXXCtorInitializer(Context, TInfo, IsBaseVirtual, LParenLoc, Init, 8866 RParenLoc, MemberOrEllipsisLoc); 8867 else if (Type == CTOR_INITIALIZER_DELEGATING) 8868 BOMInit = new (Context) 8869 CXXCtorInitializer(Context, TInfo, LParenLoc, Init, RParenLoc); 8870 else if (Member) 8871 BOMInit = new (Context) 8872 CXXCtorInitializer(Context, Member, MemberOrEllipsisLoc, LParenLoc, 8873 Init, RParenLoc); 8874 else 8875 BOMInit = new (Context) 8876 CXXCtorInitializer(Context, IndirectMember, MemberOrEllipsisLoc, 8877 LParenLoc, Init, RParenLoc); 8878 8879 if (/*IsWritten*/readBool()) { 8880 unsigned SourceOrder = readInt(); 8881 BOMInit->setSourceOrder(SourceOrder); 8882 } 8883 8884 CtorInitializers[i] = BOMInit; 8885 } 8886 8887 return CtorInitializers; 8888 } 8889 8890 NestedNameSpecifierLoc 8891 ASTRecordReader::readNestedNameSpecifierLoc() { 8892 ASTContext &Context = getContext(); 8893 unsigned N = readInt(); 8894 NestedNameSpecifierLocBuilder Builder; 8895 for (unsigned I = 0; I != N; ++I) { 8896 auto Kind = readNestedNameSpecifierKind(); 8897 switch (Kind) { 8898 case NestedNameSpecifier::Identifier: { 8899 IdentifierInfo *II = readIdentifier(); 8900 SourceRange Range = readSourceRange(); 8901 Builder.Extend(Context, II, Range.getBegin(), Range.getEnd()); 8902 break; 8903 } 8904 8905 case NestedNameSpecifier::Namespace: { 8906 NamespaceDecl *NS = readDeclAs<NamespaceDecl>(); 8907 SourceRange Range = readSourceRange(); 8908 Builder.Extend(Context, NS, Range.getBegin(), Range.getEnd()); 8909 break; 8910 } 8911 8912 case NestedNameSpecifier::NamespaceAlias: { 8913 NamespaceAliasDecl *Alias = readDeclAs<NamespaceAliasDecl>(); 8914 SourceRange Range = readSourceRange(); 8915 Builder.Extend(Context, Alias, Range.getBegin(), Range.getEnd()); 8916 break; 8917 } 8918 8919 case NestedNameSpecifier::TypeSpec: 8920 case NestedNameSpecifier::TypeSpecWithTemplate: { 8921 bool Template = readBool(); 8922 TypeSourceInfo *T = readTypeSourceInfo(); 8923 if (!T) 8924 return NestedNameSpecifierLoc(); 8925 SourceLocation ColonColonLoc = readSourceLocation(); 8926 8927 // FIXME: 'template' keyword location not saved anywhere, so we fake it. 8928 Builder.Extend(Context, 8929 Template? T->getTypeLoc().getBeginLoc() : SourceLocation(), 8930 T->getTypeLoc(), ColonColonLoc); 8931 break; 8932 } 8933 8934 case NestedNameSpecifier::Global: { 8935 SourceLocation ColonColonLoc = readSourceLocation(); 8936 Builder.MakeGlobal(Context, ColonColonLoc); 8937 break; 8938 } 8939 8940 case NestedNameSpecifier::Super: { 8941 CXXRecordDecl *RD = readDeclAs<CXXRecordDecl>(); 8942 SourceRange Range = readSourceRange(); 8943 Builder.MakeSuper(Context, RD, Range.getBegin(), Range.getEnd()); 8944 break; 8945 } 8946 } 8947 } 8948 8949 return Builder.getWithLocInContext(Context); 8950 } 8951 8952 SourceRange 8953 ASTReader::ReadSourceRange(ModuleFile &F, const RecordData &Record, 8954 unsigned &Idx) { 8955 SourceLocation beg = ReadSourceLocation(F, Record, Idx); 8956 SourceLocation end = ReadSourceLocation(F, Record, Idx); 8957 return SourceRange(beg, end); 8958 } 8959 8960 /// Read a floating-point value 8961 llvm::APFloat ASTRecordReader::readAPFloat(const llvm::fltSemantics &Sem) { 8962 return llvm::APFloat(Sem, readAPInt()); 8963 } 8964 8965 // Read a string 8966 std::string ASTReader::ReadString(const RecordData &Record, unsigned &Idx) { 8967 unsigned Len = Record[Idx++]; 8968 std::string Result(Record.data() + Idx, Record.data() + Idx + Len); 8969 Idx += Len; 8970 return Result; 8971 } 8972 8973 std::string ASTReader::ReadPath(ModuleFile &F, const RecordData &Record, 8974 unsigned &Idx) { 8975 std::string Filename = ReadString(Record, Idx); 8976 ResolveImportedPath(F, Filename); 8977 return Filename; 8978 } 8979 8980 std::string ASTReader::ReadPath(StringRef BaseDirectory, 8981 const RecordData &Record, unsigned &Idx) { 8982 std::string Filename = ReadString(Record, Idx); 8983 if (!BaseDirectory.empty()) 8984 ResolveImportedPath(Filename, BaseDirectory); 8985 return Filename; 8986 } 8987 8988 VersionTuple ASTReader::ReadVersionTuple(const RecordData &Record, 8989 unsigned &Idx) { 8990 unsigned Major = Record[Idx++]; 8991 unsigned Minor = Record[Idx++]; 8992 unsigned Subminor = Record[Idx++]; 8993 if (Minor == 0) 8994 return VersionTuple(Major); 8995 if (Subminor == 0) 8996 return VersionTuple(Major, Minor - 1); 8997 return VersionTuple(Major, Minor - 1, Subminor - 1); 8998 } 8999 9000 CXXTemporary *ASTReader::ReadCXXTemporary(ModuleFile &F, 9001 const RecordData &Record, 9002 unsigned &Idx) { 9003 CXXDestructorDecl *Decl = ReadDeclAs<CXXDestructorDecl>(F, Record, Idx); 9004 return CXXTemporary::Create(getContext(), Decl); 9005 } 9006 9007 DiagnosticBuilder ASTReader::Diag(unsigned DiagID) const { 9008 return Diag(CurrentImportLoc, DiagID); 9009 } 9010 9011 DiagnosticBuilder ASTReader::Diag(SourceLocation Loc, unsigned DiagID) const { 9012 return Diags.Report(Loc, DiagID); 9013 } 9014 9015 /// Retrieve the identifier table associated with the 9016 /// preprocessor. 9017 IdentifierTable &ASTReader::getIdentifierTable() { 9018 return PP.getIdentifierTable(); 9019 } 9020 9021 /// Record that the given ID maps to the given switch-case 9022 /// statement. 9023 void ASTReader::RecordSwitchCaseID(SwitchCase *SC, unsigned ID) { 9024 assert((*CurrSwitchCaseStmts)[ID] == nullptr && 9025 "Already have a SwitchCase with this ID"); 9026 (*CurrSwitchCaseStmts)[ID] = SC; 9027 } 9028 9029 /// Retrieve the switch-case statement with the given ID. 9030 SwitchCase *ASTReader::getSwitchCaseWithID(unsigned ID) { 9031 assert((*CurrSwitchCaseStmts)[ID] != nullptr && "No SwitchCase with this ID"); 9032 return (*CurrSwitchCaseStmts)[ID]; 9033 } 9034 9035 void ASTReader::ClearSwitchCaseIDs() { 9036 CurrSwitchCaseStmts->clear(); 9037 } 9038 9039 void ASTReader::ReadComments() { 9040 ASTContext &Context = getContext(); 9041 std::vector<RawComment *> Comments; 9042 for (SmallVectorImpl<std::pair<BitstreamCursor, 9043 serialization::ModuleFile *>>::iterator 9044 I = CommentsCursors.begin(), 9045 E = CommentsCursors.end(); 9046 I != E; ++I) { 9047 Comments.clear(); 9048 BitstreamCursor &Cursor = I->first; 9049 serialization::ModuleFile &F = *I->second; 9050 SavedStreamPosition SavedPosition(Cursor); 9051 9052 RecordData Record; 9053 while (true) { 9054 Expected<llvm::BitstreamEntry> MaybeEntry = 9055 Cursor.advanceSkippingSubblocks( 9056 BitstreamCursor::AF_DontPopBlockAtEnd); 9057 if (!MaybeEntry) { 9058 Error(MaybeEntry.takeError()); 9059 return; 9060 } 9061 llvm::BitstreamEntry Entry = MaybeEntry.get(); 9062 9063 switch (Entry.Kind) { 9064 case llvm::BitstreamEntry::SubBlock: // Handled for us already. 9065 case llvm::BitstreamEntry::Error: 9066 Error("malformed block record in AST file"); 9067 return; 9068 case llvm::BitstreamEntry::EndBlock: 9069 goto NextCursor; 9070 case llvm::BitstreamEntry::Record: 9071 // The interesting case. 9072 break; 9073 } 9074 9075 // Read a record. 9076 Record.clear(); 9077 Expected<unsigned> MaybeComment = Cursor.readRecord(Entry.ID, Record); 9078 if (!MaybeComment) { 9079 Error(MaybeComment.takeError()); 9080 return; 9081 } 9082 switch ((CommentRecordTypes)MaybeComment.get()) { 9083 case COMMENTS_RAW_COMMENT: { 9084 unsigned Idx = 0; 9085 SourceRange SR = ReadSourceRange(F, Record, Idx); 9086 RawComment::CommentKind Kind = 9087 (RawComment::CommentKind) Record[Idx++]; 9088 bool IsTrailingComment = Record[Idx++]; 9089 bool IsAlmostTrailingComment = Record[Idx++]; 9090 Comments.push_back(new (Context) RawComment( 9091 SR, Kind, IsTrailingComment, IsAlmostTrailingComment)); 9092 break; 9093 } 9094 } 9095 } 9096 NextCursor: 9097 llvm::DenseMap<FileID, std::map<unsigned, RawComment *>> 9098 FileToOffsetToComment; 9099 for (RawComment *C : Comments) { 9100 SourceLocation CommentLoc = C->getBeginLoc(); 9101 if (CommentLoc.isValid()) { 9102 std::pair<FileID, unsigned> Loc = 9103 SourceMgr.getDecomposedLoc(CommentLoc); 9104 if (Loc.first.isValid()) 9105 Context.Comments.OrderedComments[Loc.first].emplace(Loc.second, C); 9106 } 9107 } 9108 } 9109 } 9110 9111 void ASTReader::visitInputFiles(serialization::ModuleFile &MF, 9112 bool IncludeSystem, bool Complain, 9113 llvm::function_ref<void(const serialization::InputFile &IF, 9114 bool isSystem)> Visitor) { 9115 unsigned NumUserInputs = MF.NumUserInputFiles; 9116 unsigned NumInputs = MF.InputFilesLoaded.size(); 9117 assert(NumUserInputs <= NumInputs); 9118 unsigned N = IncludeSystem ? NumInputs : NumUserInputs; 9119 for (unsigned I = 0; I < N; ++I) { 9120 bool IsSystem = I >= NumUserInputs; 9121 InputFile IF = getInputFile(MF, I+1, Complain); 9122 Visitor(IF, IsSystem); 9123 } 9124 } 9125 9126 void ASTReader::visitTopLevelModuleMaps( 9127 serialization::ModuleFile &MF, 9128 llvm::function_ref<void(const FileEntry *FE)> Visitor) { 9129 unsigned NumInputs = MF.InputFilesLoaded.size(); 9130 for (unsigned I = 0; I < NumInputs; ++I) { 9131 InputFileInfo IFI = readInputFileInfo(MF, I + 1); 9132 if (IFI.TopLevelModuleMap) 9133 // FIXME: This unnecessarily re-reads the InputFileInfo. 9134 if (auto FE = getInputFile(MF, I + 1).getFile()) 9135 Visitor(FE); 9136 } 9137 } 9138 9139 std::string ASTReader::getOwningModuleNameForDiagnostic(const Decl *D) { 9140 // If we know the owning module, use it. 9141 if (Module *M = D->getImportedOwningModule()) 9142 return M->getFullModuleName(); 9143 9144 // Otherwise, use the name of the top-level module the decl is within. 9145 if (ModuleFile *M = getOwningModuleFile(D)) 9146 return M->ModuleName; 9147 9148 // Not from a module. 9149 return {}; 9150 } 9151 9152 void ASTReader::finishPendingActions() { 9153 while (!PendingIdentifierInfos.empty() || !PendingFunctionTypes.empty() || 9154 !PendingIncompleteDeclChains.empty() || !PendingDeclChains.empty() || 9155 !PendingMacroIDs.empty() || !PendingDeclContextInfos.empty() || 9156 !PendingUpdateRecords.empty()) { 9157 // If any identifiers with corresponding top-level declarations have 9158 // been loaded, load those declarations now. 9159 using TopLevelDeclsMap = 9160 llvm::DenseMap<IdentifierInfo *, SmallVector<Decl *, 2>>; 9161 TopLevelDeclsMap TopLevelDecls; 9162 9163 while (!PendingIdentifierInfos.empty()) { 9164 IdentifierInfo *II = PendingIdentifierInfos.back().first; 9165 SmallVector<uint32_t, 4> DeclIDs = 9166 std::move(PendingIdentifierInfos.back().second); 9167 PendingIdentifierInfos.pop_back(); 9168 9169 SetGloballyVisibleDecls(II, DeclIDs, &TopLevelDecls[II]); 9170 } 9171 9172 // Load each function type that we deferred loading because it was a 9173 // deduced type that might refer to a local type declared within itself. 9174 for (unsigned I = 0; I != PendingFunctionTypes.size(); ++I) { 9175 auto *FD = PendingFunctionTypes[I].first; 9176 FD->setType(GetType(PendingFunctionTypes[I].second)); 9177 9178 // If we gave a function a deduced return type, remember that we need to 9179 // propagate that along the redeclaration chain. 9180 auto *DT = FD->getReturnType()->getContainedDeducedType(); 9181 if (DT && DT->isDeduced()) 9182 PendingDeducedTypeUpdates.insert( 9183 {FD->getCanonicalDecl(), FD->getReturnType()}); 9184 } 9185 PendingFunctionTypes.clear(); 9186 9187 // For each decl chain that we wanted to complete while deserializing, mark 9188 // it as "still needs to be completed". 9189 for (unsigned I = 0; I != PendingIncompleteDeclChains.size(); ++I) { 9190 markIncompleteDeclChain(PendingIncompleteDeclChains[I]); 9191 } 9192 PendingIncompleteDeclChains.clear(); 9193 9194 // Load pending declaration chains. 9195 for (unsigned I = 0; I != PendingDeclChains.size(); ++I) 9196 loadPendingDeclChain(PendingDeclChains[I].first, 9197 PendingDeclChains[I].second); 9198 PendingDeclChains.clear(); 9199 9200 // Make the most recent of the top-level declarations visible. 9201 for (TopLevelDeclsMap::iterator TLD = TopLevelDecls.begin(), 9202 TLDEnd = TopLevelDecls.end(); TLD != TLDEnd; ++TLD) { 9203 IdentifierInfo *II = TLD->first; 9204 for (unsigned I = 0, N = TLD->second.size(); I != N; ++I) { 9205 pushExternalDeclIntoScope(cast<NamedDecl>(TLD->second[I]), II); 9206 } 9207 } 9208 9209 // Load any pending macro definitions. 9210 for (unsigned I = 0; I != PendingMacroIDs.size(); ++I) { 9211 IdentifierInfo *II = PendingMacroIDs.begin()[I].first; 9212 SmallVector<PendingMacroInfo, 2> GlobalIDs; 9213 GlobalIDs.swap(PendingMacroIDs.begin()[I].second); 9214 // Initialize the macro history from chained-PCHs ahead of module imports. 9215 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9216 ++IDIdx) { 9217 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9218 if (!Info.M->isModule()) 9219 resolvePendingMacro(II, Info); 9220 } 9221 // Handle module imports. 9222 for (unsigned IDIdx = 0, NumIDs = GlobalIDs.size(); IDIdx != NumIDs; 9223 ++IDIdx) { 9224 const PendingMacroInfo &Info = GlobalIDs[IDIdx]; 9225 if (Info.M->isModule()) 9226 resolvePendingMacro(II, Info); 9227 } 9228 } 9229 PendingMacroIDs.clear(); 9230 9231 // Wire up the DeclContexts for Decls that we delayed setting until 9232 // recursive loading is completed. 9233 while (!PendingDeclContextInfos.empty()) { 9234 PendingDeclContextInfo Info = PendingDeclContextInfos.front(); 9235 PendingDeclContextInfos.pop_front(); 9236 DeclContext *SemaDC = cast<DeclContext>(GetDecl(Info.SemaDC)); 9237 DeclContext *LexicalDC = cast<DeclContext>(GetDecl(Info.LexicalDC)); 9238 Info.D->setDeclContextsImpl(SemaDC, LexicalDC, getContext()); 9239 } 9240 9241 // Perform any pending declaration updates. 9242 while (!PendingUpdateRecords.empty()) { 9243 auto Update = PendingUpdateRecords.pop_back_val(); 9244 ReadingKindTracker ReadingKind(Read_Decl, *this); 9245 loadDeclUpdateRecords(Update); 9246 } 9247 } 9248 9249 // At this point, all update records for loaded decls are in place, so any 9250 // fake class definitions should have become real. 9251 assert(PendingFakeDefinitionData.empty() && 9252 "faked up a class definition but never saw the real one"); 9253 9254 // If we deserialized any C++ or Objective-C class definitions, any 9255 // Objective-C protocol definitions, or any redeclarable templates, make sure 9256 // that all redeclarations point to the definitions. Note that this can only 9257 // happen now, after the redeclaration chains have been fully wired. 9258 for (Decl *D : PendingDefinitions) { 9259 if (TagDecl *TD = dyn_cast<TagDecl>(D)) { 9260 if (const TagType *TagT = dyn_cast<TagType>(TD->getTypeForDecl())) { 9261 // Make sure that the TagType points at the definition. 9262 const_cast<TagType*>(TagT)->decl = TD; 9263 } 9264 9265 if (auto RD = dyn_cast<CXXRecordDecl>(D)) { 9266 for (auto *R = getMostRecentExistingDecl(RD); R; 9267 R = R->getPreviousDecl()) { 9268 assert((R == D) == 9269 cast<CXXRecordDecl>(R)->isThisDeclarationADefinition() && 9270 "declaration thinks it's the definition but it isn't"); 9271 cast<CXXRecordDecl>(R)->DefinitionData = RD->DefinitionData; 9272 } 9273 } 9274 9275 continue; 9276 } 9277 9278 if (auto ID = dyn_cast<ObjCInterfaceDecl>(D)) { 9279 // Make sure that the ObjCInterfaceType points at the definition. 9280 const_cast<ObjCInterfaceType *>(cast<ObjCInterfaceType>(ID->TypeForDecl)) 9281 ->Decl = ID; 9282 9283 for (auto *R = getMostRecentExistingDecl(ID); R; R = R->getPreviousDecl()) 9284 cast<ObjCInterfaceDecl>(R)->Data = ID->Data; 9285 9286 continue; 9287 } 9288 9289 if (auto PD = dyn_cast<ObjCProtocolDecl>(D)) { 9290 for (auto *R = getMostRecentExistingDecl(PD); R; R = R->getPreviousDecl()) 9291 cast<ObjCProtocolDecl>(R)->Data = PD->Data; 9292 9293 continue; 9294 } 9295 9296 auto RTD = cast<RedeclarableTemplateDecl>(D)->getCanonicalDecl(); 9297 for (auto *R = getMostRecentExistingDecl(RTD); R; R = R->getPreviousDecl()) 9298 cast<RedeclarableTemplateDecl>(R)->Common = RTD->Common; 9299 } 9300 PendingDefinitions.clear(); 9301 9302 // Load the bodies of any functions or methods we've encountered. We do 9303 // this now (delayed) so that we can be sure that the declaration chains 9304 // have been fully wired up (hasBody relies on this). 9305 // FIXME: We shouldn't require complete redeclaration chains here. 9306 for (PendingBodiesMap::iterator PB = PendingBodies.begin(), 9307 PBEnd = PendingBodies.end(); 9308 PB != PBEnd; ++PB) { 9309 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(PB->first)) { 9310 // For a function defined inline within a class template, force the 9311 // canonical definition to be the one inside the canonical definition of 9312 // the template. This ensures that we instantiate from a correct view 9313 // of the template. 9314 // 9315 // Sadly we can't do this more generally: we can't be sure that all 9316 // copies of an arbitrary class definition will have the same members 9317 // defined (eg, some member functions may not be instantiated, and some 9318 // special members may or may not have been implicitly defined). 9319 if (auto *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalParent())) 9320 if (RD->isDependentContext() && !RD->isThisDeclarationADefinition()) 9321 continue; 9322 9323 // FIXME: Check for =delete/=default? 9324 // FIXME: Complain about ODR violations here? 9325 const FunctionDecl *Defn = nullptr; 9326 if (!getContext().getLangOpts().Modules || !FD->hasBody(Defn)) { 9327 FD->setLazyBody(PB->second); 9328 } else { 9329 auto *NonConstDefn = const_cast<FunctionDecl*>(Defn); 9330 mergeDefinitionVisibility(NonConstDefn, FD); 9331 9332 if (!FD->isLateTemplateParsed() && 9333 !NonConstDefn->isLateTemplateParsed() && 9334 FD->getODRHash() != NonConstDefn->getODRHash()) { 9335 if (!isa<CXXMethodDecl>(FD)) { 9336 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9337 } else if (FD->getLexicalParent()->isFileContext() && 9338 NonConstDefn->getLexicalParent()->isFileContext()) { 9339 // Only diagnose out-of-line method definitions. If they are 9340 // in class definitions, then an error will be generated when 9341 // processing the class bodies. 9342 PendingFunctionOdrMergeFailures[FD].push_back(NonConstDefn); 9343 } 9344 } 9345 } 9346 continue; 9347 } 9348 9349 ObjCMethodDecl *MD = cast<ObjCMethodDecl>(PB->first); 9350 if (!getContext().getLangOpts().Modules || !MD->hasBody()) 9351 MD->setLazyBody(PB->second); 9352 } 9353 PendingBodies.clear(); 9354 9355 // Do some cleanup. 9356 for (auto *ND : PendingMergedDefinitionsToDeduplicate) 9357 getContext().deduplicateMergedDefinitonsFor(ND); 9358 PendingMergedDefinitionsToDeduplicate.clear(); 9359 } 9360 9361 void ASTReader::diagnoseOdrViolations() { 9362 if (PendingOdrMergeFailures.empty() && PendingOdrMergeChecks.empty() && 9363 PendingFunctionOdrMergeFailures.empty() && 9364 PendingEnumOdrMergeFailures.empty()) 9365 return; 9366 9367 // Trigger the import of the full definition of each class that had any 9368 // odr-merging problems, so we can produce better diagnostics for them. 9369 // These updates may in turn find and diagnose some ODR failures, so take 9370 // ownership of the set first. 9371 auto OdrMergeFailures = std::move(PendingOdrMergeFailures); 9372 PendingOdrMergeFailures.clear(); 9373 for (auto &Merge : OdrMergeFailures) { 9374 Merge.first->buildLookup(); 9375 Merge.first->decls_begin(); 9376 Merge.first->bases_begin(); 9377 Merge.first->vbases_begin(); 9378 for (auto &RecordPair : Merge.second) { 9379 auto *RD = RecordPair.first; 9380 RD->decls_begin(); 9381 RD->bases_begin(); 9382 RD->vbases_begin(); 9383 } 9384 } 9385 9386 // Trigger the import of functions. 9387 auto FunctionOdrMergeFailures = std::move(PendingFunctionOdrMergeFailures); 9388 PendingFunctionOdrMergeFailures.clear(); 9389 for (auto &Merge : FunctionOdrMergeFailures) { 9390 Merge.first->buildLookup(); 9391 Merge.first->decls_begin(); 9392 Merge.first->getBody(); 9393 for (auto &FD : Merge.second) { 9394 FD->buildLookup(); 9395 FD->decls_begin(); 9396 FD->getBody(); 9397 } 9398 } 9399 9400 // Trigger the import of enums. 9401 auto EnumOdrMergeFailures = std::move(PendingEnumOdrMergeFailures); 9402 PendingEnumOdrMergeFailures.clear(); 9403 for (auto &Merge : EnumOdrMergeFailures) { 9404 Merge.first->decls_begin(); 9405 for (auto &Enum : Merge.second) { 9406 Enum->decls_begin(); 9407 } 9408 } 9409 9410 // For each declaration from a merged context, check that the canonical 9411 // definition of that context also contains a declaration of the same 9412 // entity. 9413 // 9414 // Caution: this loop does things that might invalidate iterators into 9415 // PendingOdrMergeChecks. Don't turn this into a range-based for loop! 9416 while (!PendingOdrMergeChecks.empty()) { 9417 NamedDecl *D = PendingOdrMergeChecks.pop_back_val(); 9418 9419 // FIXME: Skip over implicit declarations for now. This matters for things 9420 // like implicitly-declared special member functions. This isn't entirely 9421 // correct; we can end up with multiple unmerged declarations of the same 9422 // implicit entity. 9423 if (D->isImplicit()) 9424 continue; 9425 9426 DeclContext *CanonDef = D->getDeclContext(); 9427 9428 bool Found = false; 9429 const Decl *DCanon = D->getCanonicalDecl(); 9430 9431 for (auto RI : D->redecls()) { 9432 if (RI->getLexicalDeclContext() == CanonDef) { 9433 Found = true; 9434 break; 9435 } 9436 } 9437 if (Found) 9438 continue; 9439 9440 // Quick check failed, time to do the slow thing. Note, we can't just 9441 // look up the name of D in CanonDef here, because the member that is 9442 // in CanonDef might not be found by name lookup (it might have been 9443 // replaced by a more recent declaration in the lookup table), and we 9444 // can't necessarily find it in the redeclaration chain because it might 9445 // be merely mergeable, not redeclarable. 9446 llvm::SmallVector<const NamedDecl*, 4> Candidates; 9447 for (auto *CanonMember : CanonDef->decls()) { 9448 if (CanonMember->getCanonicalDecl() == DCanon) { 9449 // This can happen if the declaration is merely mergeable and not 9450 // actually redeclarable (we looked for redeclarations earlier). 9451 // 9452 // FIXME: We should be able to detect this more efficiently, without 9453 // pulling in all of the members of CanonDef. 9454 Found = true; 9455 break; 9456 } 9457 if (auto *ND = dyn_cast<NamedDecl>(CanonMember)) 9458 if (ND->getDeclName() == D->getDeclName()) 9459 Candidates.push_back(ND); 9460 } 9461 9462 if (!Found) { 9463 // The AST doesn't like TagDecls becoming invalid after they've been 9464 // completed. We only really need to mark FieldDecls as invalid here. 9465 if (!isa<TagDecl>(D)) 9466 D->setInvalidDecl(); 9467 9468 // Ensure we don't accidentally recursively enter deserialization while 9469 // we're producing our diagnostic. 9470 Deserializing RecursionGuard(this); 9471 9472 std::string CanonDefModule = 9473 getOwningModuleNameForDiagnostic(cast<Decl>(CanonDef)); 9474 Diag(D->getLocation(), diag::err_module_odr_violation_missing_decl) 9475 << D << getOwningModuleNameForDiagnostic(D) 9476 << CanonDef << CanonDefModule.empty() << CanonDefModule; 9477 9478 if (Candidates.empty()) 9479 Diag(cast<Decl>(CanonDef)->getLocation(), 9480 diag::note_module_odr_violation_no_possible_decls) << D; 9481 else { 9482 for (unsigned I = 0, N = Candidates.size(); I != N; ++I) 9483 Diag(Candidates[I]->getLocation(), 9484 diag::note_module_odr_violation_possible_decl) 9485 << Candidates[I]; 9486 } 9487 9488 DiagnosedOdrMergeFailures.insert(CanonDef); 9489 } 9490 } 9491 9492 if (OdrMergeFailures.empty() && FunctionOdrMergeFailures.empty() && 9493 EnumOdrMergeFailures.empty()) 9494 return; 9495 9496 // Ensure we don't accidentally recursively enter deserialization while 9497 // we're producing our diagnostics. 9498 Deserializing RecursionGuard(this); 9499 9500 // Common code for hashing helpers. 9501 ODRHash Hash; 9502 auto ComputeQualTypeODRHash = [&Hash](QualType Ty) { 9503 Hash.clear(); 9504 Hash.AddQualType(Ty); 9505 return Hash.CalculateHash(); 9506 }; 9507 9508 auto ComputeODRHash = [&Hash](const Stmt *S) { 9509 assert(S); 9510 Hash.clear(); 9511 Hash.AddStmt(S); 9512 return Hash.CalculateHash(); 9513 }; 9514 9515 auto ComputeSubDeclODRHash = [&Hash](const Decl *D) { 9516 assert(D); 9517 Hash.clear(); 9518 Hash.AddSubDecl(D); 9519 return Hash.CalculateHash(); 9520 }; 9521 9522 auto ComputeTemplateArgumentODRHash = [&Hash](const TemplateArgument &TA) { 9523 Hash.clear(); 9524 Hash.AddTemplateArgument(TA); 9525 return Hash.CalculateHash(); 9526 }; 9527 9528 auto ComputeTemplateParameterListODRHash = 9529 [&Hash](const TemplateParameterList *TPL) { 9530 assert(TPL); 9531 Hash.clear(); 9532 Hash.AddTemplateParameterList(TPL); 9533 return Hash.CalculateHash(); 9534 }; 9535 9536 // Used with err_module_odr_violation_mismatch_decl and 9537 // note_module_odr_violation_mismatch_decl 9538 // This list should be the same Decl's as in ODRHash::isDeclToBeProcessed 9539 enum ODRMismatchDecl { 9540 EndOfClass, 9541 PublicSpecifer, 9542 PrivateSpecifer, 9543 ProtectedSpecifer, 9544 StaticAssert, 9545 Field, 9546 CXXMethod, 9547 TypeAlias, 9548 TypeDef, 9549 Var, 9550 Friend, 9551 FunctionTemplate, 9552 Other 9553 }; 9554 9555 // Used with err_module_odr_violation_mismatch_decl_diff and 9556 // note_module_odr_violation_mismatch_decl_diff 9557 enum ODRMismatchDeclDifference { 9558 StaticAssertCondition, 9559 StaticAssertMessage, 9560 StaticAssertOnlyMessage, 9561 FieldName, 9562 FieldTypeName, 9563 FieldSingleBitField, 9564 FieldDifferentWidthBitField, 9565 FieldSingleMutable, 9566 FieldSingleInitializer, 9567 FieldDifferentInitializers, 9568 MethodName, 9569 MethodDeleted, 9570 MethodDefaulted, 9571 MethodVirtual, 9572 MethodStatic, 9573 MethodVolatile, 9574 MethodConst, 9575 MethodInline, 9576 MethodNumberParameters, 9577 MethodParameterType, 9578 MethodParameterName, 9579 MethodParameterSingleDefaultArgument, 9580 MethodParameterDifferentDefaultArgument, 9581 MethodNoTemplateArguments, 9582 MethodDifferentNumberTemplateArguments, 9583 MethodDifferentTemplateArgument, 9584 MethodSingleBody, 9585 MethodDifferentBody, 9586 TypedefName, 9587 TypedefType, 9588 VarName, 9589 VarType, 9590 VarSingleInitializer, 9591 VarDifferentInitializer, 9592 VarConstexpr, 9593 FriendTypeFunction, 9594 FriendType, 9595 FriendFunction, 9596 FunctionTemplateDifferentNumberParameters, 9597 FunctionTemplateParameterDifferentKind, 9598 FunctionTemplateParameterName, 9599 FunctionTemplateParameterSingleDefaultArgument, 9600 FunctionTemplateParameterDifferentDefaultArgument, 9601 FunctionTemplateParameterDifferentType, 9602 FunctionTemplatePackParameter, 9603 }; 9604 9605 // These lambdas have the common portions of the ODR diagnostics. This 9606 // has the same return as Diag(), so addition parameters can be passed 9607 // in with operator<< 9608 auto ODRDiagDeclError = [this](NamedDecl *FirstRecord, StringRef FirstModule, 9609 SourceLocation Loc, SourceRange Range, 9610 ODRMismatchDeclDifference DiffType) { 9611 return Diag(Loc, diag::err_module_odr_violation_mismatch_decl_diff) 9612 << FirstRecord << FirstModule.empty() << FirstModule << Range 9613 << DiffType; 9614 }; 9615 auto ODRDiagDeclNote = [this](StringRef SecondModule, SourceLocation Loc, 9616 SourceRange Range, ODRMismatchDeclDifference DiffType) { 9617 return Diag(Loc, diag::note_module_odr_violation_mismatch_decl_diff) 9618 << SecondModule << Range << DiffType; 9619 }; 9620 9621 auto ODRDiagField = [this, &ODRDiagDeclError, &ODRDiagDeclNote, 9622 &ComputeQualTypeODRHash, &ComputeODRHash]( 9623 NamedDecl *FirstRecord, StringRef FirstModule, 9624 StringRef SecondModule, FieldDecl *FirstField, 9625 FieldDecl *SecondField) { 9626 IdentifierInfo *FirstII = FirstField->getIdentifier(); 9627 IdentifierInfo *SecondII = SecondField->getIdentifier(); 9628 if (FirstII->getName() != SecondII->getName()) { 9629 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9630 FirstField->getSourceRange(), FieldName) 9631 << FirstII; 9632 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9633 SecondField->getSourceRange(), FieldName) 9634 << SecondII; 9635 9636 return true; 9637 } 9638 9639 assert(getContext().hasSameType(FirstField->getType(), 9640 SecondField->getType())); 9641 9642 QualType FirstType = FirstField->getType(); 9643 QualType SecondType = SecondField->getType(); 9644 if (ComputeQualTypeODRHash(FirstType) != 9645 ComputeQualTypeODRHash(SecondType)) { 9646 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9647 FirstField->getSourceRange(), FieldTypeName) 9648 << FirstII << FirstType; 9649 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9650 SecondField->getSourceRange(), FieldTypeName) 9651 << SecondII << SecondType; 9652 9653 return true; 9654 } 9655 9656 const bool IsFirstBitField = FirstField->isBitField(); 9657 const bool IsSecondBitField = SecondField->isBitField(); 9658 if (IsFirstBitField != IsSecondBitField) { 9659 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9660 FirstField->getSourceRange(), FieldSingleBitField) 9661 << FirstII << IsFirstBitField; 9662 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9663 SecondField->getSourceRange(), FieldSingleBitField) 9664 << SecondII << IsSecondBitField; 9665 return true; 9666 } 9667 9668 if (IsFirstBitField && IsSecondBitField) { 9669 unsigned FirstBitWidthHash = 9670 ComputeODRHash(FirstField->getBitWidth()); 9671 unsigned SecondBitWidthHash = 9672 ComputeODRHash(SecondField->getBitWidth()); 9673 if (FirstBitWidthHash != SecondBitWidthHash) { 9674 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9675 FirstField->getSourceRange(), 9676 FieldDifferentWidthBitField) 9677 << FirstII << FirstField->getBitWidth()->getSourceRange(); 9678 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9679 SecondField->getSourceRange(), 9680 FieldDifferentWidthBitField) 9681 << SecondII << SecondField->getBitWidth()->getSourceRange(); 9682 return true; 9683 } 9684 } 9685 9686 if (!PP.getLangOpts().CPlusPlus) 9687 return false; 9688 9689 const bool IsFirstMutable = FirstField->isMutable(); 9690 const bool IsSecondMutable = SecondField->isMutable(); 9691 if (IsFirstMutable != IsSecondMutable) { 9692 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9693 FirstField->getSourceRange(), FieldSingleMutable) 9694 << FirstII << IsFirstMutable; 9695 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9696 SecondField->getSourceRange(), FieldSingleMutable) 9697 << SecondII << IsSecondMutable; 9698 return true; 9699 } 9700 9701 const Expr *FirstInitializer = FirstField->getInClassInitializer(); 9702 const Expr *SecondInitializer = SecondField->getInClassInitializer(); 9703 if ((!FirstInitializer && SecondInitializer) || 9704 (FirstInitializer && !SecondInitializer)) { 9705 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9706 FirstField->getSourceRange(), FieldSingleInitializer) 9707 << FirstII << (FirstInitializer != nullptr); 9708 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9709 SecondField->getSourceRange(), FieldSingleInitializer) 9710 << SecondII << (SecondInitializer != nullptr); 9711 return true; 9712 } 9713 9714 if (FirstInitializer && SecondInitializer) { 9715 unsigned FirstInitHash = ComputeODRHash(FirstInitializer); 9716 unsigned SecondInitHash = ComputeODRHash(SecondInitializer); 9717 if (FirstInitHash != SecondInitHash) { 9718 ODRDiagDeclError(FirstRecord, FirstModule, FirstField->getLocation(), 9719 FirstField->getSourceRange(), 9720 FieldDifferentInitializers) 9721 << FirstII << FirstInitializer->getSourceRange(); 9722 ODRDiagDeclNote(SecondModule, SecondField->getLocation(), 9723 SecondField->getSourceRange(), 9724 FieldDifferentInitializers) 9725 << SecondII << SecondInitializer->getSourceRange(); 9726 return true; 9727 } 9728 } 9729 9730 return false; 9731 }; 9732 9733 auto ODRDiagTypeDefOrAlias = 9734 [&ODRDiagDeclError, &ODRDiagDeclNote, &ComputeQualTypeODRHash]( 9735 NamedDecl *FirstRecord, StringRef FirstModule, StringRef SecondModule, 9736 TypedefNameDecl *FirstTD, TypedefNameDecl *SecondTD, 9737 bool IsTypeAlias) { 9738 auto FirstName = FirstTD->getDeclName(); 9739 auto SecondName = SecondTD->getDeclName(); 9740 if (FirstName != SecondName) { 9741 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9742 FirstTD->getSourceRange(), TypedefName) 9743 << IsTypeAlias << FirstName; 9744 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9745 SecondTD->getSourceRange(), TypedefName) 9746 << IsTypeAlias << SecondName; 9747 return true; 9748 } 9749 9750 QualType FirstType = FirstTD->getUnderlyingType(); 9751 QualType SecondType = SecondTD->getUnderlyingType(); 9752 if (ComputeQualTypeODRHash(FirstType) != 9753 ComputeQualTypeODRHash(SecondType)) { 9754 ODRDiagDeclError(FirstRecord, FirstModule, FirstTD->getLocation(), 9755 FirstTD->getSourceRange(), TypedefType) 9756 << IsTypeAlias << FirstName << FirstType; 9757 ODRDiagDeclNote(SecondModule, SecondTD->getLocation(), 9758 SecondTD->getSourceRange(), TypedefType) 9759 << IsTypeAlias << SecondName << SecondType; 9760 return true; 9761 } 9762 9763 return false; 9764 }; 9765 9766 auto ODRDiagVar = [&ODRDiagDeclError, &ODRDiagDeclNote, 9767 &ComputeQualTypeODRHash, &ComputeODRHash, 9768 this](NamedDecl *FirstRecord, StringRef FirstModule, 9769 StringRef SecondModule, VarDecl *FirstVD, 9770 VarDecl *SecondVD) { 9771 auto FirstName = FirstVD->getDeclName(); 9772 auto SecondName = SecondVD->getDeclName(); 9773 if (FirstName != SecondName) { 9774 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9775 FirstVD->getSourceRange(), VarName) 9776 << FirstName; 9777 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9778 SecondVD->getSourceRange(), VarName) 9779 << SecondName; 9780 return true; 9781 } 9782 9783 QualType FirstType = FirstVD->getType(); 9784 QualType SecondType = SecondVD->getType(); 9785 if (ComputeQualTypeODRHash(FirstType) != 9786 ComputeQualTypeODRHash(SecondType)) { 9787 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9788 FirstVD->getSourceRange(), VarType) 9789 << FirstName << FirstType; 9790 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9791 SecondVD->getSourceRange(), VarType) 9792 << SecondName << SecondType; 9793 return true; 9794 } 9795 9796 if (!PP.getLangOpts().CPlusPlus) 9797 return false; 9798 9799 const Expr *FirstInit = FirstVD->getInit(); 9800 const Expr *SecondInit = SecondVD->getInit(); 9801 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 9802 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9803 FirstVD->getSourceRange(), VarSingleInitializer) 9804 << FirstName << (FirstInit == nullptr) 9805 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 9806 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9807 SecondVD->getSourceRange(), VarSingleInitializer) 9808 << SecondName << (SecondInit == nullptr) 9809 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 9810 return true; 9811 } 9812 9813 if (FirstInit && SecondInit && 9814 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 9815 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9816 FirstVD->getSourceRange(), VarDifferentInitializer) 9817 << FirstName << FirstInit->getSourceRange(); 9818 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9819 SecondVD->getSourceRange(), VarDifferentInitializer) 9820 << SecondName << SecondInit->getSourceRange(); 9821 return true; 9822 } 9823 9824 const bool FirstIsConstexpr = FirstVD->isConstexpr(); 9825 const bool SecondIsConstexpr = SecondVD->isConstexpr(); 9826 if (FirstIsConstexpr != SecondIsConstexpr) { 9827 ODRDiagDeclError(FirstRecord, FirstModule, FirstVD->getLocation(), 9828 FirstVD->getSourceRange(), VarConstexpr) 9829 << FirstName << FirstIsConstexpr; 9830 ODRDiagDeclNote(SecondModule, SecondVD->getLocation(), 9831 SecondVD->getSourceRange(), VarConstexpr) 9832 << SecondName << SecondIsConstexpr; 9833 return true; 9834 } 9835 return false; 9836 }; 9837 9838 auto DifferenceSelector = [](Decl *D) { 9839 assert(D && "valid Decl required"); 9840 switch (D->getKind()) { 9841 default: 9842 return Other; 9843 case Decl::AccessSpec: 9844 switch (D->getAccess()) { 9845 case AS_public: 9846 return PublicSpecifer; 9847 case AS_private: 9848 return PrivateSpecifer; 9849 case AS_protected: 9850 return ProtectedSpecifer; 9851 case AS_none: 9852 break; 9853 } 9854 llvm_unreachable("Invalid access specifier"); 9855 case Decl::StaticAssert: 9856 return StaticAssert; 9857 case Decl::Field: 9858 return Field; 9859 case Decl::CXXMethod: 9860 case Decl::CXXConstructor: 9861 case Decl::CXXDestructor: 9862 return CXXMethod; 9863 case Decl::TypeAlias: 9864 return TypeAlias; 9865 case Decl::Typedef: 9866 return TypeDef; 9867 case Decl::Var: 9868 return Var; 9869 case Decl::Friend: 9870 return Friend; 9871 case Decl::FunctionTemplate: 9872 return FunctionTemplate; 9873 } 9874 }; 9875 9876 using DeclHashes = llvm::SmallVector<std::pair<Decl *, unsigned>, 4>; 9877 auto PopulateHashes = [&ComputeSubDeclODRHash](DeclHashes &Hashes, 9878 RecordDecl *Record, 9879 const DeclContext *DC) { 9880 for (auto *D : Record->decls()) { 9881 if (!ODRHash::isDeclToBeProcessed(D, DC)) 9882 continue; 9883 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 9884 } 9885 }; 9886 9887 struct DiffResult { 9888 Decl *FirstDecl = nullptr, *SecondDecl = nullptr; 9889 ODRMismatchDecl FirstDiffType = Other, SecondDiffType = Other; 9890 }; 9891 9892 // If there is a diagnoseable difference, FirstDiffType and 9893 // SecondDiffType will not be Other and FirstDecl and SecondDecl will be 9894 // filled in if not EndOfClass. 9895 auto FindTypeDiffs = [&DifferenceSelector](DeclHashes &FirstHashes, 9896 DeclHashes &SecondHashes) { 9897 DiffResult DR; 9898 auto FirstIt = FirstHashes.begin(); 9899 auto SecondIt = SecondHashes.begin(); 9900 while (FirstIt != FirstHashes.end() || SecondIt != SecondHashes.end()) { 9901 if (FirstIt != FirstHashes.end() && SecondIt != SecondHashes.end() && 9902 FirstIt->second == SecondIt->second) { 9903 ++FirstIt; 9904 ++SecondIt; 9905 continue; 9906 } 9907 9908 DR.FirstDecl = FirstIt == FirstHashes.end() ? nullptr : FirstIt->first; 9909 DR.SecondDecl = 9910 SecondIt == SecondHashes.end() ? nullptr : SecondIt->first; 9911 9912 DR.FirstDiffType = 9913 DR.FirstDecl ? DifferenceSelector(DR.FirstDecl) : EndOfClass; 9914 DR.SecondDiffType = 9915 DR.SecondDecl ? DifferenceSelector(DR.SecondDecl) : EndOfClass; 9916 return DR; 9917 } 9918 return DR; 9919 }; 9920 9921 // Use this to diagnose that an unexpected Decl was encountered 9922 // or no difference was detected. This causes a generic error 9923 // message to be emitted. 9924 auto DiagnoseODRUnexpected = [this](DiffResult &DR, NamedDecl *FirstRecord, 9925 StringRef FirstModule, 9926 NamedDecl *SecondRecord, 9927 StringRef SecondModule) { 9928 Diag(FirstRecord->getLocation(), 9929 diag::err_module_odr_violation_different_definitions) 9930 << FirstRecord << FirstModule.empty() << FirstModule; 9931 9932 if (DR.FirstDecl) { 9933 Diag(DR.FirstDecl->getLocation(), diag::note_first_module_difference) 9934 << FirstRecord << DR.FirstDecl->getSourceRange(); 9935 } 9936 9937 Diag(SecondRecord->getLocation(), 9938 diag::note_module_odr_violation_different_definitions) 9939 << SecondModule; 9940 9941 if (DR.SecondDecl) { 9942 Diag(DR.SecondDecl->getLocation(), diag::note_second_module_difference) 9943 << DR.SecondDecl->getSourceRange(); 9944 } 9945 }; 9946 9947 auto DiagnoseODRMismatch = 9948 [this](DiffResult &DR, NamedDecl *FirstRecord, StringRef FirstModule, 9949 NamedDecl *SecondRecord, StringRef SecondModule) { 9950 SourceLocation FirstLoc; 9951 SourceRange FirstRange; 9952 auto *FirstTag = dyn_cast<TagDecl>(FirstRecord); 9953 if (DR.FirstDiffType == EndOfClass && FirstTag) { 9954 FirstLoc = FirstTag->getBraceRange().getEnd(); 9955 } else { 9956 FirstLoc = DR.FirstDecl->getLocation(); 9957 FirstRange = DR.FirstDecl->getSourceRange(); 9958 } 9959 Diag(FirstLoc, diag::err_module_odr_violation_mismatch_decl) 9960 << FirstRecord << FirstModule.empty() << FirstModule << FirstRange 9961 << DR.FirstDiffType; 9962 9963 SourceLocation SecondLoc; 9964 SourceRange SecondRange; 9965 auto *SecondTag = dyn_cast<TagDecl>(SecondRecord); 9966 if (DR.SecondDiffType == EndOfClass && SecondTag) { 9967 SecondLoc = SecondTag->getBraceRange().getEnd(); 9968 } else { 9969 SecondLoc = DR.SecondDecl->getLocation(); 9970 SecondRange = DR.SecondDecl->getSourceRange(); 9971 } 9972 Diag(SecondLoc, diag::note_module_odr_violation_mismatch_decl) 9973 << SecondModule << SecondRange << DR.SecondDiffType; 9974 }; 9975 9976 // Issue any pending ODR-failure diagnostics. 9977 for (auto &Merge : OdrMergeFailures) { 9978 // If we've already pointed out a specific problem with this class, don't 9979 // bother issuing a general "something's different" diagnostic. 9980 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 9981 continue; 9982 9983 bool Diagnosed = false; 9984 CXXRecordDecl *FirstRecord = Merge.first; 9985 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstRecord); 9986 for (auto &RecordPair : Merge.second) { 9987 CXXRecordDecl *SecondRecord = RecordPair.first; 9988 // Multiple different declarations got merged together; tell the user 9989 // where they came from. 9990 if (FirstRecord == SecondRecord) 9991 continue; 9992 9993 std::string SecondModule = getOwningModuleNameForDiagnostic(SecondRecord); 9994 9995 auto *FirstDD = FirstRecord->DefinitionData; 9996 auto *SecondDD = RecordPair.second; 9997 9998 assert(FirstDD && SecondDD && "Definitions without DefinitionData"); 9999 10000 // Diagnostics from DefinitionData are emitted here. 10001 if (FirstDD != SecondDD) { 10002 enum ODRDefinitionDataDifference { 10003 NumBases, 10004 NumVBases, 10005 BaseType, 10006 BaseVirtual, 10007 BaseAccess, 10008 }; 10009 auto ODRDiagBaseError = [FirstRecord, &FirstModule, 10010 this](SourceLocation Loc, SourceRange Range, 10011 ODRDefinitionDataDifference DiffType) { 10012 return Diag(Loc, diag::err_module_odr_violation_definition_data) 10013 << FirstRecord << FirstModule.empty() << FirstModule << Range 10014 << DiffType; 10015 }; 10016 auto ODRDiagBaseNote = [&SecondModule, 10017 this](SourceLocation Loc, SourceRange Range, 10018 ODRDefinitionDataDifference DiffType) { 10019 return Diag(Loc, diag::note_module_odr_violation_definition_data) 10020 << SecondModule << Range << DiffType; 10021 }; 10022 10023 unsigned FirstNumBases = FirstDD->NumBases; 10024 unsigned FirstNumVBases = FirstDD->NumVBases; 10025 unsigned SecondNumBases = SecondDD->NumBases; 10026 unsigned SecondNumVBases = SecondDD->NumVBases; 10027 10028 auto GetSourceRange = [](struct CXXRecordDecl::DefinitionData *DD) { 10029 unsigned NumBases = DD->NumBases; 10030 if (NumBases == 0) return SourceRange(); 10031 auto bases = DD->bases(); 10032 return SourceRange(bases[0].getBeginLoc(), 10033 bases[NumBases - 1].getEndLoc()); 10034 }; 10035 10036 if (FirstNumBases != SecondNumBases) { 10037 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10038 NumBases) 10039 << FirstNumBases; 10040 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10041 NumBases) 10042 << SecondNumBases; 10043 Diagnosed = true; 10044 break; 10045 } 10046 10047 if (FirstNumVBases != SecondNumVBases) { 10048 ODRDiagBaseError(FirstRecord->getLocation(), GetSourceRange(FirstDD), 10049 NumVBases) 10050 << FirstNumVBases; 10051 ODRDiagBaseNote(SecondRecord->getLocation(), GetSourceRange(SecondDD), 10052 NumVBases) 10053 << SecondNumVBases; 10054 Diagnosed = true; 10055 break; 10056 } 10057 10058 auto FirstBases = FirstDD->bases(); 10059 auto SecondBases = SecondDD->bases(); 10060 unsigned i = 0; 10061 for (i = 0; i < FirstNumBases; ++i) { 10062 auto FirstBase = FirstBases[i]; 10063 auto SecondBase = SecondBases[i]; 10064 if (ComputeQualTypeODRHash(FirstBase.getType()) != 10065 ComputeQualTypeODRHash(SecondBase.getType())) { 10066 ODRDiagBaseError(FirstRecord->getLocation(), 10067 FirstBase.getSourceRange(), BaseType) 10068 << (i + 1) << FirstBase.getType(); 10069 ODRDiagBaseNote(SecondRecord->getLocation(), 10070 SecondBase.getSourceRange(), BaseType) 10071 << (i + 1) << SecondBase.getType(); 10072 break; 10073 } 10074 10075 if (FirstBase.isVirtual() != SecondBase.isVirtual()) { 10076 ODRDiagBaseError(FirstRecord->getLocation(), 10077 FirstBase.getSourceRange(), BaseVirtual) 10078 << (i + 1) << FirstBase.isVirtual() << FirstBase.getType(); 10079 ODRDiagBaseNote(SecondRecord->getLocation(), 10080 SecondBase.getSourceRange(), BaseVirtual) 10081 << (i + 1) << SecondBase.isVirtual() << SecondBase.getType(); 10082 break; 10083 } 10084 10085 if (FirstBase.getAccessSpecifierAsWritten() != 10086 SecondBase.getAccessSpecifierAsWritten()) { 10087 ODRDiagBaseError(FirstRecord->getLocation(), 10088 FirstBase.getSourceRange(), BaseAccess) 10089 << (i + 1) << FirstBase.getType() 10090 << (int)FirstBase.getAccessSpecifierAsWritten(); 10091 ODRDiagBaseNote(SecondRecord->getLocation(), 10092 SecondBase.getSourceRange(), BaseAccess) 10093 << (i + 1) << SecondBase.getType() 10094 << (int)SecondBase.getAccessSpecifierAsWritten(); 10095 break; 10096 } 10097 } 10098 10099 if (i != FirstNumBases) { 10100 Diagnosed = true; 10101 break; 10102 } 10103 } 10104 10105 const ClassTemplateDecl *FirstTemplate = 10106 FirstRecord->getDescribedClassTemplate(); 10107 const ClassTemplateDecl *SecondTemplate = 10108 SecondRecord->getDescribedClassTemplate(); 10109 10110 assert(!FirstTemplate == !SecondTemplate && 10111 "Both pointers should be null or non-null"); 10112 10113 enum ODRTemplateDifference { 10114 ParamEmptyName, 10115 ParamName, 10116 ParamSingleDefaultArgument, 10117 ParamDifferentDefaultArgument, 10118 }; 10119 10120 if (FirstTemplate && SecondTemplate) { 10121 DeclHashes FirstTemplateHashes; 10122 DeclHashes SecondTemplateHashes; 10123 10124 auto PopulateTemplateParameterHashs = 10125 [&ComputeSubDeclODRHash](DeclHashes &Hashes, 10126 const ClassTemplateDecl *TD) { 10127 for (auto *D : TD->getTemplateParameters()->asArray()) { 10128 Hashes.emplace_back(D, ComputeSubDeclODRHash(D)); 10129 } 10130 }; 10131 10132 PopulateTemplateParameterHashs(FirstTemplateHashes, FirstTemplate); 10133 PopulateTemplateParameterHashs(SecondTemplateHashes, SecondTemplate); 10134 10135 assert(FirstTemplateHashes.size() == SecondTemplateHashes.size() && 10136 "Number of template parameters should be equal."); 10137 10138 auto FirstIt = FirstTemplateHashes.begin(); 10139 auto FirstEnd = FirstTemplateHashes.end(); 10140 auto SecondIt = SecondTemplateHashes.begin(); 10141 for (; FirstIt != FirstEnd; ++FirstIt, ++SecondIt) { 10142 if (FirstIt->second == SecondIt->second) 10143 continue; 10144 10145 auto ODRDiagTemplateError = [FirstRecord, &FirstModule, this]( 10146 SourceLocation Loc, SourceRange Range, 10147 ODRTemplateDifference DiffType) { 10148 return Diag(Loc, diag::err_module_odr_violation_template_parameter) 10149 << FirstRecord << FirstModule.empty() << FirstModule << Range 10150 << DiffType; 10151 }; 10152 auto ODRDiagTemplateNote = [&SecondModule, this]( 10153 SourceLocation Loc, SourceRange Range, 10154 ODRTemplateDifference DiffType) { 10155 return Diag(Loc, diag::note_module_odr_violation_template_parameter) 10156 << SecondModule << Range << DiffType; 10157 }; 10158 10159 const NamedDecl* FirstDecl = cast<NamedDecl>(FirstIt->first); 10160 const NamedDecl* SecondDecl = cast<NamedDecl>(SecondIt->first); 10161 10162 assert(FirstDecl->getKind() == SecondDecl->getKind() && 10163 "Parameter Decl's should be the same kind."); 10164 10165 DeclarationName FirstName = FirstDecl->getDeclName(); 10166 DeclarationName SecondName = SecondDecl->getDeclName(); 10167 10168 if (FirstName != SecondName) { 10169 const bool FirstNameEmpty = 10170 FirstName.isIdentifier() && !FirstName.getAsIdentifierInfo(); 10171 const bool SecondNameEmpty = 10172 SecondName.isIdentifier() && !SecondName.getAsIdentifierInfo(); 10173 assert((!FirstNameEmpty || !SecondNameEmpty) && 10174 "Both template parameters cannot be unnamed."); 10175 ODRDiagTemplateError(FirstDecl->getLocation(), 10176 FirstDecl->getSourceRange(), 10177 FirstNameEmpty ? ParamEmptyName : ParamName) 10178 << FirstName; 10179 ODRDiagTemplateNote(SecondDecl->getLocation(), 10180 SecondDecl->getSourceRange(), 10181 SecondNameEmpty ? ParamEmptyName : ParamName) 10182 << SecondName; 10183 break; 10184 } 10185 10186 switch (FirstDecl->getKind()) { 10187 default: 10188 llvm_unreachable("Invalid template parameter type."); 10189 case Decl::TemplateTypeParm: { 10190 const auto *FirstParam = cast<TemplateTypeParmDecl>(FirstDecl); 10191 const auto *SecondParam = cast<TemplateTypeParmDecl>(SecondDecl); 10192 const bool HasFirstDefaultArgument = 10193 FirstParam->hasDefaultArgument() && 10194 !FirstParam->defaultArgumentWasInherited(); 10195 const bool HasSecondDefaultArgument = 10196 SecondParam->hasDefaultArgument() && 10197 !SecondParam->defaultArgumentWasInherited(); 10198 10199 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10200 ODRDiagTemplateError(FirstDecl->getLocation(), 10201 FirstDecl->getSourceRange(), 10202 ParamSingleDefaultArgument) 10203 << HasFirstDefaultArgument; 10204 ODRDiagTemplateNote(SecondDecl->getLocation(), 10205 SecondDecl->getSourceRange(), 10206 ParamSingleDefaultArgument) 10207 << HasSecondDefaultArgument; 10208 break; 10209 } 10210 10211 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10212 "Expecting default arguments."); 10213 10214 ODRDiagTemplateError(FirstDecl->getLocation(), 10215 FirstDecl->getSourceRange(), 10216 ParamDifferentDefaultArgument); 10217 ODRDiagTemplateNote(SecondDecl->getLocation(), 10218 SecondDecl->getSourceRange(), 10219 ParamDifferentDefaultArgument); 10220 10221 break; 10222 } 10223 case Decl::NonTypeTemplateParm: { 10224 const auto *FirstParam = cast<NonTypeTemplateParmDecl>(FirstDecl); 10225 const auto *SecondParam = cast<NonTypeTemplateParmDecl>(SecondDecl); 10226 const bool HasFirstDefaultArgument = 10227 FirstParam->hasDefaultArgument() && 10228 !FirstParam->defaultArgumentWasInherited(); 10229 const bool HasSecondDefaultArgument = 10230 SecondParam->hasDefaultArgument() && 10231 !SecondParam->defaultArgumentWasInherited(); 10232 10233 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10234 ODRDiagTemplateError(FirstDecl->getLocation(), 10235 FirstDecl->getSourceRange(), 10236 ParamSingleDefaultArgument) 10237 << HasFirstDefaultArgument; 10238 ODRDiagTemplateNote(SecondDecl->getLocation(), 10239 SecondDecl->getSourceRange(), 10240 ParamSingleDefaultArgument) 10241 << HasSecondDefaultArgument; 10242 break; 10243 } 10244 10245 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10246 "Expecting default arguments."); 10247 10248 ODRDiagTemplateError(FirstDecl->getLocation(), 10249 FirstDecl->getSourceRange(), 10250 ParamDifferentDefaultArgument); 10251 ODRDiagTemplateNote(SecondDecl->getLocation(), 10252 SecondDecl->getSourceRange(), 10253 ParamDifferentDefaultArgument); 10254 10255 break; 10256 } 10257 case Decl::TemplateTemplateParm: { 10258 const auto *FirstParam = cast<TemplateTemplateParmDecl>(FirstDecl); 10259 const auto *SecondParam = 10260 cast<TemplateTemplateParmDecl>(SecondDecl); 10261 const bool HasFirstDefaultArgument = 10262 FirstParam->hasDefaultArgument() && 10263 !FirstParam->defaultArgumentWasInherited(); 10264 const bool HasSecondDefaultArgument = 10265 SecondParam->hasDefaultArgument() && 10266 !SecondParam->defaultArgumentWasInherited(); 10267 10268 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10269 ODRDiagTemplateError(FirstDecl->getLocation(), 10270 FirstDecl->getSourceRange(), 10271 ParamSingleDefaultArgument) 10272 << HasFirstDefaultArgument; 10273 ODRDiagTemplateNote(SecondDecl->getLocation(), 10274 SecondDecl->getSourceRange(), 10275 ParamSingleDefaultArgument) 10276 << HasSecondDefaultArgument; 10277 break; 10278 } 10279 10280 assert(HasFirstDefaultArgument && HasSecondDefaultArgument && 10281 "Expecting default arguments."); 10282 10283 ODRDiagTemplateError(FirstDecl->getLocation(), 10284 FirstDecl->getSourceRange(), 10285 ParamDifferentDefaultArgument); 10286 ODRDiagTemplateNote(SecondDecl->getLocation(), 10287 SecondDecl->getSourceRange(), 10288 ParamDifferentDefaultArgument); 10289 10290 break; 10291 } 10292 } 10293 10294 break; 10295 } 10296 10297 if (FirstIt != FirstEnd) { 10298 Diagnosed = true; 10299 break; 10300 } 10301 } 10302 10303 DeclHashes FirstHashes; 10304 DeclHashes SecondHashes; 10305 const DeclContext *DC = FirstRecord; 10306 PopulateHashes(FirstHashes, FirstRecord, DC); 10307 PopulateHashes(SecondHashes, SecondRecord, DC); 10308 10309 auto DR = FindTypeDiffs(FirstHashes, SecondHashes); 10310 ODRMismatchDecl FirstDiffType = DR.FirstDiffType; 10311 ODRMismatchDecl SecondDiffType = DR.SecondDiffType; 10312 Decl *FirstDecl = DR.FirstDecl; 10313 Decl *SecondDecl = DR.SecondDecl; 10314 10315 if (FirstDiffType == Other || SecondDiffType == Other) { 10316 DiagnoseODRUnexpected(DR, FirstRecord, FirstModule, SecondRecord, 10317 SecondModule); 10318 Diagnosed = true; 10319 break; 10320 } 10321 10322 if (FirstDiffType != SecondDiffType) { 10323 DiagnoseODRMismatch(DR, FirstRecord, FirstModule, SecondRecord, 10324 SecondModule); 10325 Diagnosed = true; 10326 break; 10327 } 10328 10329 assert(FirstDiffType == SecondDiffType); 10330 10331 switch (FirstDiffType) { 10332 case Other: 10333 case EndOfClass: 10334 case PublicSpecifer: 10335 case PrivateSpecifer: 10336 case ProtectedSpecifer: 10337 llvm_unreachable("Invalid diff type"); 10338 10339 case StaticAssert: { 10340 StaticAssertDecl *FirstSA = cast<StaticAssertDecl>(FirstDecl); 10341 StaticAssertDecl *SecondSA = cast<StaticAssertDecl>(SecondDecl); 10342 10343 Expr *FirstExpr = FirstSA->getAssertExpr(); 10344 Expr *SecondExpr = SecondSA->getAssertExpr(); 10345 unsigned FirstODRHash = ComputeODRHash(FirstExpr); 10346 unsigned SecondODRHash = ComputeODRHash(SecondExpr); 10347 if (FirstODRHash != SecondODRHash) { 10348 ODRDiagDeclError(FirstRecord, FirstModule, FirstExpr->getBeginLoc(), 10349 FirstExpr->getSourceRange(), StaticAssertCondition); 10350 ODRDiagDeclNote(SecondModule, SecondExpr->getBeginLoc(), 10351 SecondExpr->getSourceRange(), StaticAssertCondition); 10352 Diagnosed = true; 10353 break; 10354 } 10355 10356 StringLiteral *FirstStr = FirstSA->getMessage(); 10357 StringLiteral *SecondStr = SecondSA->getMessage(); 10358 assert((FirstStr || SecondStr) && "Both messages cannot be empty"); 10359 if ((FirstStr && !SecondStr) || (!FirstStr && SecondStr)) { 10360 SourceLocation FirstLoc, SecondLoc; 10361 SourceRange FirstRange, SecondRange; 10362 if (FirstStr) { 10363 FirstLoc = FirstStr->getBeginLoc(); 10364 FirstRange = FirstStr->getSourceRange(); 10365 } else { 10366 FirstLoc = FirstSA->getBeginLoc(); 10367 FirstRange = FirstSA->getSourceRange(); 10368 } 10369 if (SecondStr) { 10370 SecondLoc = SecondStr->getBeginLoc(); 10371 SecondRange = SecondStr->getSourceRange(); 10372 } else { 10373 SecondLoc = SecondSA->getBeginLoc(); 10374 SecondRange = SecondSA->getSourceRange(); 10375 } 10376 ODRDiagDeclError(FirstRecord, FirstModule, FirstLoc, FirstRange, 10377 StaticAssertOnlyMessage) 10378 << (FirstStr == nullptr); 10379 ODRDiagDeclNote(SecondModule, SecondLoc, SecondRange, 10380 StaticAssertOnlyMessage) 10381 << (SecondStr == nullptr); 10382 Diagnosed = true; 10383 break; 10384 } 10385 10386 if (FirstStr && SecondStr && 10387 FirstStr->getString() != SecondStr->getString()) { 10388 ODRDiagDeclError(FirstRecord, FirstModule, FirstStr->getBeginLoc(), 10389 FirstStr->getSourceRange(), StaticAssertMessage); 10390 ODRDiagDeclNote(SecondModule, SecondStr->getBeginLoc(), 10391 SecondStr->getSourceRange(), StaticAssertMessage); 10392 Diagnosed = true; 10393 break; 10394 } 10395 break; 10396 } 10397 case Field: { 10398 Diagnosed = ODRDiagField(FirstRecord, FirstModule, SecondModule, 10399 cast<FieldDecl>(FirstDecl), 10400 cast<FieldDecl>(SecondDecl)); 10401 break; 10402 } 10403 case CXXMethod: { 10404 enum { 10405 DiagMethod, 10406 DiagConstructor, 10407 DiagDestructor, 10408 } FirstMethodType, 10409 SecondMethodType; 10410 auto GetMethodTypeForDiagnostics = [](const CXXMethodDecl* D) { 10411 if (isa<CXXConstructorDecl>(D)) return DiagConstructor; 10412 if (isa<CXXDestructorDecl>(D)) return DiagDestructor; 10413 return DiagMethod; 10414 }; 10415 const CXXMethodDecl *FirstMethod = cast<CXXMethodDecl>(FirstDecl); 10416 const CXXMethodDecl *SecondMethod = cast<CXXMethodDecl>(SecondDecl); 10417 FirstMethodType = GetMethodTypeForDiagnostics(FirstMethod); 10418 SecondMethodType = GetMethodTypeForDiagnostics(SecondMethod); 10419 auto FirstName = FirstMethod->getDeclName(); 10420 auto SecondName = SecondMethod->getDeclName(); 10421 if (FirstMethodType != SecondMethodType || FirstName != SecondName) { 10422 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10423 FirstMethod->getSourceRange(), MethodName) 10424 << FirstMethodType << FirstName; 10425 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10426 SecondMethod->getSourceRange(), MethodName) 10427 << SecondMethodType << SecondName; 10428 10429 Diagnosed = true; 10430 break; 10431 } 10432 10433 const bool FirstDeleted = FirstMethod->isDeletedAsWritten(); 10434 const bool SecondDeleted = SecondMethod->isDeletedAsWritten(); 10435 if (FirstDeleted != SecondDeleted) { 10436 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10437 FirstMethod->getSourceRange(), MethodDeleted) 10438 << FirstMethodType << FirstName << FirstDeleted; 10439 10440 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10441 SecondMethod->getSourceRange(), MethodDeleted) 10442 << SecondMethodType << SecondName << SecondDeleted; 10443 Diagnosed = true; 10444 break; 10445 } 10446 10447 const bool FirstDefaulted = FirstMethod->isExplicitlyDefaulted(); 10448 const bool SecondDefaulted = SecondMethod->isExplicitlyDefaulted(); 10449 if (FirstDefaulted != SecondDefaulted) { 10450 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10451 FirstMethod->getSourceRange(), MethodDefaulted) 10452 << FirstMethodType << FirstName << FirstDefaulted; 10453 10454 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10455 SecondMethod->getSourceRange(), MethodDefaulted) 10456 << SecondMethodType << SecondName << SecondDefaulted; 10457 Diagnosed = true; 10458 break; 10459 } 10460 10461 const bool FirstVirtual = FirstMethod->isVirtualAsWritten(); 10462 const bool SecondVirtual = SecondMethod->isVirtualAsWritten(); 10463 const bool FirstPure = FirstMethod->isPure(); 10464 const bool SecondPure = SecondMethod->isPure(); 10465 if ((FirstVirtual || SecondVirtual) && 10466 (FirstVirtual != SecondVirtual || FirstPure != SecondPure)) { 10467 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10468 FirstMethod->getSourceRange(), MethodVirtual) 10469 << FirstMethodType << FirstName << FirstPure << FirstVirtual; 10470 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10471 SecondMethod->getSourceRange(), MethodVirtual) 10472 << SecondMethodType << SecondName << SecondPure << SecondVirtual; 10473 Diagnosed = true; 10474 break; 10475 } 10476 10477 // CXXMethodDecl::isStatic uses the canonical Decl. With Decl merging, 10478 // FirstDecl is the canonical Decl of SecondDecl, so the storage 10479 // class needs to be checked instead. 10480 const auto FirstStorage = FirstMethod->getStorageClass(); 10481 const auto SecondStorage = SecondMethod->getStorageClass(); 10482 const bool FirstStatic = FirstStorage == SC_Static; 10483 const bool SecondStatic = SecondStorage == SC_Static; 10484 if (FirstStatic != SecondStatic) { 10485 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10486 FirstMethod->getSourceRange(), MethodStatic) 10487 << FirstMethodType << FirstName << FirstStatic; 10488 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10489 SecondMethod->getSourceRange(), MethodStatic) 10490 << SecondMethodType << SecondName << SecondStatic; 10491 Diagnosed = true; 10492 break; 10493 } 10494 10495 const bool FirstVolatile = FirstMethod->isVolatile(); 10496 const bool SecondVolatile = SecondMethod->isVolatile(); 10497 if (FirstVolatile != SecondVolatile) { 10498 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10499 FirstMethod->getSourceRange(), MethodVolatile) 10500 << FirstMethodType << FirstName << FirstVolatile; 10501 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10502 SecondMethod->getSourceRange(), MethodVolatile) 10503 << SecondMethodType << SecondName << SecondVolatile; 10504 Diagnosed = true; 10505 break; 10506 } 10507 10508 const bool FirstConst = FirstMethod->isConst(); 10509 const bool SecondConst = SecondMethod->isConst(); 10510 if (FirstConst != SecondConst) { 10511 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10512 FirstMethod->getSourceRange(), MethodConst) 10513 << FirstMethodType << FirstName << FirstConst; 10514 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10515 SecondMethod->getSourceRange(), MethodConst) 10516 << SecondMethodType << SecondName << SecondConst; 10517 Diagnosed = true; 10518 break; 10519 } 10520 10521 const bool FirstInline = FirstMethod->isInlineSpecified(); 10522 const bool SecondInline = SecondMethod->isInlineSpecified(); 10523 if (FirstInline != SecondInline) { 10524 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10525 FirstMethod->getSourceRange(), MethodInline) 10526 << FirstMethodType << FirstName << FirstInline; 10527 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10528 SecondMethod->getSourceRange(), MethodInline) 10529 << SecondMethodType << SecondName << SecondInline; 10530 Diagnosed = true; 10531 break; 10532 } 10533 10534 const unsigned FirstNumParameters = FirstMethod->param_size(); 10535 const unsigned SecondNumParameters = SecondMethod->param_size(); 10536 if (FirstNumParameters != SecondNumParameters) { 10537 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10538 FirstMethod->getSourceRange(), 10539 MethodNumberParameters) 10540 << FirstMethodType << FirstName << FirstNumParameters; 10541 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10542 SecondMethod->getSourceRange(), 10543 MethodNumberParameters) 10544 << SecondMethodType << SecondName << SecondNumParameters; 10545 Diagnosed = true; 10546 break; 10547 } 10548 10549 // Need this status boolean to know when break out of the switch. 10550 bool ParameterMismatch = false; 10551 for (unsigned I = 0; I < FirstNumParameters; ++I) { 10552 const ParmVarDecl *FirstParam = FirstMethod->getParamDecl(I); 10553 const ParmVarDecl *SecondParam = SecondMethod->getParamDecl(I); 10554 10555 QualType FirstParamType = FirstParam->getType(); 10556 QualType SecondParamType = SecondParam->getType(); 10557 if (FirstParamType != SecondParamType && 10558 ComputeQualTypeODRHash(FirstParamType) != 10559 ComputeQualTypeODRHash(SecondParamType)) { 10560 if (const DecayedType *ParamDecayedType = 10561 FirstParamType->getAs<DecayedType>()) { 10562 ODRDiagDeclError( 10563 FirstRecord, FirstModule, FirstMethod->getLocation(), 10564 FirstMethod->getSourceRange(), MethodParameterType) 10565 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10566 << true << ParamDecayedType->getOriginalType(); 10567 } else { 10568 ODRDiagDeclError( 10569 FirstRecord, FirstModule, FirstMethod->getLocation(), 10570 FirstMethod->getSourceRange(), MethodParameterType) 10571 << FirstMethodType << FirstName << (I + 1) << FirstParamType 10572 << false; 10573 } 10574 10575 if (const DecayedType *ParamDecayedType = 10576 SecondParamType->getAs<DecayedType>()) { 10577 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10578 SecondMethod->getSourceRange(), 10579 MethodParameterType) 10580 << SecondMethodType << SecondName << (I + 1) 10581 << SecondParamType << true 10582 << ParamDecayedType->getOriginalType(); 10583 } else { 10584 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10585 SecondMethod->getSourceRange(), 10586 MethodParameterType) 10587 << SecondMethodType << SecondName << (I + 1) 10588 << SecondParamType << false; 10589 } 10590 ParameterMismatch = true; 10591 break; 10592 } 10593 10594 DeclarationName FirstParamName = FirstParam->getDeclName(); 10595 DeclarationName SecondParamName = SecondParam->getDeclName(); 10596 if (FirstParamName != SecondParamName) { 10597 ODRDiagDeclError(FirstRecord, FirstModule, 10598 FirstMethod->getLocation(), 10599 FirstMethod->getSourceRange(), MethodParameterName) 10600 << FirstMethodType << FirstName << (I + 1) << FirstParamName; 10601 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10602 SecondMethod->getSourceRange(), MethodParameterName) 10603 << SecondMethodType << SecondName << (I + 1) << SecondParamName; 10604 ParameterMismatch = true; 10605 break; 10606 } 10607 10608 const Expr *FirstInit = FirstParam->getInit(); 10609 const Expr *SecondInit = SecondParam->getInit(); 10610 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 10611 ODRDiagDeclError(FirstRecord, FirstModule, 10612 FirstMethod->getLocation(), 10613 FirstMethod->getSourceRange(), 10614 MethodParameterSingleDefaultArgument) 10615 << FirstMethodType << FirstName << (I + 1) 10616 << (FirstInit == nullptr) 10617 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 10618 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10619 SecondMethod->getSourceRange(), 10620 MethodParameterSingleDefaultArgument) 10621 << SecondMethodType << SecondName << (I + 1) 10622 << (SecondInit == nullptr) 10623 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 10624 ParameterMismatch = true; 10625 break; 10626 } 10627 10628 if (FirstInit && SecondInit && 10629 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 10630 ODRDiagDeclError(FirstRecord, FirstModule, 10631 FirstMethod->getLocation(), 10632 FirstMethod->getSourceRange(), 10633 MethodParameterDifferentDefaultArgument) 10634 << FirstMethodType << FirstName << (I + 1) 10635 << FirstInit->getSourceRange(); 10636 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10637 SecondMethod->getSourceRange(), 10638 MethodParameterDifferentDefaultArgument) 10639 << SecondMethodType << SecondName << (I + 1) 10640 << SecondInit->getSourceRange(); 10641 ParameterMismatch = true; 10642 break; 10643 10644 } 10645 } 10646 10647 if (ParameterMismatch) { 10648 Diagnosed = true; 10649 break; 10650 } 10651 10652 const auto *FirstTemplateArgs = 10653 FirstMethod->getTemplateSpecializationArgs(); 10654 const auto *SecondTemplateArgs = 10655 SecondMethod->getTemplateSpecializationArgs(); 10656 10657 if ((FirstTemplateArgs && !SecondTemplateArgs) || 10658 (!FirstTemplateArgs && SecondTemplateArgs)) { 10659 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10660 FirstMethod->getSourceRange(), 10661 MethodNoTemplateArguments) 10662 << FirstMethodType << FirstName << (FirstTemplateArgs != nullptr); 10663 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10664 SecondMethod->getSourceRange(), 10665 MethodNoTemplateArguments) 10666 << SecondMethodType << SecondName 10667 << (SecondTemplateArgs != nullptr); 10668 10669 Diagnosed = true; 10670 break; 10671 } 10672 10673 if (FirstTemplateArgs && SecondTemplateArgs) { 10674 // Remove pack expansions from argument list. 10675 auto ExpandTemplateArgumentList = 10676 [](const TemplateArgumentList *TAL) { 10677 llvm::SmallVector<const TemplateArgument *, 8> ExpandedList; 10678 for (const TemplateArgument &TA : TAL->asArray()) { 10679 if (TA.getKind() != TemplateArgument::Pack) { 10680 ExpandedList.push_back(&TA); 10681 continue; 10682 } 10683 for (const TemplateArgument &PackTA : TA.getPackAsArray()) { 10684 ExpandedList.push_back(&PackTA); 10685 } 10686 } 10687 return ExpandedList; 10688 }; 10689 llvm::SmallVector<const TemplateArgument *, 8> FirstExpandedList = 10690 ExpandTemplateArgumentList(FirstTemplateArgs); 10691 llvm::SmallVector<const TemplateArgument *, 8> SecondExpandedList = 10692 ExpandTemplateArgumentList(SecondTemplateArgs); 10693 10694 if (FirstExpandedList.size() != SecondExpandedList.size()) { 10695 ODRDiagDeclError(FirstRecord, FirstModule, 10696 FirstMethod->getLocation(), 10697 FirstMethod->getSourceRange(), 10698 MethodDifferentNumberTemplateArguments) 10699 << FirstMethodType << FirstName 10700 << (unsigned)FirstExpandedList.size(); 10701 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10702 SecondMethod->getSourceRange(), 10703 MethodDifferentNumberTemplateArguments) 10704 << SecondMethodType << SecondName 10705 << (unsigned)SecondExpandedList.size(); 10706 10707 Diagnosed = true; 10708 break; 10709 } 10710 10711 bool TemplateArgumentMismatch = false; 10712 for (unsigned i = 0, e = FirstExpandedList.size(); i != e; ++i) { 10713 const TemplateArgument &FirstTA = *FirstExpandedList[i], 10714 &SecondTA = *SecondExpandedList[i]; 10715 if (ComputeTemplateArgumentODRHash(FirstTA) == 10716 ComputeTemplateArgumentODRHash(SecondTA)) { 10717 continue; 10718 } 10719 10720 ODRDiagDeclError( 10721 FirstRecord, FirstModule, FirstMethod->getLocation(), 10722 FirstMethod->getSourceRange(), MethodDifferentTemplateArgument) 10723 << FirstMethodType << FirstName << FirstTA << i + 1; 10724 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10725 SecondMethod->getSourceRange(), 10726 MethodDifferentTemplateArgument) 10727 << SecondMethodType << SecondName << SecondTA << i + 1; 10728 10729 TemplateArgumentMismatch = true; 10730 break; 10731 } 10732 10733 if (TemplateArgumentMismatch) { 10734 Diagnosed = true; 10735 break; 10736 } 10737 } 10738 10739 // Compute the hash of the method as if it has no body. 10740 auto ComputeCXXMethodODRHash = [&Hash](const CXXMethodDecl *D) { 10741 Hash.clear(); 10742 Hash.AddFunctionDecl(D, true /*SkipBody*/); 10743 return Hash.CalculateHash(); 10744 }; 10745 10746 // Compare the hash generated to the hash stored. A difference means 10747 // that a body was present in the original source. Due to merging, 10748 // the stardard way of detecting a body will not work. 10749 const bool HasFirstBody = 10750 ComputeCXXMethodODRHash(FirstMethod) != FirstMethod->getODRHash(); 10751 const bool HasSecondBody = 10752 ComputeCXXMethodODRHash(SecondMethod) != SecondMethod->getODRHash(); 10753 10754 if (HasFirstBody != HasSecondBody) { 10755 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10756 FirstMethod->getSourceRange(), MethodSingleBody) 10757 << FirstMethodType << FirstName << HasFirstBody; 10758 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10759 SecondMethod->getSourceRange(), MethodSingleBody) 10760 << SecondMethodType << SecondName << HasSecondBody; 10761 Diagnosed = true; 10762 break; 10763 } 10764 10765 if (HasFirstBody && HasSecondBody) { 10766 ODRDiagDeclError(FirstRecord, FirstModule, FirstMethod->getLocation(), 10767 FirstMethod->getSourceRange(), MethodDifferentBody) 10768 << FirstMethodType << FirstName; 10769 ODRDiagDeclNote(SecondModule, SecondMethod->getLocation(), 10770 SecondMethod->getSourceRange(), MethodDifferentBody) 10771 << SecondMethodType << SecondName; 10772 Diagnosed = true; 10773 break; 10774 } 10775 10776 break; 10777 } 10778 case TypeAlias: 10779 case TypeDef: { 10780 Diagnosed = ODRDiagTypeDefOrAlias( 10781 FirstRecord, FirstModule, SecondModule, 10782 cast<TypedefNameDecl>(FirstDecl), cast<TypedefNameDecl>(SecondDecl), 10783 FirstDiffType == TypeAlias); 10784 break; 10785 } 10786 case Var: { 10787 Diagnosed = 10788 ODRDiagVar(FirstRecord, FirstModule, SecondModule, 10789 cast<VarDecl>(FirstDecl), cast<VarDecl>(SecondDecl)); 10790 break; 10791 } 10792 case Friend: { 10793 FriendDecl *FirstFriend = cast<FriendDecl>(FirstDecl); 10794 FriendDecl *SecondFriend = cast<FriendDecl>(SecondDecl); 10795 10796 NamedDecl *FirstND = FirstFriend->getFriendDecl(); 10797 NamedDecl *SecondND = SecondFriend->getFriendDecl(); 10798 10799 TypeSourceInfo *FirstTSI = FirstFriend->getFriendType(); 10800 TypeSourceInfo *SecondTSI = SecondFriend->getFriendType(); 10801 10802 if (FirstND && SecondND) { 10803 ODRDiagDeclError(FirstRecord, FirstModule, 10804 FirstFriend->getFriendLoc(), 10805 FirstFriend->getSourceRange(), FriendFunction) 10806 << FirstND; 10807 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10808 SecondFriend->getSourceRange(), FriendFunction) 10809 << SecondND; 10810 10811 Diagnosed = true; 10812 break; 10813 } 10814 10815 if (FirstTSI && SecondTSI) { 10816 QualType FirstFriendType = FirstTSI->getType(); 10817 QualType SecondFriendType = SecondTSI->getType(); 10818 assert(ComputeQualTypeODRHash(FirstFriendType) != 10819 ComputeQualTypeODRHash(SecondFriendType)); 10820 ODRDiagDeclError(FirstRecord, FirstModule, 10821 FirstFriend->getFriendLoc(), 10822 FirstFriend->getSourceRange(), FriendType) 10823 << FirstFriendType; 10824 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10825 SecondFriend->getSourceRange(), FriendType) 10826 << SecondFriendType; 10827 Diagnosed = true; 10828 break; 10829 } 10830 10831 ODRDiagDeclError(FirstRecord, FirstModule, FirstFriend->getFriendLoc(), 10832 FirstFriend->getSourceRange(), FriendTypeFunction) 10833 << (FirstTSI == nullptr); 10834 ODRDiagDeclNote(SecondModule, SecondFriend->getFriendLoc(), 10835 SecondFriend->getSourceRange(), FriendTypeFunction) 10836 << (SecondTSI == nullptr); 10837 10838 Diagnosed = true; 10839 break; 10840 } 10841 case FunctionTemplate: { 10842 FunctionTemplateDecl *FirstTemplate = 10843 cast<FunctionTemplateDecl>(FirstDecl); 10844 FunctionTemplateDecl *SecondTemplate = 10845 cast<FunctionTemplateDecl>(SecondDecl); 10846 10847 TemplateParameterList *FirstTPL = 10848 FirstTemplate->getTemplateParameters(); 10849 TemplateParameterList *SecondTPL = 10850 SecondTemplate->getTemplateParameters(); 10851 10852 if (FirstTPL->size() != SecondTPL->size()) { 10853 ODRDiagDeclError(FirstRecord, FirstModule, 10854 FirstTemplate->getLocation(), 10855 FirstTemplate->getSourceRange(), 10856 FunctionTemplateDifferentNumberParameters) 10857 << FirstTemplate << FirstTPL->size(); 10858 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10859 SecondTemplate->getSourceRange(), 10860 FunctionTemplateDifferentNumberParameters) 10861 << SecondTemplate << SecondTPL->size(); 10862 10863 Diagnosed = true; 10864 break; 10865 } 10866 10867 bool ParameterMismatch = false; 10868 for (unsigned i = 0, e = FirstTPL->size(); i != e; ++i) { 10869 NamedDecl *FirstParam = FirstTPL->getParam(i); 10870 NamedDecl *SecondParam = SecondTPL->getParam(i); 10871 10872 if (FirstParam->getKind() != SecondParam->getKind()) { 10873 enum { 10874 TemplateTypeParameter, 10875 NonTypeTemplateParameter, 10876 TemplateTemplateParameter, 10877 }; 10878 auto GetParamType = [](NamedDecl *D) { 10879 switch (D->getKind()) { 10880 default: 10881 llvm_unreachable("Unexpected template parameter type"); 10882 case Decl::TemplateTypeParm: 10883 return TemplateTypeParameter; 10884 case Decl::NonTypeTemplateParm: 10885 return NonTypeTemplateParameter; 10886 case Decl::TemplateTemplateParm: 10887 return TemplateTemplateParameter; 10888 } 10889 }; 10890 10891 ODRDiagDeclError(FirstRecord, FirstModule, 10892 FirstTemplate->getLocation(), 10893 FirstTemplate->getSourceRange(), 10894 FunctionTemplateParameterDifferentKind) 10895 << FirstTemplate << (i + 1) << GetParamType(FirstParam); 10896 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10897 SecondTemplate->getSourceRange(), 10898 FunctionTemplateParameterDifferentKind) 10899 << SecondTemplate << (i + 1) << GetParamType(SecondParam); 10900 10901 ParameterMismatch = true; 10902 break; 10903 } 10904 10905 if (FirstParam->getName() != SecondParam->getName()) { 10906 ODRDiagDeclError( 10907 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10908 FirstTemplate->getSourceRange(), FunctionTemplateParameterName) 10909 << FirstTemplate << (i + 1) << (bool)FirstParam->getIdentifier() 10910 << FirstParam; 10911 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10912 SecondTemplate->getSourceRange(), 10913 FunctionTemplateParameterName) 10914 << SecondTemplate << (i + 1) 10915 << (bool)SecondParam->getIdentifier() << SecondParam; 10916 ParameterMismatch = true; 10917 break; 10918 } 10919 10920 if (isa<TemplateTypeParmDecl>(FirstParam) && 10921 isa<TemplateTypeParmDecl>(SecondParam)) { 10922 TemplateTypeParmDecl *FirstTTPD = 10923 cast<TemplateTypeParmDecl>(FirstParam); 10924 TemplateTypeParmDecl *SecondTTPD = 10925 cast<TemplateTypeParmDecl>(SecondParam); 10926 bool HasFirstDefaultArgument = 10927 FirstTTPD->hasDefaultArgument() && 10928 !FirstTTPD->defaultArgumentWasInherited(); 10929 bool HasSecondDefaultArgument = 10930 SecondTTPD->hasDefaultArgument() && 10931 !SecondTTPD->defaultArgumentWasInherited(); 10932 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 10933 ODRDiagDeclError(FirstRecord, FirstModule, 10934 FirstTemplate->getLocation(), 10935 FirstTemplate->getSourceRange(), 10936 FunctionTemplateParameterSingleDefaultArgument) 10937 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 10938 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10939 SecondTemplate->getSourceRange(), 10940 FunctionTemplateParameterSingleDefaultArgument) 10941 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 10942 ParameterMismatch = true; 10943 break; 10944 } 10945 10946 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 10947 QualType FirstType = FirstTTPD->getDefaultArgument(); 10948 QualType SecondType = SecondTTPD->getDefaultArgument(); 10949 if (ComputeQualTypeODRHash(FirstType) != 10950 ComputeQualTypeODRHash(SecondType)) { 10951 ODRDiagDeclError( 10952 FirstRecord, FirstModule, FirstTemplate->getLocation(), 10953 FirstTemplate->getSourceRange(), 10954 FunctionTemplateParameterDifferentDefaultArgument) 10955 << FirstTemplate << (i + 1) << FirstType; 10956 ODRDiagDeclNote( 10957 SecondModule, SecondTemplate->getLocation(), 10958 SecondTemplate->getSourceRange(), 10959 FunctionTemplateParameterDifferentDefaultArgument) 10960 << SecondTemplate << (i + 1) << SecondType; 10961 ParameterMismatch = true; 10962 break; 10963 } 10964 } 10965 10966 if (FirstTTPD->isParameterPack() != 10967 SecondTTPD->isParameterPack()) { 10968 ODRDiagDeclError(FirstRecord, FirstModule, 10969 FirstTemplate->getLocation(), 10970 FirstTemplate->getSourceRange(), 10971 FunctionTemplatePackParameter) 10972 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 10973 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 10974 SecondTemplate->getSourceRange(), 10975 FunctionTemplatePackParameter) 10976 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 10977 ParameterMismatch = true; 10978 break; 10979 } 10980 } 10981 10982 if (isa<TemplateTemplateParmDecl>(FirstParam) && 10983 isa<TemplateTemplateParmDecl>(SecondParam)) { 10984 TemplateTemplateParmDecl *FirstTTPD = 10985 cast<TemplateTemplateParmDecl>(FirstParam); 10986 TemplateTemplateParmDecl *SecondTTPD = 10987 cast<TemplateTemplateParmDecl>(SecondParam); 10988 10989 TemplateParameterList *FirstTPL = 10990 FirstTTPD->getTemplateParameters(); 10991 TemplateParameterList *SecondTPL = 10992 SecondTTPD->getTemplateParameters(); 10993 10994 if (ComputeTemplateParameterListODRHash(FirstTPL) != 10995 ComputeTemplateParameterListODRHash(SecondTPL)) { 10996 ODRDiagDeclError(FirstRecord, FirstModule, 10997 FirstTemplate->getLocation(), 10998 FirstTemplate->getSourceRange(), 10999 FunctionTemplateParameterDifferentType) 11000 << FirstTemplate << (i + 1); 11001 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11002 SecondTemplate->getSourceRange(), 11003 FunctionTemplateParameterDifferentType) 11004 << SecondTemplate << (i + 1); 11005 ParameterMismatch = true; 11006 break; 11007 } 11008 11009 bool HasFirstDefaultArgument = 11010 FirstTTPD->hasDefaultArgument() && 11011 !FirstTTPD->defaultArgumentWasInherited(); 11012 bool HasSecondDefaultArgument = 11013 SecondTTPD->hasDefaultArgument() && 11014 !SecondTTPD->defaultArgumentWasInherited(); 11015 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11016 ODRDiagDeclError(FirstRecord, FirstModule, 11017 FirstTemplate->getLocation(), 11018 FirstTemplate->getSourceRange(), 11019 FunctionTemplateParameterSingleDefaultArgument) 11020 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11021 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11022 SecondTemplate->getSourceRange(), 11023 FunctionTemplateParameterSingleDefaultArgument) 11024 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11025 ParameterMismatch = true; 11026 break; 11027 } 11028 11029 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11030 TemplateArgument FirstTA = 11031 FirstTTPD->getDefaultArgument().getArgument(); 11032 TemplateArgument SecondTA = 11033 SecondTTPD->getDefaultArgument().getArgument(); 11034 if (ComputeTemplateArgumentODRHash(FirstTA) != 11035 ComputeTemplateArgumentODRHash(SecondTA)) { 11036 ODRDiagDeclError( 11037 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11038 FirstTemplate->getSourceRange(), 11039 FunctionTemplateParameterDifferentDefaultArgument) 11040 << FirstTemplate << (i + 1) << FirstTA; 11041 ODRDiagDeclNote( 11042 SecondModule, SecondTemplate->getLocation(), 11043 SecondTemplate->getSourceRange(), 11044 FunctionTemplateParameterDifferentDefaultArgument) 11045 << SecondTemplate << (i + 1) << SecondTA; 11046 ParameterMismatch = true; 11047 break; 11048 } 11049 } 11050 11051 if (FirstTTPD->isParameterPack() != 11052 SecondTTPD->isParameterPack()) { 11053 ODRDiagDeclError(FirstRecord, FirstModule, 11054 FirstTemplate->getLocation(), 11055 FirstTemplate->getSourceRange(), 11056 FunctionTemplatePackParameter) 11057 << FirstTemplate << (i + 1) << FirstTTPD->isParameterPack(); 11058 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11059 SecondTemplate->getSourceRange(), 11060 FunctionTemplatePackParameter) 11061 << SecondTemplate << (i + 1) << SecondTTPD->isParameterPack(); 11062 ParameterMismatch = true; 11063 break; 11064 } 11065 } 11066 11067 if (isa<NonTypeTemplateParmDecl>(FirstParam) && 11068 isa<NonTypeTemplateParmDecl>(SecondParam)) { 11069 NonTypeTemplateParmDecl *FirstNTTPD = 11070 cast<NonTypeTemplateParmDecl>(FirstParam); 11071 NonTypeTemplateParmDecl *SecondNTTPD = 11072 cast<NonTypeTemplateParmDecl>(SecondParam); 11073 11074 QualType FirstType = FirstNTTPD->getType(); 11075 QualType SecondType = SecondNTTPD->getType(); 11076 if (ComputeQualTypeODRHash(FirstType) != 11077 ComputeQualTypeODRHash(SecondType)) { 11078 ODRDiagDeclError(FirstRecord, FirstModule, 11079 FirstTemplate->getLocation(), 11080 FirstTemplate->getSourceRange(), 11081 FunctionTemplateParameterDifferentType) 11082 << FirstTemplate << (i + 1); 11083 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11084 SecondTemplate->getSourceRange(), 11085 FunctionTemplateParameterDifferentType) 11086 << SecondTemplate << (i + 1); 11087 ParameterMismatch = true; 11088 break; 11089 } 11090 11091 bool HasFirstDefaultArgument = 11092 FirstNTTPD->hasDefaultArgument() && 11093 !FirstNTTPD->defaultArgumentWasInherited(); 11094 bool HasSecondDefaultArgument = 11095 SecondNTTPD->hasDefaultArgument() && 11096 !SecondNTTPD->defaultArgumentWasInherited(); 11097 if (HasFirstDefaultArgument != HasSecondDefaultArgument) { 11098 ODRDiagDeclError(FirstRecord, FirstModule, 11099 FirstTemplate->getLocation(), 11100 FirstTemplate->getSourceRange(), 11101 FunctionTemplateParameterSingleDefaultArgument) 11102 << FirstTemplate << (i + 1) << HasFirstDefaultArgument; 11103 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11104 SecondTemplate->getSourceRange(), 11105 FunctionTemplateParameterSingleDefaultArgument) 11106 << SecondTemplate << (i + 1) << HasSecondDefaultArgument; 11107 ParameterMismatch = true; 11108 break; 11109 } 11110 11111 if (HasFirstDefaultArgument && HasSecondDefaultArgument) { 11112 Expr *FirstDefaultArgument = FirstNTTPD->getDefaultArgument(); 11113 Expr *SecondDefaultArgument = SecondNTTPD->getDefaultArgument(); 11114 if (ComputeODRHash(FirstDefaultArgument) != 11115 ComputeODRHash(SecondDefaultArgument)) { 11116 ODRDiagDeclError( 11117 FirstRecord, FirstModule, FirstTemplate->getLocation(), 11118 FirstTemplate->getSourceRange(), 11119 FunctionTemplateParameterDifferentDefaultArgument) 11120 << FirstTemplate << (i + 1) << FirstDefaultArgument; 11121 ODRDiagDeclNote( 11122 SecondModule, SecondTemplate->getLocation(), 11123 SecondTemplate->getSourceRange(), 11124 FunctionTemplateParameterDifferentDefaultArgument) 11125 << SecondTemplate << (i + 1) << SecondDefaultArgument; 11126 ParameterMismatch = true; 11127 break; 11128 } 11129 } 11130 11131 if (FirstNTTPD->isParameterPack() != 11132 SecondNTTPD->isParameterPack()) { 11133 ODRDiagDeclError(FirstRecord, FirstModule, 11134 FirstTemplate->getLocation(), 11135 FirstTemplate->getSourceRange(), 11136 FunctionTemplatePackParameter) 11137 << FirstTemplate << (i + 1) << FirstNTTPD->isParameterPack(); 11138 ODRDiagDeclNote(SecondModule, SecondTemplate->getLocation(), 11139 SecondTemplate->getSourceRange(), 11140 FunctionTemplatePackParameter) 11141 << SecondTemplate << (i + 1) 11142 << SecondNTTPD->isParameterPack(); 11143 ParameterMismatch = true; 11144 break; 11145 } 11146 } 11147 } 11148 11149 if (ParameterMismatch) { 11150 Diagnosed = true; 11151 break; 11152 } 11153 11154 break; 11155 } 11156 } 11157 11158 if (Diagnosed) 11159 continue; 11160 11161 Diag(FirstDecl->getLocation(), 11162 diag::err_module_odr_violation_mismatch_decl_unknown) 11163 << FirstRecord << FirstModule.empty() << FirstModule << FirstDiffType 11164 << FirstDecl->getSourceRange(); 11165 Diag(SecondDecl->getLocation(), 11166 diag::note_module_odr_violation_mismatch_decl_unknown) 11167 << SecondModule << FirstDiffType << SecondDecl->getSourceRange(); 11168 Diagnosed = true; 11169 } 11170 11171 if (!Diagnosed) { 11172 // All definitions are updates to the same declaration. This happens if a 11173 // module instantiates the declaration of a class template specialization 11174 // and two or more other modules instantiate its definition. 11175 // 11176 // FIXME: Indicate which modules had instantiations of this definition. 11177 // FIXME: How can this even happen? 11178 Diag(Merge.first->getLocation(), 11179 diag::err_module_odr_violation_different_instantiations) 11180 << Merge.first; 11181 } 11182 } 11183 11184 // Issue ODR failures diagnostics for functions. 11185 for (auto &Merge : FunctionOdrMergeFailures) { 11186 enum ODRFunctionDifference { 11187 ReturnType, 11188 ParameterName, 11189 ParameterType, 11190 ParameterSingleDefaultArgument, 11191 ParameterDifferentDefaultArgument, 11192 FunctionBody, 11193 }; 11194 11195 FunctionDecl *FirstFunction = Merge.first; 11196 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstFunction); 11197 11198 bool Diagnosed = false; 11199 for (auto &SecondFunction : Merge.second) { 11200 11201 if (FirstFunction == SecondFunction) 11202 continue; 11203 11204 std::string SecondModule = 11205 getOwningModuleNameForDiagnostic(SecondFunction); 11206 11207 auto ODRDiagError = [FirstFunction, &FirstModule, 11208 this](SourceLocation Loc, SourceRange Range, 11209 ODRFunctionDifference DiffType) { 11210 return Diag(Loc, diag::err_module_odr_violation_function) 11211 << FirstFunction << FirstModule.empty() << FirstModule << Range 11212 << DiffType; 11213 }; 11214 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11215 SourceRange Range, 11216 ODRFunctionDifference DiffType) { 11217 return Diag(Loc, diag::note_module_odr_violation_function) 11218 << SecondModule << Range << DiffType; 11219 }; 11220 11221 if (ComputeQualTypeODRHash(FirstFunction->getReturnType()) != 11222 ComputeQualTypeODRHash(SecondFunction->getReturnType())) { 11223 ODRDiagError(FirstFunction->getReturnTypeSourceRange().getBegin(), 11224 FirstFunction->getReturnTypeSourceRange(), ReturnType) 11225 << FirstFunction->getReturnType(); 11226 ODRDiagNote(SecondFunction->getReturnTypeSourceRange().getBegin(), 11227 SecondFunction->getReturnTypeSourceRange(), ReturnType) 11228 << SecondFunction->getReturnType(); 11229 Diagnosed = true; 11230 break; 11231 } 11232 11233 assert(FirstFunction->param_size() == SecondFunction->param_size() && 11234 "Merged functions with different number of parameters"); 11235 11236 auto ParamSize = FirstFunction->param_size(); 11237 bool ParameterMismatch = false; 11238 for (unsigned I = 0; I < ParamSize; ++I) { 11239 auto *FirstParam = FirstFunction->getParamDecl(I); 11240 auto *SecondParam = SecondFunction->getParamDecl(I); 11241 11242 assert(getContext().hasSameType(FirstParam->getType(), 11243 SecondParam->getType()) && 11244 "Merged function has different parameter types."); 11245 11246 if (FirstParam->getDeclName() != SecondParam->getDeclName()) { 11247 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11248 ParameterName) 11249 << I + 1 << FirstParam->getDeclName(); 11250 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11251 ParameterName) 11252 << I + 1 << SecondParam->getDeclName(); 11253 ParameterMismatch = true; 11254 break; 11255 }; 11256 11257 QualType FirstParamType = FirstParam->getType(); 11258 QualType SecondParamType = SecondParam->getType(); 11259 if (FirstParamType != SecondParamType && 11260 ComputeQualTypeODRHash(FirstParamType) != 11261 ComputeQualTypeODRHash(SecondParamType)) { 11262 if (const DecayedType *ParamDecayedType = 11263 FirstParamType->getAs<DecayedType>()) { 11264 ODRDiagError(FirstParam->getLocation(), 11265 FirstParam->getSourceRange(), ParameterType) 11266 << (I + 1) << FirstParamType << true 11267 << ParamDecayedType->getOriginalType(); 11268 } else { 11269 ODRDiagError(FirstParam->getLocation(), 11270 FirstParam->getSourceRange(), ParameterType) 11271 << (I + 1) << FirstParamType << false; 11272 } 11273 11274 if (const DecayedType *ParamDecayedType = 11275 SecondParamType->getAs<DecayedType>()) { 11276 ODRDiagNote(SecondParam->getLocation(), 11277 SecondParam->getSourceRange(), ParameterType) 11278 << (I + 1) << SecondParamType << true 11279 << ParamDecayedType->getOriginalType(); 11280 } else { 11281 ODRDiagNote(SecondParam->getLocation(), 11282 SecondParam->getSourceRange(), ParameterType) 11283 << (I + 1) << SecondParamType << false; 11284 } 11285 ParameterMismatch = true; 11286 break; 11287 } 11288 11289 const Expr *FirstInit = FirstParam->getInit(); 11290 const Expr *SecondInit = SecondParam->getInit(); 11291 if ((FirstInit == nullptr) != (SecondInit == nullptr)) { 11292 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11293 ParameterSingleDefaultArgument) 11294 << (I + 1) << (FirstInit == nullptr) 11295 << (FirstInit ? FirstInit->getSourceRange() : SourceRange()); 11296 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11297 ParameterSingleDefaultArgument) 11298 << (I + 1) << (SecondInit == nullptr) 11299 << (SecondInit ? SecondInit->getSourceRange() : SourceRange()); 11300 ParameterMismatch = true; 11301 break; 11302 } 11303 11304 if (FirstInit && SecondInit && 11305 ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11306 ODRDiagError(FirstParam->getLocation(), FirstParam->getSourceRange(), 11307 ParameterDifferentDefaultArgument) 11308 << (I + 1) << FirstInit->getSourceRange(); 11309 ODRDiagNote(SecondParam->getLocation(), SecondParam->getSourceRange(), 11310 ParameterDifferentDefaultArgument) 11311 << (I + 1) << SecondInit->getSourceRange(); 11312 ParameterMismatch = true; 11313 break; 11314 } 11315 11316 assert(ComputeSubDeclODRHash(FirstParam) == 11317 ComputeSubDeclODRHash(SecondParam) && 11318 "Undiagnosed parameter difference."); 11319 } 11320 11321 if (ParameterMismatch) { 11322 Diagnosed = true; 11323 break; 11324 } 11325 11326 // If no error has been generated before now, assume the problem is in 11327 // the body and generate a message. 11328 ODRDiagError(FirstFunction->getLocation(), 11329 FirstFunction->getSourceRange(), FunctionBody); 11330 ODRDiagNote(SecondFunction->getLocation(), 11331 SecondFunction->getSourceRange(), FunctionBody); 11332 Diagnosed = true; 11333 break; 11334 } 11335 (void)Diagnosed; 11336 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11337 } 11338 11339 // Issue ODR failures diagnostics for enums. 11340 for (auto &Merge : EnumOdrMergeFailures) { 11341 enum ODREnumDifference { 11342 SingleScopedEnum, 11343 EnumTagKeywordMismatch, 11344 SingleSpecifiedType, 11345 DifferentSpecifiedTypes, 11346 DifferentNumberEnumConstants, 11347 EnumConstantName, 11348 EnumConstantSingleInitilizer, 11349 EnumConstantDifferentInitilizer, 11350 }; 11351 11352 // If we've already pointed out a specific problem with this enum, don't 11353 // bother issuing a general "something's different" diagnostic. 11354 if (!DiagnosedOdrMergeFailures.insert(Merge.first).second) 11355 continue; 11356 11357 EnumDecl *FirstEnum = Merge.first; 11358 std::string FirstModule = getOwningModuleNameForDiagnostic(FirstEnum); 11359 11360 using DeclHashes = 11361 llvm::SmallVector<std::pair<EnumConstantDecl *, unsigned>, 4>; 11362 auto PopulateHashes = [&ComputeSubDeclODRHash, FirstEnum]( 11363 DeclHashes &Hashes, EnumDecl *Enum) { 11364 for (auto *D : Enum->decls()) { 11365 // Due to decl merging, the first EnumDecl is the parent of 11366 // Decls in both records. 11367 if (!ODRHash::isDeclToBeProcessed(D, FirstEnum)) 11368 continue; 11369 assert(isa<EnumConstantDecl>(D) && "Unexpected Decl kind"); 11370 Hashes.emplace_back(cast<EnumConstantDecl>(D), 11371 ComputeSubDeclODRHash(D)); 11372 } 11373 }; 11374 DeclHashes FirstHashes; 11375 PopulateHashes(FirstHashes, FirstEnum); 11376 bool Diagnosed = false; 11377 for (auto &SecondEnum : Merge.second) { 11378 11379 if (FirstEnum == SecondEnum) 11380 continue; 11381 11382 std::string SecondModule = 11383 getOwningModuleNameForDiagnostic(SecondEnum); 11384 11385 auto ODRDiagError = [FirstEnum, &FirstModule, 11386 this](SourceLocation Loc, SourceRange Range, 11387 ODREnumDifference DiffType) { 11388 return Diag(Loc, diag::err_module_odr_violation_enum) 11389 << FirstEnum << FirstModule.empty() << FirstModule << Range 11390 << DiffType; 11391 }; 11392 auto ODRDiagNote = [&SecondModule, this](SourceLocation Loc, 11393 SourceRange Range, 11394 ODREnumDifference DiffType) { 11395 return Diag(Loc, diag::note_module_odr_violation_enum) 11396 << SecondModule << Range << DiffType; 11397 }; 11398 11399 if (FirstEnum->isScoped() != SecondEnum->isScoped()) { 11400 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11401 SingleScopedEnum) 11402 << FirstEnum->isScoped(); 11403 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11404 SingleScopedEnum) 11405 << SecondEnum->isScoped(); 11406 Diagnosed = true; 11407 continue; 11408 } 11409 11410 if (FirstEnum->isScoped() && SecondEnum->isScoped()) { 11411 if (FirstEnum->isScopedUsingClassTag() != 11412 SecondEnum->isScopedUsingClassTag()) { 11413 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11414 EnumTagKeywordMismatch) 11415 << FirstEnum->isScopedUsingClassTag(); 11416 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11417 EnumTagKeywordMismatch) 11418 << SecondEnum->isScopedUsingClassTag(); 11419 Diagnosed = true; 11420 continue; 11421 } 11422 } 11423 11424 QualType FirstUnderlyingType = 11425 FirstEnum->getIntegerTypeSourceInfo() 11426 ? FirstEnum->getIntegerTypeSourceInfo()->getType() 11427 : QualType(); 11428 QualType SecondUnderlyingType = 11429 SecondEnum->getIntegerTypeSourceInfo() 11430 ? SecondEnum->getIntegerTypeSourceInfo()->getType() 11431 : QualType(); 11432 if (FirstUnderlyingType.isNull() != SecondUnderlyingType.isNull()) { 11433 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11434 SingleSpecifiedType) 11435 << !FirstUnderlyingType.isNull(); 11436 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11437 SingleSpecifiedType) 11438 << !SecondUnderlyingType.isNull(); 11439 Diagnosed = true; 11440 continue; 11441 } 11442 11443 if (!FirstUnderlyingType.isNull() && !SecondUnderlyingType.isNull()) { 11444 if (ComputeQualTypeODRHash(FirstUnderlyingType) != 11445 ComputeQualTypeODRHash(SecondUnderlyingType)) { 11446 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11447 DifferentSpecifiedTypes) 11448 << FirstUnderlyingType; 11449 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11450 DifferentSpecifiedTypes) 11451 << SecondUnderlyingType; 11452 Diagnosed = true; 11453 continue; 11454 } 11455 } 11456 11457 DeclHashes SecondHashes; 11458 PopulateHashes(SecondHashes, SecondEnum); 11459 11460 if (FirstHashes.size() != SecondHashes.size()) { 11461 ODRDiagError(FirstEnum->getLocation(), FirstEnum->getSourceRange(), 11462 DifferentNumberEnumConstants) 11463 << (int)FirstHashes.size(); 11464 ODRDiagNote(SecondEnum->getLocation(), SecondEnum->getSourceRange(), 11465 DifferentNumberEnumConstants) 11466 << (int)SecondHashes.size(); 11467 Diagnosed = true; 11468 continue; 11469 } 11470 11471 for (unsigned I = 0; I < FirstHashes.size(); ++I) { 11472 if (FirstHashes[I].second == SecondHashes[I].second) 11473 continue; 11474 const EnumConstantDecl *FirstEnumConstant = FirstHashes[I].first; 11475 const EnumConstantDecl *SecondEnumConstant = SecondHashes[I].first; 11476 11477 if (FirstEnumConstant->getDeclName() != 11478 SecondEnumConstant->getDeclName()) { 11479 11480 ODRDiagError(FirstEnumConstant->getLocation(), 11481 FirstEnumConstant->getSourceRange(), EnumConstantName) 11482 << I + 1 << FirstEnumConstant; 11483 ODRDiagNote(SecondEnumConstant->getLocation(), 11484 SecondEnumConstant->getSourceRange(), EnumConstantName) 11485 << I + 1 << SecondEnumConstant; 11486 Diagnosed = true; 11487 break; 11488 } 11489 11490 const Expr *FirstInit = FirstEnumConstant->getInitExpr(); 11491 const Expr *SecondInit = SecondEnumConstant->getInitExpr(); 11492 if (!FirstInit && !SecondInit) 11493 continue; 11494 11495 if (!FirstInit || !SecondInit) { 11496 ODRDiagError(FirstEnumConstant->getLocation(), 11497 FirstEnumConstant->getSourceRange(), 11498 EnumConstantSingleInitilizer) 11499 << I + 1 << FirstEnumConstant << (FirstInit != nullptr); 11500 ODRDiagNote(SecondEnumConstant->getLocation(), 11501 SecondEnumConstant->getSourceRange(), 11502 EnumConstantSingleInitilizer) 11503 << I + 1 << SecondEnumConstant << (SecondInit != nullptr); 11504 Diagnosed = true; 11505 break; 11506 } 11507 11508 if (ComputeODRHash(FirstInit) != ComputeODRHash(SecondInit)) { 11509 ODRDiagError(FirstEnumConstant->getLocation(), 11510 FirstEnumConstant->getSourceRange(), 11511 EnumConstantDifferentInitilizer) 11512 << I + 1 << FirstEnumConstant; 11513 ODRDiagNote(SecondEnumConstant->getLocation(), 11514 SecondEnumConstant->getSourceRange(), 11515 EnumConstantDifferentInitilizer) 11516 << I + 1 << SecondEnumConstant; 11517 Diagnosed = true; 11518 break; 11519 } 11520 } 11521 } 11522 11523 (void)Diagnosed; 11524 assert(Diagnosed && "Unable to emit ODR diagnostic."); 11525 } 11526 } 11527 11528 void ASTReader::StartedDeserializing() { 11529 if (++NumCurrentElementsDeserializing == 1 && ReadTimer.get()) 11530 ReadTimer->startTimer(); 11531 } 11532 11533 void ASTReader::FinishedDeserializing() { 11534 assert(NumCurrentElementsDeserializing && 11535 "FinishedDeserializing not paired with StartedDeserializing"); 11536 if (NumCurrentElementsDeserializing == 1) { 11537 // We decrease NumCurrentElementsDeserializing only after pending actions 11538 // are finished, to avoid recursively re-calling finishPendingActions(). 11539 finishPendingActions(); 11540 } 11541 --NumCurrentElementsDeserializing; 11542 11543 if (NumCurrentElementsDeserializing == 0) { 11544 // Propagate exception specification and deduced type updates along 11545 // redeclaration chains. 11546 // 11547 // We do this now rather than in finishPendingActions because we want to 11548 // be able to walk the complete redeclaration chains of the updated decls. 11549 while (!PendingExceptionSpecUpdates.empty() || 11550 !PendingDeducedTypeUpdates.empty()) { 11551 auto ESUpdates = std::move(PendingExceptionSpecUpdates); 11552 PendingExceptionSpecUpdates.clear(); 11553 for (auto Update : ESUpdates) { 11554 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11555 auto *FPT = Update.second->getType()->castAs<FunctionProtoType>(); 11556 auto ESI = FPT->getExtProtoInfo().ExceptionSpec; 11557 if (auto *Listener = getContext().getASTMutationListener()) 11558 Listener->ResolvedExceptionSpec(cast<FunctionDecl>(Update.second)); 11559 for (auto *Redecl : Update.second->redecls()) 11560 getContext().adjustExceptionSpec(cast<FunctionDecl>(Redecl), ESI); 11561 } 11562 11563 auto DTUpdates = std::move(PendingDeducedTypeUpdates); 11564 PendingDeducedTypeUpdates.clear(); 11565 for (auto Update : DTUpdates) { 11566 ProcessingUpdatesRAIIObj ProcessingUpdates(*this); 11567 // FIXME: If the return type is already deduced, check that it matches. 11568 getContext().adjustDeducedFunctionResultType(Update.first, 11569 Update.second); 11570 } 11571 } 11572 11573 if (ReadTimer) 11574 ReadTimer->stopTimer(); 11575 11576 diagnoseOdrViolations(); 11577 11578 // We are not in recursive loading, so it's safe to pass the "interesting" 11579 // decls to the consumer. 11580 if (Consumer) 11581 PassInterestingDeclsToConsumer(); 11582 } 11583 } 11584 11585 void ASTReader::pushExternalDeclIntoScope(NamedDecl *D, DeclarationName Name) { 11586 if (IdentifierInfo *II = Name.getAsIdentifierInfo()) { 11587 // Remove any fake results before adding any real ones. 11588 auto It = PendingFakeLookupResults.find(II); 11589 if (It != PendingFakeLookupResults.end()) { 11590 for (auto *ND : It->second) 11591 SemaObj->IdResolver.RemoveDecl(ND); 11592 // FIXME: this works around module+PCH performance issue. 11593 // Rather than erase the result from the map, which is O(n), just clear 11594 // the vector of NamedDecls. 11595 It->second.clear(); 11596 } 11597 } 11598 11599 if (SemaObj->IdResolver.tryAddTopLevelDecl(D, Name) && SemaObj->TUScope) { 11600 SemaObj->TUScope->AddDecl(D); 11601 } else if (SemaObj->TUScope) { 11602 // Adding the decl to IdResolver may have failed because it was already in 11603 // (even though it was not added in scope). If it is already in, make sure 11604 // it gets in the scope as well. 11605 if (std::find(SemaObj->IdResolver.begin(Name), 11606 SemaObj->IdResolver.end(), D) != SemaObj->IdResolver.end()) 11607 SemaObj->TUScope->AddDecl(D); 11608 } 11609 } 11610 11611 ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache, 11612 ASTContext *Context, 11613 const PCHContainerReader &PCHContainerRdr, 11614 ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions, 11615 StringRef isysroot, 11616 DisableValidationForModuleKind DisableValidationKind, 11617 bool AllowASTWithCompilerErrors, 11618 bool AllowConfigurationMismatch, bool ValidateSystemInputs, 11619 bool ValidateASTInputFilesContent, bool UseGlobalIndex, 11620 std::unique_ptr<llvm::Timer> ReadTimer) 11621 : Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH) 11622 ? cast<ASTReaderListener>(new SimpleASTReaderListener(PP)) 11623 : cast<ASTReaderListener>(new PCHValidator(PP, *this))), 11624 SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()), 11625 PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP), 11626 ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache, 11627 PCHContainerRdr, PP.getHeaderSearchInfo()), 11628 DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot), 11629 DisableValidationKind(DisableValidationKind), 11630 AllowASTWithCompilerErrors(AllowASTWithCompilerErrors), 11631 AllowConfigurationMismatch(AllowConfigurationMismatch), 11632 ValidateSystemInputs(ValidateSystemInputs), 11633 ValidateASTInputFilesContent(ValidateASTInputFilesContent), 11634 UseGlobalIndex(UseGlobalIndex), CurrSwitchCaseStmts(&SwitchCaseStmts) { 11635 SourceMgr.setExternalSLocEntrySource(this); 11636 11637 for (const auto &Ext : Extensions) { 11638 auto BlockName = Ext->getExtensionMetadata().BlockName; 11639 auto Known = ModuleFileExtensions.find(BlockName); 11640 if (Known != ModuleFileExtensions.end()) { 11641 Diags.Report(diag::warn_duplicate_module_file_extension) 11642 << BlockName; 11643 continue; 11644 } 11645 11646 ModuleFileExtensions.insert({BlockName, Ext}); 11647 } 11648 } 11649 11650 ASTReader::~ASTReader() { 11651 if (OwnsDeserializationListener) 11652 delete DeserializationListener; 11653 } 11654 11655 IdentifierResolver &ASTReader::getIdResolver() { 11656 return SemaObj ? SemaObj->IdResolver : DummyIdResolver; 11657 } 11658 11659 Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor, 11660 unsigned AbbrevID) { 11661 Idx = 0; 11662 Record.clear(); 11663 return Cursor.readRecord(AbbrevID, Record); 11664 } 11665 //===----------------------------------------------------------------------===// 11666 //// OMPClauseReader implementation 11667 ////===----------------------------------------------------------------------===// 11668 11669 // This has to be in namespace clang because it's friended by all 11670 // of the OMP clauses. 11671 namespace clang { 11672 11673 class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> { 11674 ASTRecordReader &Record; 11675 ASTContext &Context; 11676 11677 public: 11678 OMPClauseReader(ASTRecordReader &Record) 11679 : Record(Record), Context(Record.getContext()) {} 11680 #define GEN_CLANG_CLAUSE_CLASS 11681 #define CLAUSE_CLASS(Enum, Str, Class) void Visit##Class(Class *C); 11682 #include "llvm/Frontend/OpenMP/OMP.inc" 11683 OMPClause *readClause(); 11684 void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C); 11685 void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C); 11686 }; 11687 11688 } // end namespace clang 11689 11690 OMPClause *ASTRecordReader::readOMPClause() { 11691 return OMPClauseReader(*this).readClause(); 11692 } 11693 11694 OMPClause *OMPClauseReader::readClause() { 11695 OMPClause *C = nullptr; 11696 switch (llvm::omp::Clause(Record.readInt())) { 11697 case llvm::omp::OMPC_if: 11698 C = new (Context) OMPIfClause(); 11699 break; 11700 case llvm::omp::OMPC_final: 11701 C = new (Context) OMPFinalClause(); 11702 break; 11703 case llvm::omp::OMPC_num_threads: 11704 C = new (Context) OMPNumThreadsClause(); 11705 break; 11706 case llvm::omp::OMPC_safelen: 11707 C = new (Context) OMPSafelenClause(); 11708 break; 11709 case llvm::omp::OMPC_simdlen: 11710 C = new (Context) OMPSimdlenClause(); 11711 break; 11712 case llvm::omp::OMPC_sizes: { 11713 unsigned NumSizes = Record.readInt(); 11714 C = OMPSizesClause::CreateEmpty(Context, NumSizes); 11715 break; 11716 } 11717 case llvm::omp::OMPC_full: 11718 C = OMPFullClause::CreateEmpty(Context); 11719 break; 11720 case llvm::omp::OMPC_partial: 11721 C = OMPPartialClause::CreateEmpty(Context); 11722 break; 11723 case llvm::omp::OMPC_allocator: 11724 C = new (Context) OMPAllocatorClause(); 11725 break; 11726 case llvm::omp::OMPC_collapse: 11727 C = new (Context) OMPCollapseClause(); 11728 break; 11729 case llvm::omp::OMPC_default: 11730 C = new (Context) OMPDefaultClause(); 11731 break; 11732 case llvm::omp::OMPC_proc_bind: 11733 C = new (Context) OMPProcBindClause(); 11734 break; 11735 case llvm::omp::OMPC_schedule: 11736 C = new (Context) OMPScheduleClause(); 11737 break; 11738 case llvm::omp::OMPC_ordered: 11739 C = OMPOrderedClause::CreateEmpty(Context, Record.readInt()); 11740 break; 11741 case llvm::omp::OMPC_nowait: 11742 C = new (Context) OMPNowaitClause(); 11743 break; 11744 case llvm::omp::OMPC_untied: 11745 C = new (Context) OMPUntiedClause(); 11746 break; 11747 case llvm::omp::OMPC_mergeable: 11748 C = new (Context) OMPMergeableClause(); 11749 break; 11750 case llvm::omp::OMPC_read: 11751 C = new (Context) OMPReadClause(); 11752 break; 11753 case llvm::omp::OMPC_write: 11754 C = new (Context) OMPWriteClause(); 11755 break; 11756 case llvm::omp::OMPC_update: 11757 C = OMPUpdateClause::CreateEmpty(Context, Record.readInt()); 11758 break; 11759 case llvm::omp::OMPC_capture: 11760 C = new (Context) OMPCaptureClause(); 11761 break; 11762 case llvm::omp::OMPC_seq_cst: 11763 C = new (Context) OMPSeqCstClause(); 11764 break; 11765 case llvm::omp::OMPC_acq_rel: 11766 C = new (Context) OMPAcqRelClause(); 11767 break; 11768 case llvm::omp::OMPC_acquire: 11769 C = new (Context) OMPAcquireClause(); 11770 break; 11771 case llvm::omp::OMPC_release: 11772 C = new (Context) OMPReleaseClause(); 11773 break; 11774 case llvm::omp::OMPC_relaxed: 11775 C = new (Context) OMPRelaxedClause(); 11776 break; 11777 case llvm::omp::OMPC_threads: 11778 C = new (Context) OMPThreadsClause(); 11779 break; 11780 case llvm::omp::OMPC_simd: 11781 C = new (Context) OMPSIMDClause(); 11782 break; 11783 case llvm::omp::OMPC_nogroup: 11784 C = new (Context) OMPNogroupClause(); 11785 break; 11786 case llvm::omp::OMPC_unified_address: 11787 C = new (Context) OMPUnifiedAddressClause(); 11788 break; 11789 case llvm::omp::OMPC_unified_shared_memory: 11790 C = new (Context) OMPUnifiedSharedMemoryClause(); 11791 break; 11792 case llvm::omp::OMPC_reverse_offload: 11793 C = new (Context) OMPReverseOffloadClause(); 11794 break; 11795 case llvm::omp::OMPC_dynamic_allocators: 11796 C = new (Context) OMPDynamicAllocatorsClause(); 11797 break; 11798 case llvm::omp::OMPC_atomic_default_mem_order: 11799 C = new (Context) OMPAtomicDefaultMemOrderClause(); 11800 break; 11801 case llvm::omp::OMPC_private: 11802 C = OMPPrivateClause::CreateEmpty(Context, Record.readInt()); 11803 break; 11804 case llvm::omp::OMPC_firstprivate: 11805 C = OMPFirstprivateClause::CreateEmpty(Context, Record.readInt()); 11806 break; 11807 case llvm::omp::OMPC_lastprivate: 11808 C = OMPLastprivateClause::CreateEmpty(Context, Record.readInt()); 11809 break; 11810 case llvm::omp::OMPC_shared: 11811 C = OMPSharedClause::CreateEmpty(Context, Record.readInt()); 11812 break; 11813 case llvm::omp::OMPC_reduction: { 11814 unsigned N = Record.readInt(); 11815 auto Modifier = Record.readEnum<OpenMPReductionClauseModifier>(); 11816 C = OMPReductionClause::CreateEmpty(Context, N, Modifier); 11817 break; 11818 } 11819 case llvm::omp::OMPC_task_reduction: 11820 C = OMPTaskReductionClause::CreateEmpty(Context, Record.readInt()); 11821 break; 11822 case llvm::omp::OMPC_in_reduction: 11823 C = OMPInReductionClause::CreateEmpty(Context, Record.readInt()); 11824 break; 11825 case llvm::omp::OMPC_linear: 11826 C = OMPLinearClause::CreateEmpty(Context, Record.readInt()); 11827 break; 11828 case llvm::omp::OMPC_aligned: 11829 C = OMPAlignedClause::CreateEmpty(Context, Record.readInt()); 11830 break; 11831 case llvm::omp::OMPC_copyin: 11832 C = OMPCopyinClause::CreateEmpty(Context, Record.readInt()); 11833 break; 11834 case llvm::omp::OMPC_copyprivate: 11835 C = OMPCopyprivateClause::CreateEmpty(Context, Record.readInt()); 11836 break; 11837 case llvm::omp::OMPC_flush: 11838 C = OMPFlushClause::CreateEmpty(Context, Record.readInt()); 11839 break; 11840 case llvm::omp::OMPC_depobj: 11841 C = OMPDepobjClause::CreateEmpty(Context); 11842 break; 11843 case llvm::omp::OMPC_depend: { 11844 unsigned NumVars = Record.readInt(); 11845 unsigned NumLoops = Record.readInt(); 11846 C = OMPDependClause::CreateEmpty(Context, NumVars, NumLoops); 11847 break; 11848 } 11849 case llvm::omp::OMPC_device: 11850 C = new (Context) OMPDeviceClause(); 11851 break; 11852 case llvm::omp::OMPC_map: { 11853 OMPMappableExprListSizeTy Sizes; 11854 Sizes.NumVars = Record.readInt(); 11855 Sizes.NumUniqueDeclarations = Record.readInt(); 11856 Sizes.NumComponentLists = Record.readInt(); 11857 Sizes.NumComponents = Record.readInt(); 11858 C = OMPMapClause::CreateEmpty(Context, Sizes); 11859 break; 11860 } 11861 case llvm::omp::OMPC_num_teams: 11862 C = new (Context) OMPNumTeamsClause(); 11863 break; 11864 case llvm::omp::OMPC_thread_limit: 11865 C = new (Context) OMPThreadLimitClause(); 11866 break; 11867 case llvm::omp::OMPC_priority: 11868 C = new (Context) OMPPriorityClause(); 11869 break; 11870 case llvm::omp::OMPC_grainsize: 11871 C = new (Context) OMPGrainsizeClause(); 11872 break; 11873 case llvm::omp::OMPC_num_tasks: 11874 C = new (Context) OMPNumTasksClause(); 11875 break; 11876 case llvm::omp::OMPC_hint: 11877 C = new (Context) OMPHintClause(); 11878 break; 11879 case llvm::omp::OMPC_dist_schedule: 11880 C = new (Context) OMPDistScheduleClause(); 11881 break; 11882 case llvm::omp::OMPC_defaultmap: 11883 C = new (Context) OMPDefaultmapClause(); 11884 break; 11885 case llvm::omp::OMPC_to: { 11886 OMPMappableExprListSizeTy Sizes; 11887 Sizes.NumVars = Record.readInt(); 11888 Sizes.NumUniqueDeclarations = Record.readInt(); 11889 Sizes.NumComponentLists = Record.readInt(); 11890 Sizes.NumComponents = Record.readInt(); 11891 C = OMPToClause::CreateEmpty(Context, Sizes); 11892 break; 11893 } 11894 case llvm::omp::OMPC_from: { 11895 OMPMappableExprListSizeTy Sizes; 11896 Sizes.NumVars = Record.readInt(); 11897 Sizes.NumUniqueDeclarations = Record.readInt(); 11898 Sizes.NumComponentLists = Record.readInt(); 11899 Sizes.NumComponents = Record.readInt(); 11900 C = OMPFromClause::CreateEmpty(Context, Sizes); 11901 break; 11902 } 11903 case llvm::omp::OMPC_use_device_ptr: { 11904 OMPMappableExprListSizeTy Sizes; 11905 Sizes.NumVars = Record.readInt(); 11906 Sizes.NumUniqueDeclarations = Record.readInt(); 11907 Sizes.NumComponentLists = Record.readInt(); 11908 Sizes.NumComponents = Record.readInt(); 11909 C = OMPUseDevicePtrClause::CreateEmpty(Context, Sizes); 11910 break; 11911 } 11912 case llvm::omp::OMPC_use_device_addr: { 11913 OMPMappableExprListSizeTy Sizes; 11914 Sizes.NumVars = Record.readInt(); 11915 Sizes.NumUniqueDeclarations = Record.readInt(); 11916 Sizes.NumComponentLists = Record.readInt(); 11917 Sizes.NumComponents = Record.readInt(); 11918 C = OMPUseDeviceAddrClause::CreateEmpty(Context, Sizes); 11919 break; 11920 } 11921 case llvm::omp::OMPC_is_device_ptr: { 11922 OMPMappableExprListSizeTy Sizes; 11923 Sizes.NumVars = Record.readInt(); 11924 Sizes.NumUniqueDeclarations = Record.readInt(); 11925 Sizes.NumComponentLists = Record.readInt(); 11926 Sizes.NumComponents = Record.readInt(); 11927 C = OMPIsDevicePtrClause::CreateEmpty(Context, Sizes); 11928 break; 11929 } 11930 case llvm::omp::OMPC_allocate: 11931 C = OMPAllocateClause::CreateEmpty(Context, Record.readInt()); 11932 break; 11933 case llvm::omp::OMPC_nontemporal: 11934 C = OMPNontemporalClause::CreateEmpty(Context, Record.readInt()); 11935 break; 11936 case llvm::omp::OMPC_inclusive: 11937 C = OMPInclusiveClause::CreateEmpty(Context, Record.readInt()); 11938 break; 11939 case llvm::omp::OMPC_exclusive: 11940 C = OMPExclusiveClause::CreateEmpty(Context, Record.readInt()); 11941 break; 11942 case llvm::omp::OMPC_order: 11943 C = new (Context) OMPOrderClause(); 11944 break; 11945 case llvm::omp::OMPC_init: 11946 C = OMPInitClause::CreateEmpty(Context, Record.readInt()); 11947 break; 11948 case llvm::omp::OMPC_use: 11949 C = new (Context) OMPUseClause(); 11950 break; 11951 case llvm::omp::OMPC_destroy: 11952 C = new (Context) OMPDestroyClause(); 11953 break; 11954 case llvm::omp::OMPC_novariants: 11955 C = new (Context) OMPNovariantsClause(); 11956 break; 11957 case llvm::omp::OMPC_nocontext: 11958 C = new (Context) OMPNocontextClause(); 11959 break; 11960 case llvm::omp::OMPC_detach: 11961 C = new (Context) OMPDetachClause(); 11962 break; 11963 case llvm::omp::OMPC_uses_allocators: 11964 C = OMPUsesAllocatorsClause::CreateEmpty(Context, Record.readInt()); 11965 break; 11966 case llvm::omp::OMPC_affinity: 11967 C = OMPAffinityClause::CreateEmpty(Context, Record.readInt()); 11968 break; 11969 case llvm::omp::OMPC_filter: 11970 C = new (Context) OMPFilterClause(); 11971 break; 11972 #define OMP_CLAUSE_NO_CLASS(Enum, Str) \ 11973 case llvm::omp::Enum: \ 11974 break; 11975 #include "llvm/Frontend/OpenMP/OMPKinds.def" 11976 default: 11977 break; 11978 } 11979 assert(C && "Unknown OMPClause type"); 11980 11981 Visit(C); 11982 C->setLocStart(Record.readSourceLocation()); 11983 C->setLocEnd(Record.readSourceLocation()); 11984 11985 return C; 11986 } 11987 11988 void OMPClauseReader::VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C) { 11989 C->setPreInitStmt(Record.readSubStmt(), 11990 static_cast<OpenMPDirectiveKind>(Record.readInt())); 11991 } 11992 11993 void OMPClauseReader::VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C) { 11994 VisitOMPClauseWithPreInit(C); 11995 C->setPostUpdateExpr(Record.readSubExpr()); 11996 } 11997 11998 void OMPClauseReader::VisitOMPIfClause(OMPIfClause *C) { 11999 VisitOMPClauseWithPreInit(C); 12000 C->setNameModifier(static_cast<OpenMPDirectiveKind>(Record.readInt())); 12001 C->setNameModifierLoc(Record.readSourceLocation()); 12002 C->setColonLoc(Record.readSourceLocation()); 12003 C->setCondition(Record.readSubExpr()); 12004 C->setLParenLoc(Record.readSourceLocation()); 12005 } 12006 12007 void OMPClauseReader::VisitOMPFinalClause(OMPFinalClause *C) { 12008 VisitOMPClauseWithPreInit(C); 12009 C->setCondition(Record.readSubExpr()); 12010 C->setLParenLoc(Record.readSourceLocation()); 12011 } 12012 12013 void OMPClauseReader::VisitOMPNumThreadsClause(OMPNumThreadsClause *C) { 12014 VisitOMPClauseWithPreInit(C); 12015 C->setNumThreads(Record.readSubExpr()); 12016 C->setLParenLoc(Record.readSourceLocation()); 12017 } 12018 12019 void OMPClauseReader::VisitOMPSafelenClause(OMPSafelenClause *C) { 12020 C->setSafelen(Record.readSubExpr()); 12021 C->setLParenLoc(Record.readSourceLocation()); 12022 } 12023 12024 void OMPClauseReader::VisitOMPSimdlenClause(OMPSimdlenClause *C) { 12025 C->setSimdlen(Record.readSubExpr()); 12026 C->setLParenLoc(Record.readSourceLocation()); 12027 } 12028 12029 void OMPClauseReader::VisitOMPSizesClause(OMPSizesClause *C) { 12030 for (Expr *&E : C->getSizesRefs()) 12031 E = Record.readSubExpr(); 12032 C->setLParenLoc(Record.readSourceLocation()); 12033 } 12034 12035 void OMPClauseReader::VisitOMPFullClause(OMPFullClause *C) {} 12036 12037 void OMPClauseReader::VisitOMPPartialClause(OMPPartialClause *C) { 12038 C->setFactor(Record.readSubExpr()); 12039 C->setLParenLoc(Record.readSourceLocation()); 12040 } 12041 12042 void OMPClauseReader::VisitOMPAllocatorClause(OMPAllocatorClause *C) { 12043 C->setAllocator(Record.readExpr()); 12044 C->setLParenLoc(Record.readSourceLocation()); 12045 } 12046 12047 void OMPClauseReader::VisitOMPCollapseClause(OMPCollapseClause *C) { 12048 C->setNumForLoops(Record.readSubExpr()); 12049 C->setLParenLoc(Record.readSourceLocation()); 12050 } 12051 12052 void OMPClauseReader::VisitOMPDefaultClause(OMPDefaultClause *C) { 12053 C->setDefaultKind(static_cast<llvm::omp::DefaultKind>(Record.readInt())); 12054 C->setLParenLoc(Record.readSourceLocation()); 12055 C->setDefaultKindKwLoc(Record.readSourceLocation()); 12056 } 12057 12058 void OMPClauseReader::VisitOMPProcBindClause(OMPProcBindClause *C) { 12059 C->setProcBindKind(static_cast<llvm::omp::ProcBindKind>(Record.readInt())); 12060 C->setLParenLoc(Record.readSourceLocation()); 12061 C->setProcBindKindKwLoc(Record.readSourceLocation()); 12062 } 12063 12064 void OMPClauseReader::VisitOMPScheduleClause(OMPScheduleClause *C) { 12065 VisitOMPClauseWithPreInit(C); 12066 C->setScheduleKind( 12067 static_cast<OpenMPScheduleClauseKind>(Record.readInt())); 12068 C->setFirstScheduleModifier( 12069 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12070 C->setSecondScheduleModifier( 12071 static_cast<OpenMPScheduleClauseModifier>(Record.readInt())); 12072 C->setChunkSize(Record.readSubExpr()); 12073 C->setLParenLoc(Record.readSourceLocation()); 12074 C->setFirstScheduleModifierLoc(Record.readSourceLocation()); 12075 C->setSecondScheduleModifierLoc(Record.readSourceLocation()); 12076 C->setScheduleKindLoc(Record.readSourceLocation()); 12077 C->setCommaLoc(Record.readSourceLocation()); 12078 } 12079 12080 void OMPClauseReader::VisitOMPOrderedClause(OMPOrderedClause *C) { 12081 C->setNumForLoops(Record.readSubExpr()); 12082 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12083 C->setLoopNumIterations(I, Record.readSubExpr()); 12084 for (unsigned I = 0, E = C->NumberOfLoops; I < E; ++I) 12085 C->setLoopCounter(I, Record.readSubExpr()); 12086 C->setLParenLoc(Record.readSourceLocation()); 12087 } 12088 12089 void OMPClauseReader::VisitOMPDetachClause(OMPDetachClause *C) { 12090 C->setEventHandler(Record.readSubExpr()); 12091 C->setLParenLoc(Record.readSourceLocation()); 12092 } 12093 12094 void OMPClauseReader::VisitOMPNowaitClause(OMPNowaitClause *) {} 12095 12096 void OMPClauseReader::VisitOMPUntiedClause(OMPUntiedClause *) {} 12097 12098 void OMPClauseReader::VisitOMPMergeableClause(OMPMergeableClause *) {} 12099 12100 void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {} 12101 12102 void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {} 12103 12104 void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) { 12105 if (C->isExtended()) { 12106 C->setLParenLoc(Record.readSourceLocation()); 12107 C->setArgumentLoc(Record.readSourceLocation()); 12108 C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>()); 12109 } 12110 } 12111 12112 void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {} 12113 12114 void OMPClauseReader::VisitOMPSeqCstClause(OMPSeqCstClause *) {} 12115 12116 void OMPClauseReader::VisitOMPAcqRelClause(OMPAcqRelClause *) {} 12117 12118 void OMPClauseReader::VisitOMPAcquireClause(OMPAcquireClause *) {} 12119 12120 void OMPClauseReader::VisitOMPReleaseClause(OMPReleaseClause *) {} 12121 12122 void OMPClauseReader::VisitOMPRelaxedClause(OMPRelaxedClause *) {} 12123 12124 void OMPClauseReader::VisitOMPThreadsClause(OMPThreadsClause *) {} 12125 12126 void OMPClauseReader::VisitOMPSIMDClause(OMPSIMDClause *) {} 12127 12128 void OMPClauseReader::VisitOMPNogroupClause(OMPNogroupClause *) {} 12129 12130 void OMPClauseReader::VisitOMPInitClause(OMPInitClause *C) { 12131 unsigned NumVars = C->varlist_size(); 12132 SmallVector<Expr *, 16> Vars; 12133 Vars.reserve(NumVars); 12134 for (unsigned I = 0; I != NumVars; ++I) 12135 Vars.push_back(Record.readSubExpr()); 12136 C->setVarRefs(Vars); 12137 C->setIsTarget(Record.readBool()); 12138 C->setIsTargetSync(Record.readBool()); 12139 C->setLParenLoc(Record.readSourceLocation()); 12140 C->setVarLoc(Record.readSourceLocation()); 12141 } 12142 12143 void OMPClauseReader::VisitOMPUseClause(OMPUseClause *C) { 12144 C->setInteropVar(Record.readSubExpr()); 12145 C->setLParenLoc(Record.readSourceLocation()); 12146 C->setVarLoc(Record.readSourceLocation()); 12147 } 12148 12149 void OMPClauseReader::VisitOMPDestroyClause(OMPDestroyClause *C) { 12150 C->setInteropVar(Record.readSubExpr()); 12151 C->setLParenLoc(Record.readSourceLocation()); 12152 C->setVarLoc(Record.readSourceLocation()); 12153 } 12154 12155 void OMPClauseReader::VisitOMPNovariantsClause(OMPNovariantsClause *C) { 12156 VisitOMPClauseWithPreInit(C); 12157 C->setCondition(Record.readSubExpr()); 12158 C->setLParenLoc(Record.readSourceLocation()); 12159 } 12160 12161 void OMPClauseReader::VisitOMPNocontextClause(OMPNocontextClause *C) { 12162 VisitOMPClauseWithPreInit(C); 12163 C->setCondition(Record.readSubExpr()); 12164 C->setLParenLoc(Record.readSourceLocation()); 12165 } 12166 12167 void OMPClauseReader::VisitOMPUnifiedAddressClause(OMPUnifiedAddressClause *) {} 12168 12169 void OMPClauseReader::VisitOMPUnifiedSharedMemoryClause( 12170 OMPUnifiedSharedMemoryClause *) {} 12171 12172 void OMPClauseReader::VisitOMPReverseOffloadClause(OMPReverseOffloadClause *) {} 12173 12174 void 12175 OMPClauseReader::VisitOMPDynamicAllocatorsClause(OMPDynamicAllocatorsClause *) { 12176 } 12177 12178 void OMPClauseReader::VisitOMPAtomicDefaultMemOrderClause( 12179 OMPAtomicDefaultMemOrderClause *C) { 12180 C->setAtomicDefaultMemOrderKind( 12181 static_cast<OpenMPAtomicDefaultMemOrderClauseKind>(Record.readInt())); 12182 C->setLParenLoc(Record.readSourceLocation()); 12183 C->setAtomicDefaultMemOrderKindKwLoc(Record.readSourceLocation()); 12184 } 12185 12186 void OMPClauseReader::VisitOMPPrivateClause(OMPPrivateClause *C) { 12187 C->setLParenLoc(Record.readSourceLocation()); 12188 unsigned NumVars = C->varlist_size(); 12189 SmallVector<Expr *, 16> Vars; 12190 Vars.reserve(NumVars); 12191 for (unsigned i = 0; i != NumVars; ++i) 12192 Vars.push_back(Record.readSubExpr()); 12193 C->setVarRefs(Vars); 12194 Vars.clear(); 12195 for (unsigned i = 0; i != NumVars; ++i) 12196 Vars.push_back(Record.readSubExpr()); 12197 C->setPrivateCopies(Vars); 12198 } 12199 12200 void OMPClauseReader::VisitOMPFirstprivateClause(OMPFirstprivateClause *C) { 12201 VisitOMPClauseWithPreInit(C); 12202 C->setLParenLoc(Record.readSourceLocation()); 12203 unsigned NumVars = C->varlist_size(); 12204 SmallVector<Expr *, 16> Vars; 12205 Vars.reserve(NumVars); 12206 for (unsigned i = 0; i != NumVars; ++i) 12207 Vars.push_back(Record.readSubExpr()); 12208 C->setVarRefs(Vars); 12209 Vars.clear(); 12210 for (unsigned i = 0; i != NumVars; ++i) 12211 Vars.push_back(Record.readSubExpr()); 12212 C->setPrivateCopies(Vars); 12213 Vars.clear(); 12214 for (unsigned i = 0; i != NumVars; ++i) 12215 Vars.push_back(Record.readSubExpr()); 12216 C->setInits(Vars); 12217 } 12218 12219 void OMPClauseReader::VisitOMPLastprivateClause(OMPLastprivateClause *C) { 12220 VisitOMPClauseWithPostUpdate(C); 12221 C->setLParenLoc(Record.readSourceLocation()); 12222 C->setKind(Record.readEnum<OpenMPLastprivateModifier>()); 12223 C->setKindLoc(Record.readSourceLocation()); 12224 C->setColonLoc(Record.readSourceLocation()); 12225 unsigned NumVars = C->varlist_size(); 12226 SmallVector<Expr *, 16> Vars; 12227 Vars.reserve(NumVars); 12228 for (unsigned i = 0; i != NumVars; ++i) 12229 Vars.push_back(Record.readSubExpr()); 12230 C->setVarRefs(Vars); 12231 Vars.clear(); 12232 for (unsigned i = 0; i != NumVars; ++i) 12233 Vars.push_back(Record.readSubExpr()); 12234 C->setPrivateCopies(Vars); 12235 Vars.clear(); 12236 for (unsigned i = 0; i != NumVars; ++i) 12237 Vars.push_back(Record.readSubExpr()); 12238 C->setSourceExprs(Vars); 12239 Vars.clear(); 12240 for (unsigned i = 0; i != NumVars; ++i) 12241 Vars.push_back(Record.readSubExpr()); 12242 C->setDestinationExprs(Vars); 12243 Vars.clear(); 12244 for (unsigned i = 0; i != NumVars; ++i) 12245 Vars.push_back(Record.readSubExpr()); 12246 C->setAssignmentOps(Vars); 12247 } 12248 12249 void OMPClauseReader::VisitOMPSharedClause(OMPSharedClause *C) { 12250 C->setLParenLoc(Record.readSourceLocation()); 12251 unsigned NumVars = C->varlist_size(); 12252 SmallVector<Expr *, 16> Vars; 12253 Vars.reserve(NumVars); 12254 for (unsigned i = 0; i != NumVars; ++i) 12255 Vars.push_back(Record.readSubExpr()); 12256 C->setVarRefs(Vars); 12257 } 12258 12259 void OMPClauseReader::VisitOMPReductionClause(OMPReductionClause *C) { 12260 VisitOMPClauseWithPostUpdate(C); 12261 C->setLParenLoc(Record.readSourceLocation()); 12262 C->setModifierLoc(Record.readSourceLocation()); 12263 C->setColonLoc(Record.readSourceLocation()); 12264 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12265 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12266 C->setQualifierLoc(NNSL); 12267 C->setNameInfo(DNI); 12268 12269 unsigned NumVars = C->varlist_size(); 12270 SmallVector<Expr *, 16> Vars; 12271 Vars.reserve(NumVars); 12272 for (unsigned i = 0; i != NumVars; ++i) 12273 Vars.push_back(Record.readSubExpr()); 12274 C->setVarRefs(Vars); 12275 Vars.clear(); 12276 for (unsigned i = 0; i != NumVars; ++i) 12277 Vars.push_back(Record.readSubExpr()); 12278 C->setPrivates(Vars); 12279 Vars.clear(); 12280 for (unsigned i = 0; i != NumVars; ++i) 12281 Vars.push_back(Record.readSubExpr()); 12282 C->setLHSExprs(Vars); 12283 Vars.clear(); 12284 for (unsigned i = 0; i != NumVars; ++i) 12285 Vars.push_back(Record.readSubExpr()); 12286 C->setRHSExprs(Vars); 12287 Vars.clear(); 12288 for (unsigned i = 0; i != NumVars; ++i) 12289 Vars.push_back(Record.readSubExpr()); 12290 C->setReductionOps(Vars); 12291 if (C->getModifier() == OMPC_REDUCTION_inscan) { 12292 Vars.clear(); 12293 for (unsigned i = 0; i != NumVars; ++i) 12294 Vars.push_back(Record.readSubExpr()); 12295 C->setInscanCopyOps(Vars); 12296 Vars.clear(); 12297 for (unsigned i = 0; i != NumVars; ++i) 12298 Vars.push_back(Record.readSubExpr()); 12299 C->setInscanCopyArrayTemps(Vars); 12300 Vars.clear(); 12301 for (unsigned i = 0; i != NumVars; ++i) 12302 Vars.push_back(Record.readSubExpr()); 12303 C->setInscanCopyArrayElems(Vars); 12304 } 12305 } 12306 12307 void OMPClauseReader::VisitOMPTaskReductionClause(OMPTaskReductionClause *C) { 12308 VisitOMPClauseWithPostUpdate(C); 12309 C->setLParenLoc(Record.readSourceLocation()); 12310 C->setColonLoc(Record.readSourceLocation()); 12311 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12312 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12313 C->setQualifierLoc(NNSL); 12314 C->setNameInfo(DNI); 12315 12316 unsigned NumVars = C->varlist_size(); 12317 SmallVector<Expr *, 16> Vars; 12318 Vars.reserve(NumVars); 12319 for (unsigned I = 0; I != NumVars; ++I) 12320 Vars.push_back(Record.readSubExpr()); 12321 C->setVarRefs(Vars); 12322 Vars.clear(); 12323 for (unsigned I = 0; I != NumVars; ++I) 12324 Vars.push_back(Record.readSubExpr()); 12325 C->setPrivates(Vars); 12326 Vars.clear(); 12327 for (unsigned I = 0; I != NumVars; ++I) 12328 Vars.push_back(Record.readSubExpr()); 12329 C->setLHSExprs(Vars); 12330 Vars.clear(); 12331 for (unsigned I = 0; I != NumVars; ++I) 12332 Vars.push_back(Record.readSubExpr()); 12333 C->setRHSExprs(Vars); 12334 Vars.clear(); 12335 for (unsigned I = 0; I != NumVars; ++I) 12336 Vars.push_back(Record.readSubExpr()); 12337 C->setReductionOps(Vars); 12338 } 12339 12340 void OMPClauseReader::VisitOMPInReductionClause(OMPInReductionClause *C) { 12341 VisitOMPClauseWithPostUpdate(C); 12342 C->setLParenLoc(Record.readSourceLocation()); 12343 C->setColonLoc(Record.readSourceLocation()); 12344 NestedNameSpecifierLoc NNSL = Record.readNestedNameSpecifierLoc(); 12345 DeclarationNameInfo DNI = Record.readDeclarationNameInfo(); 12346 C->setQualifierLoc(NNSL); 12347 C->setNameInfo(DNI); 12348 12349 unsigned NumVars = C->varlist_size(); 12350 SmallVector<Expr *, 16> Vars; 12351 Vars.reserve(NumVars); 12352 for (unsigned I = 0; I != NumVars; ++I) 12353 Vars.push_back(Record.readSubExpr()); 12354 C->setVarRefs(Vars); 12355 Vars.clear(); 12356 for (unsigned I = 0; I != NumVars; ++I) 12357 Vars.push_back(Record.readSubExpr()); 12358 C->setPrivates(Vars); 12359 Vars.clear(); 12360 for (unsigned I = 0; I != NumVars; ++I) 12361 Vars.push_back(Record.readSubExpr()); 12362 C->setLHSExprs(Vars); 12363 Vars.clear(); 12364 for (unsigned I = 0; I != NumVars; ++I) 12365 Vars.push_back(Record.readSubExpr()); 12366 C->setRHSExprs(Vars); 12367 Vars.clear(); 12368 for (unsigned I = 0; I != NumVars; ++I) 12369 Vars.push_back(Record.readSubExpr()); 12370 C->setReductionOps(Vars); 12371 Vars.clear(); 12372 for (unsigned I = 0; I != NumVars; ++I) 12373 Vars.push_back(Record.readSubExpr()); 12374 C->setTaskgroupDescriptors(Vars); 12375 } 12376 12377 void OMPClauseReader::VisitOMPLinearClause(OMPLinearClause *C) { 12378 VisitOMPClauseWithPostUpdate(C); 12379 C->setLParenLoc(Record.readSourceLocation()); 12380 C->setColonLoc(Record.readSourceLocation()); 12381 C->setModifier(static_cast<OpenMPLinearClauseKind>(Record.readInt())); 12382 C->setModifierLoc(Record.readSourceLocation()); 12383 unsigned NumVars = C->varlist_size(); 12384 SmallVector<Expr *, 16> Vars; 12385 Vars.reserve(NumVars); 12386 for (unsigned i = 0; i != NumVars; ++i) 12387 Vars.push_back(Record.readSubExpr()); 12388 C->setVarRefs(Vars); 12389 Vars.clear(); 12390 for (unsigned i = 0; i != NumVars; ++i) 12391 Vars.push_back(Record.readSubExpr()); 12392 C->setPrivates(Vars); 12393 Vars.clear(); 12394 for (unsigned i = 0; i != NumVars; ++i) 12395 Vars.push_back(Record.readSubExpr()); 12396 C->setInits(Vars); 12397 Vars.clear(); 12398 for (unsigned i = 0; i != NumVars; ++i) 12399 Vars.push_back(Record.readSubExpr()); 12400 C->setUpdates(Vars); 12401 Vars.clear(); 12402 for (unsigned i = 0; i != NumVars; ++i) 12403 Vars.push_back(Record.readSubExpr()); 12404 C->setFinals(Vars); 12405 C->setStep(Record.readSubExpr()); 12406 C->setCalcStep(Record.readSubExpr()); 12407 Vars.clear(); 12408 for (unsigned I = 0; I != NumVars + 1; ++I) 12409 Vars.push_back(Record.readSubExpr()); 12410 C->setUsedExprs(Vars); 12411 } 12412 12413 void OMPClauseReader::VisitOMPAlignedClause(OMPAlignedClause *C) { 12414 C->setLParenLoc(Record.readSourceLocation()); 12415 C->setColonLoc(Record.readSourceLocation()); 12416 unsigned NumVars = C->varlist_size(); 12417 SmallVector<Expr *, 16> Vars; 12418 Vars.reserve(NumVars); 12419 for (unsigned i = 0; i != NumVars; ++i) 12420 Vars.push_back(Record.readSubExpr()); 12421 C->setVarRefs(Vars); 12422 C->setAlignment(Record.readSubExpr()); 12423 } 12424 12425 void OMPClauseReader::VisitOMPCopyinClause(OMPCopyinClause *C) { 12426 C->setLParenLoc(Record.readSourceLocation()); 12427 unsigned NumVars = C->varlist_size(); 12428 SmallVector<Expr *, 16> Exprs; 12429 Exprs.reserve(NumVars); 12430 for (unsigned i = 0; i != NumVars; ++i) 12431 Exprs.push_back(Record.readSubExpr()); 12432 C->setVarRefs(Exprs); 12433 Exprs.clear(); 12434 for (unsigned i = 0; i != NumVars; ++i) 12435 Exprs.push_back(Record.readSubExpr()); 12436 C->setSourceExprs(Exprs); 12437 Exprs.clear(); 12438 for (unsigned i = 0; i != NumVars; ++i) 12439 Exprs.push_back(Record.readSubExpr()); 12440 C->setDestinationExprs(Exprs); 12441 Exprs.clear(); 12442 for (unsigned i = 0; i != NumVars; ++i) 12443 Exprs.push_back(Record.readSubExpr()); 12444 C->setAssignmentOps(Exprs); 12445 } 12446 12447 void OMPClauseReader::VisitOMPCopyprivateClause(OMPCopyprivateClause *C) { 12448 C->setLParenLoc(Record.readSourceLocation()); 12449 unsigned NumVars = C->varlist_size(); 12450 SmallVector<Expr *, 16> Exprs; 12451 Exprs.reserve(NumVars); 12452 for (unsigned i = 0; i != NumVars; ++i) 12453 Exprs.push_back(Record.readSubExpr()); 12454 C->setVarRefs(Exprs); 12455 Exprs.clear(); 12456 for (unsigned i = 0; i != NumVars; ++i) 12457 Exprs.push_back(Record.readSubExpr()); 12458 C->setSourceExprs(Exprs); 12459 Exprs.clear(); 12460 for (unsigned i = 0; i != NumVars; ++i) 12461 Exprs.push_back(Record.readSubExpr()); 12462 C->setDestinationExprs(Exprs); 12463 Exprs.clear(); 12464 for (unsigned i = 0; i != NumVars; ++i) 12465 Exprs.push_back(Record.readSubExpr()); 12466 C->setAssignmentOps(Exprs); 12467 } 12468 12469 void OMPClauseReader::VisitOMPFlushClause(OMPFlushClause *C) { 12470 C->setLParenLoc(Record.readSourceLocation()); 12471 unsigned NumVars = C->varlist_size(); 12472 SmallVector<Expr *, 16> Vars; 12473 Vars.reserve(NumVars); 12474 for (unsigned i = 0; i != NumVars; ++i) 12475 Vars.push_back(Record.readSubExpr()); 12476 C->setVarRefs(Vars); 12477 } 12478 12479 void OMPClauseReader::VisitOMPDepobjClause(OMPDepobjClause *C) { 12480 C->setDepobj(Record.readSubExpr()); 12481 C->setLParenLoc(Record.readSourceLocation()); 12482 } 12483 12484 void OMPClauseReader::VisitOMPDependClause(OMPDependClause *C) { 12485 C->setLParenLoc(Record.readSourceLocation()); 12486 C->setModifier(Record.readSubExpr()); 12487 C->setDependencyKind( 12488 static_cast<OpenMPDependClauseKind>(Record.readInt())); 12489 C->setDependencyLoc(Record.readSourceLocation()); 12490 C->setColonLoc(Record.readSourceLocation()); 12491 unsigned NumVars = C->varlist_size(); 12492 SmallVector<Expr *, 16> Vars; 12493 Vars.reserve(NumVars); 12494 for (unsigned I = 0; I != NumVars; ++I) 12495 Vars.push_back(Record.readSubExpr()); 12496 C->setVarRefs(Vars); 12497 for (unsigned I = 0, E = C->getNumLoops(); I < E; ++I) 12498 C->setLoopData(I, Record.readSubExpr()); 12499 } 12500 12501 void OMPClauseReader::VisitOMPDeviceClause(OMPDeviceClause *C) { 12502 VisitOMPClauseWithPreInit(C); 12503 C->setModifier(Record.readEnum<OpenMPDeviceClauseModifier>()); 12504 C->setDevice(Record.readSubExpr()); 12505 C->setModifierLoc(Record.readSourceLocation()); 12506 C->setLParenLoc(Record.readSourceLocation()); 12507 } 12508 12509 void OMPClauseReader::VisitOMPMapClause(OMPMapClause *C) { 12510 C->setLParenLoc(Record.readSourceLocation()); 12511 for (unsigned I = 0; I < NumberOfOMPMapClauseModifiers; ++I) { 12512 C->setMapTypeModifier( 12513 I, static_cast<OpenMPMapModifierKind>(Record.readInt())); 12514 C->setMapTypeModifierLoc(I, Record.readSourceLocation()); 12515 } 12516 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12517 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12518 C->setMapType( 12519 static_cast<OpenMPMapClauseKind>(Record.readInt())); 12520 C->setMapLoc(Record.readSourceLocation()); 12521 C->setColonLoc(Record.readSourceLocation()); 12522 auto NumVars = C->varlist_size(); 12523 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12524 auto TotalLists = C->getTotalComponentListNum(); 12525 auto TotalComponents = C->getTotalComponentsNum(); 12526 12527 SmallVector<Expr *, 16> Vars; 12528 Vars.reserve(NumVars); 12529 for (unsigned i = 0; i != NumVars; ++i) 12530 Vars.push_back(Record.readExpr()); 12531 C->setVarRefs(Vars); 12532 12533 SmallVector<Expr *, 16> UDMappers; 12534 UDMappers.reserve(NumVars); 12535 for (unsigned I = 0; I < NumVars; ++I) 12536 UDMappers.push_back(Record.readExpr()); 12537 C->setUDMapperRefs(UDMappers); 12538 12539 SmallVector<ValueDecl *, 16> Decls; 12540 Decls.reserve(UniqueDecls); 12541 for (unsigned i = 0; i < UniqueDecls; ++i) 12542 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12543 C->setUniqueDecls(Decls); 12544 12545 SmallVector<unsigned, 16> ListsPerDecl; 12546 ListsPerDecl.reserve(UniqueDecls); 12547 for (unsigned i = 0; i < UniqueDecls; ++i) 12548 ListsPerDecl.push_back(Record.readInt()); 12549 C->setDeclNumLists(ListsPerDecl); 12550 12551 SmallVector<unsigned, 32> ListSizes; 12552 ListSizes.reserve(TotalLists); 12553 for (unsigned i = 0; i < TotalLists; ++i) 12554 ListSizes.push_back(Record.readInt()); 12555 C->setComponentListSizes(ListSizes); 12556 12557 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12558 Components.reserve(TotalComponents); 12559 for (unsigned i = 0; i < TotalComponents; ++i) { 12560 Expr *AssociatedExprPr = Record.readExpr(); 12561 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12562 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12563 /*IsNonContiguous=*/false); 12564 } 12565 C->setComponents(Components, ListSizes); 12566 } 12567 12568 void OMPClauseReader::VisitOMPAllocateClause(OMPAllocateClause *C) { 12569 C->setLParenLoc(Record.readSourceLocation()); 12570 C->setColonLoc(Record.readSourceLocation()); 12571 C->setAllocator(Record.readSubExpr()); 12572 unsigned NumVars = C->varlist_size(); 12573 SmallVector<Expr *, 16> Vars; 12574 Vars.reserve(NumVars); 12575 for (unsigned i = 0; i != NumVars; ++i) 12576 Vars.push_back(Record.readSubExpr()); 12577 C->setVarRefs(Vars); 12578 } 12579 12580 void OMPClauseReader::VisitOMPNumTeamsClause(OMPNumTeamsClause *C) { 12581 VisitOMPClauseWithPreInit(C); 12582 C->setNumTeams(Record.readSubExpr()); 12583 C->setLParenLoc(Record.readSourceLocation()); 12584 } 12585 12586 void OMPClauseReader::VisitOMPThreadLimitClause(OMPThreadLimitClause *C) { 12587 VisitOMPClauseWithPreInit(C); 12588 C->setThreadLimit(Record.readSubExpr()); 12589 C->setLParenLoc(Record.readSourceLocation()); 12590 } 12591 12592 void OMPClauseReader::VisitOMPPriorityClause(OMPPriorityClause *C) { 12593 VisitOMPClauseWithPreInit(C); 12594 C->setPriority(Record.readSubExpr()); 12595 C->setLParenLoc(Record.readSourceLocation()); 12596 } 12597 12598 void OMPClauseReader::VisitOMPGrainsizeClause(OMPGrainsizeClause *C) { 12599 VisitOMPClauseWithPreInit(C); 12600 C->setGrainsize(Record.readSubExpr()); 12601 C->setLParenLoc(Record.readSourceLocation()); 12602 } 12603 12604 void OMPClauseReader::VisitOMPNumTasksClause(OMPNumTasksClause *C) { 12605 VisitOMPClauseWithPreInit(C); 12606 C->setNumTasks(Record.readSubExpr()); 12607 C->setLParenLoc(Record.readSourceLocation()); 12608 } 12609 12610 void OMPClauseReader::VisitOMPHintClause(OMPHintClause *C) { 12611 C->setHint(Record.readSubExpr()); 12612 C->setLParenLoc(Record.readSourceLocation()); 12613 } 12614 12615 void OMPClauseReader::VisitOMPDistScheduleClause(OMPDistScheduleClause *C) { 12616 VisitOMPClauseWithPreInit(C); 12617 C->setDistScheduleKind( 12618 static_cast<OpenMPDistScheduleClauseKind>(Record.readInt())); 12619 C->setChunkSize(Record.readSubExpr()); 12620 C->setLParenLoc(Record.readSourceLocation()); 12621 C->setDistScheduleKindLoc(Record.readSourceLocation()); 12622 C->setCommaLoc(Record.readSourceLocation()); 12623 } 12624 12625 void OMPClauseReader::VisitOMPDefaultmapClause(OMPDefaultmapClause *C) { 12626 C->setDefaultmapKind( 12627 static_cast<OpenMPDefaultmapClauseKind>(Record.readInt())); 12628 C->setDefaultmapModifier( 12629 static_cast<OpenMPDefaultmapClauseModifier>(Record.readInt())); 12630 C->setLParenLoc(Record.readSourceLocation()); 12631 C->setDefaultmapModifierLoc(Record.readSourceLocation()); 12632 C->setDefaultmapKindLoc(Record.readSourceLocation()); 12633 } 12634 12635 void OMPClauseReader::VisitOMPToClause(OMPToClause *C) { 12636 C->setLParenLoc(Record.readSourceLocation()); 12637 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12638 C->setMotionModifier( 12639 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12640 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12641 } 12642 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12643 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12644 C->setColonLoc(Record.readSourceLocation()); 12645 auto NumVars = C->varlist_size(); 12646 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12647 auto TotalLists = C->getTotalComponentListNum(); 12648 auto TotalComponents = C->getTotalComponentsNum(); 12649 12650 SmallVector<Expr *, 16> Vars; 12651 Vars.reserve(NumVars); 12652 for (unsigned i = 0; i != NumVars; ++i) 12653 Vars.push_back(Record.readSubExpr()); 12654 C->setVarRefs(Vars); 12655 12656 SmallVector<Expr *, 16> UDMappers; 12657 UDMappers.reserve(NumVars); 12658 for (unsigned I = 0; I < NumVars; ++I) 12659 UDMappers.push_back(Record.readSubExpr()); 12660 C->setUDMapperRefs(UDMappers); 12661 12662 SmallVector<ValueDecl *, 16> Decls; 12663 Decls.reserve(UniqueDecls); 12664 for (unsigned i = 0; i < UniqueDecls; ++i) 12665 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12666 C->setUniqueDecls(Decls); 12667 12668 SmallVector<unsigned, 16> ListsPerDecl; 12669 ListsPerDecl.reserve(UniqueDecls); 12670 for (unsigned i = 0; i < UniqueDecls; ++i) 12671 ListsPerDecl.push_back(Record.readInt()); 12672 C->setDeclNumLists(ListsPerDecl); 12673 12674 SmallVector<unsigned, 32> ListSizes; 12675 ListSizes.reserve(TotalLists); 12676 for (unsigned i = 0; i < TotalLists; ++i) 12677 ListSizes.push_back(Record.readInt()); 12678 C->setComponentListSizes(ListSizes); 12679 12680 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12681 Components.reserve(TotalComponents); 12682 for (unsigned i = 0; i < TotalComponents; ++i) { 12683 Expr *AssociatedExprPr = Record.readSubExpr(); 12684 bool IsNonContiguous = Record.readBool(); 12685 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12686 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12687 } 12688 C->setComponents(Components, ListSizes); 12689 } 12690 12691 void OMPClauseReader::VisitOMPFromClause(OMPFromClause *C) { 12692 C->setLParenLoc(Record.readSourceLocation()); 12693 for (unsigned I = 0; I < NumberOfOMPMotionModifiers; ++I) { 12694 C->setMotionModifier( 12695 I, static_cast<OpenMPMotionModifierKind>(Record.readInt())); 12696 C->setMotionModifierLoc(I, Record.readSourceLocation()); 12697 } 12698 C->setMapperQualifierLoc(Record.readNestedNameSpecifierLoc()); 12699 C->setMapperIdInfo(Record.readDeclarationNameInfo()); 12700 C->setColonLoc(Record.readSourceLocation()); 12701 auto NumVars = C->varlist_size(); 12702 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12703 auto TotalLists = C->getTotalComponentListNum(); 12704 auto TotalComponents = C->getTotalComponentsNum(); 12705 12706 SmallVector<Expr *, 16> Vars; 12707 Vars.reserve(NumVars); 12708 for (unsigned i = 0; i != NumVars; ++i) 12709 Vars.push_back(Record.readSubExpr()); 12710 C->setVarRefs(Vars); 12711 12712 SmallVector<Expr *, 16> UDMappers; 12713 UDMappers.reserve(NumVars); 12714 for (unsigned I = 0; I < NumVars; ++I) 12715 UDMappers.push_back(Record.readSubExpr()); 12716 C->setUDMapperRefs(UDMappers); 12717 12718 SmallVector<ValueDecl *, 16> Decls; 12719 Decls.reserve(UniqueDecls); 12720 for (unsigned i = 0; i < UniqueDecls; ++i) 12721 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12722 C->setUniqueDecls(Decls); 12723 12724 SmallVector<unsigned, 16> ListsPerDecl; 12725 ListsPerDecl.reserve(UniqueDecls); 12726 for (unsigned i = 0; i < UniqueDecls; ++i) 12727 ListsPerDecl.push_back(Record.readInt()); 12728 C->setDeclNumLists(ListsPerDecl); 12729 12730 SmallVector<unsigned, 32> ListSizes; 12731 ListSizes.reserve(TotalLists); 12732 for (unsigned i = 0; i < TotalLists; ++i) 12733 ListSizes.push_back(Record.readInt()); 12734 C->setComponentListSizes(ListSizes); 12735 12736 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12737 Components.reserve(TotalComponents); 12738 for (unsigned i = 0; i < TotalComponents; ++i) { 12739 Expr *AssociatedExprPr = Record.readSubExpr(); 12740 bool IsNonContiguous = Record.readBool(); 12741 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12742 Components.emplace_back(AssociatedExprPr, AssociatedDecl, IsNonContiguous); 12743 } 12744 C->setComponents(Components, ListSizes); 12745 } 12746 12747 void OMPClauseReader::VisitOMPUseDevicePtrClause(OMPUseDevicePtrClause *C) { 12748 C->setLParenLoc(Record.readSourceLocation()); 12749 auto NumVars = C->varlist_size(); 12750 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12751 auto TotalLists = C->getTotalComponentListNum(); 12752 auto TotalComponents = C->getTotalComponentsNum(); 12753 12754 SmallVector<Expr *, 16> Vars; 12755 Vars.reserve(NumVars); 12756 for (unsigned i = 0; i != NumVars; ++i) 12757 Vars.push_back(Record.readSubExpr()); 12758 C->setVarRefs(Vars); 12759 Vars.clear(); 12760 for (unsigned i = 0; i != NumVars; ++i) 12761 Vars.push_back(Record.readSubExpr()); 12762 C->setPrivateCopies(Vars); 12763 Vars.clear(); 12764 for (unsigned i = 0; i != NumVars; ++i) 12765 Vars.push_back(Record.readSubExpr()); 12766 C->setInits(Vars); 12767 12768 SmallVector<ValueDecl *, 16> Decls; 12769 Decls.reserve(UniqueDecls); 12770 for (unsigned i = 0; i < UniqueDecls; ++i) 12771 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12772 C->setUniqueDecls(Decls); 12773 12774 SmallVector<unsigned, 16> ListsPerDecl; 12775 ListsPerDecl.reserve(UniqueDecls); 12776 for (unsigned i = 0; i < UniqueDecls; ++i) 12777 ListsPerDecl.push_back(Record.readInt()); 12778 C->setDeclNumLists(ListsPerDecl); 12779 12780 SmallVector<unsigned, 32> ListSizes; 12781 ListSizes.reserve(TotalLists); 12782 for (unsigned i = 0; i < TotalLists; ++i) 12783 ListSizes.push_back(Record.readInt()); 12784 C->setComponentListSizes(ListSizes); 12785 12786 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12787 Components.reserve(TotalComponents); 12788 for (unsigned i = 0; i < TotalComponents; ++i) { 12789 auto *AssociatedExprPr = Record.readSubExpr(); 12790 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12791 Components.emplace_back(AssociatedExprPr, AssociatedDecl, 12792 /*IsNonContiguous=*/false); 12793 } 12794 C->setComponents(Components, ListSizes); 12795 } 12796 12797 void OMPClauseReader::VisitOMPUseDeviceAddrClause(OMPUseDeviceAddrClause *C) { 12798 C->setLParenLoc(Record.readSourceLocation()); 12799 auto NumVars = C->varlist_size(); 12800 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12801 auto TotalLists = C->getTotalComponentListNum(); 12802 auto TotalComponents = C->getTotalComponentsNum(); 12803 12804 SmallVector<Expr *, 16> Vars; 12805 Vars.reserve(NumVars); 12806 for (unsigned i = 0; i != NumVars; ++i) 12807 Vars.push_back(Record.readSubExpr()); 12808 C->setVarRefs(Vars); 12809 12810 SmallVector<ValueDecl *, 16> Decls; 12811 Decls.reserve(UniqueDecls); 12812 for (unsigned i = 0; i < UniqueDecls; ++i) 12813 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12814 C->setUniqueDecls(Decls); 12815 12816 SmallVector<unsigned, 16> ListsPerDecl; 12817 ListsPerDecl.reserve(UniqueDecls); 12818 for (unsigned i = 0; i < UniqueDecls; ++i) 12819 ListsPerDecl.push_back(Record.readInt()); 12820 C->setDeclNumLists(ListsPerDecl); 12821 12822 SmallVector<unsigned, 32> ListSizes; 12823 ListSizes.reserve(TotalLists); 12824 for (unsigned i = 0; i < TotalLists; ++i) 12825 ListSizes.push_back(Record.readInt()); 12826 C->setComponentListSizes(ListSizes); 12827 12828 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12829 Components.reserve(TotalComponents); 12830 for (unsigned i = 0; i < TotalComponents; ++i) { 12831 Expr *AssociatedExpr = Record.readSubExpr(); 12832 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12833 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12834 /*IsNonContiguous*/ false); 12835 } 12836 C->setComponents(Components, ListSizes); 12837 } 12838 12839 void OMPClauseReader::VisitOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) { 12840 C->setLParenLoc(Record.readSourceLocation()); 12841 auto NumVars = C->varlist_size(); 12842 auto UniqueDecls = C->getUniqueDeclarationsNum(); 12843 auto TotalLists = C->getTotalComponentListNum(); 12844 auto TotalComponents = C->getTotalComponentsNum(); 12845 12846 SmallVector<Expr *, 16> Vars; 12847 Vars.reserve(NumVars); 12848 for (unsigned i = 0; i != NumVars; ++i) 12849 Vars.push_back(Record.readSubExpr()); 12850 C->setVarRefs(Vars); 12851 Vars.clear(); 12852 12853 SmallVector<ValueDecl *, 16> Decls; 12854 Decls.reserve(UniqueDecls); 12855 for (unsigned i = 0; i < UniqueDecls; ++i) 12856 Decls.push_back(Record.readDeclAs<ValueDecl>()); 12857 C->setUniqueDecls(Decls); 12858 12859 SmallVector<unsigned, 16> ListsPerDecl; 12860 ListsPerDecl.reserve(UniqueDecls); 12861 for (unsigned i = 0; i < UniqueDecls; ++i) 12862 ListsPerDecl.push_back(Record.readInt()); 12863 C->setDeclNumLists(ListsPerDecl); 12864 12865 SmallVector<unsigned, 32> ListSizes; 12866 ListSizes.reserve(TotalLists); 12867 for (unsigned i = 0; i < TotalLists; ++i) 12868 ListSizes.push_back(Record.readInt()); 12869 C->setComponentListSizes(ListSizes); 12870 12871 SmallVector<OMPClauseMappableExprCommon::MappableComponent, 32> Components; 12872 Components.reserve(TotalComponents); 12873 for (unsigned i = 0; i < TotalComponents; ++i) { 12874 Expr *AssociatedExpr = Record.readSubExpr(); 12875 auto *AssociatedDecl = Record.readDeclAs<ValueDecl>(); 12876 Components.emplace_back(AssociatedExpr, AssociatedDecl, 12877 /*IsNonContiguous=*/false); 12878 } 12879 C->setComponents(Components, ListSizes); 12880 } 12881 12882 void OMPClauseReader::VisitOMPNontemporalClause(OMPNontemporalClause *C) { 12883 C->setLParenLoc(Record.readSourceLocation()); 12884 unsigned NumVars = C->varlist_size(); 12885 SmallVector<Expr *, 16> Vars; 12886 Vars.reserve(NumVars); 12887 for (unsigned i = 0; i != NumVars; ++i) 12888 Vars.push_back(Record.readSubExpr()); 12889 C->setVarRefs(Vars); 12890 Vars.clear(); 12891 Vars.reserve(NumVars); 12892 for (unsigned i = 0; i != NumVars; ++i) 12893 Vars.push_back(Record.readSubExpr()); 12894 C->setPrivateRefs(Vars); 12895 } 12896 12897 void OMPClauseReader::VisitOMPInclusiveClause(OMPInclusiveClause *C) { 12898 C->setLParenLoc(Record.readSourceLocation()); 12899 unsigned NumVars = C->varlist_size(); 12900 SmallVector<Expr *, 16> Vars; 12901 Vars.reserve(NumVars); 12902 for (unsigned i = 0; i != NumVars; ++i) 12903 Vars.push_back(Record.readSubExpr()); 12904 C->setVarRefs(Vars); 12905 } 12906 12907 void OMPClauseReader::VisitOMPExclusiveClause(OMPExclusiveClause *C) { 12908 C->setLParenLoc(Record.readSourceLocation()); 12909 unsigned NumVars = C->varlist_size(); 12910 SmallVector<Expr *, 16> Vars; 12911 Vars.reserve(NumVars); 12912 for (unsigned i = 0; i != NumVars; ++i) 12913 Vars.push_back(Record.readSubExpr()); 12914 C->setVarRefs(Vars); 12915 } 12916 12917 void OMPClauseReader::VisitOMPUsesAllocatorsClause(OMPUsesAllocatorsClause *C) { 12918 C->setLParenLoc(Record.readSourceLocation()); 12919 unsigned NumOfAllocators = C->getNumberOfAllocators(); 12920 SmallVector<OMPUsesAllocatorsClause::Data, 4> Data; 12921 Data.reserve(NumOfAllocators); 12922 for (unsigned I = 0; I != NumOfAllocators; ++I) { 12923 OMPUsesAllocatorsClause::Data &D = Data.emplace_back(); 12924 D.Allocator = Record.readSubExpr(); 12925 D.AllocatorTraits = Record.readSubExpr(); 12926 D.LParenLoc = Record.readSourceLocation(); 12927 D.RParenLoc = Record.readSourceLocation(); 12928 } 12929 C->setAllocatorsData(Data); 12930 } 12931 12932 void OMPClauseReader::VisitOMPAffinityClause(OMPAffinityClause *C) { 12933 C->setLParenLoc(Record.readSourceLocation()); 12934 C->setModifier(Record.readSubExpr()); 12935 C->setColonLoc(Record.readSourceLocation()); 12936 unsigned NumOfLocators = C->varlist_size(); 12937 SmallVector<Expr *, 4> Locators; 12938 Locators.reserve(NumOfLocators); 12939 for (unsigned I = 0; I != NumOfLocators; ++I) 12940 Locators.push_back(Record.readSubExpr()); 12941 C->setVarRefs(Locators); 12942 } 12943 12944 void OMPClauseReader::VisitOMPOrderClause(OMPOrderClause *C) { 12945 C->setKind(Record.readEnum<OpenMPOrderClauseKind>()); 12946 C->setLParenLoc(Record.readSourceLocation()); 12947 C->setKindKwLoc(Record.readSourceLocation()); 12948 } 12949 12950 void OMPClauseReader::VisitOMPFilterClause(OMPFilterClause *C) { 12951 VisitOMPClauseWithPreInit(C); 12952 C->setThreadID(Record.readSubExpr()); 12953 C->setLParenLoc(Record.readSourceLocation()); 12954 } 12955 12956 OMPTraitInfo *ASTRecordReader::readOMPTraitInfo() { 12957 OMPTraitInfo &TI = getContext().getNewOMPTraitInfo(); 12958 TI.Sets.resize(readUInt32()); 12959 for (auto &Set : TI.Sets) { 12960 Set.Kind = readEnum<llvm::omp::TraitSet>(); 12961 Set.Selectors.resize(readUInt32()); 12962 for (auto &Selector : Set.Selectors) { 12963 Selector.Kind = readEnum<llvm::omp::TraitSelector>(); 12964 Selector.ScoreOrCondition = nullptr; 12965 if (readBool()) 12966 Selector.ScoreOrCondition = readExprRef(); 12967 Selector.Properties.resize(readUInt32()); 12968 for (auto &Property : Selector.Properties) 12969 Property.Kind = readEnum<llvm::omp::TraitProperty>(); 12970 } 12971 } 12972 return &TI; 12973 } 12974 12975 void ASTRecordReader::readOMPChildren(OMPChildren *Data) { 12976 if (!Data) 12977 return; 12978 if (Reader->ReadingKind == ASTReader::Read_Stmt) { 12979 // Skip NumClauses, NumChildren and HasAssociatedStmt fields. 12980 skipInts(3); 12981 } 12982 SmallVector<OMPClause *, 4> Clauses(Data->getNumClauses()); 12983 for (unsigned I = 0, E = Data->getNumClauses(); I < E; ++I) 12984 Clauses[I] = readOMPClause(); 12985 Data->setClauses(Clauses); 12986 if (Data->hasAssociatedStmt()) 12987 Data->setAssociatedStmt(readStmt()); 12988 for (unsigned I = 0, E = Data->getNumChildren(); I < E; ++I) 12989 Data->getChildren()[I] = readStmt(); 12990 } 12991